2009-06-25 07:16:22 -07:00
|
|
|
|
/*
|
|
|
|
|
* VsqBPList.cs
|
|
|
|
|
* Copyright (c) 2008-2009 kbinani
|
|
|
|
|
*
|
|
|
|
|
* This file is part of Boare.Lib.Vsq.
|
|
|
|
|
*
|
|
|
|
|
* Boare.Lib.Vsq is free software; you can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the BSD License.
|
|
|
|
|
*
|
|
|
|
|
* Boare.Lib.Vsq is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
*/
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
|
|
namespace Boare.Lib.Vsq {
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// BPListのデータ部分を取り扱うためのクラス。
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Serializable]
|
|
|
|
|
public class VsqBPList : ICloneable {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
private SortedList<int, VsqBPPair> m_list = new SortedList<int, VsqBPPair>();
|
2009-07-29 10:03:20 -07:00
|
|
|
|
public int Default = 0;
|
|
|
|
|
public int Maximum = 127;
|
|
|
|
|
public int Minimum = 0;
|
2009-07-30 08:02:59 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// このリストに設定されたidの最大値.次にデータ点が追加されたときは,個の値+1がidとして利用される.削除された場合でも減らない
|
|
|
|
|
/// </summary>
|
|
|
|
|
private int m_max_id = 0;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
|
|
|
|
|
private class KeyClockIterator : Iterator {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
private SortedList<int, VsqBPPair> m_list;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
private int m_pos;
|
|
|
|
|
|
2009-07-30 08:02:59 -07:00
|
|
|
|
public KeyClockIterator( SortedList<int, VsqBPPair> list ) {
|
2009-06-25 07:16:22 -07:00
|
|
|
|
m_list = list;
|
|
|
|
|
m_pos = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool hasNext() {
|
|
|
|
|
if ( m_pos + 1 < m_list.Keys.Count ) {
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public object next() {
|
|
|
|
|
m_pos++;
|
|
|
|
|
return m_list.Keys[m_pos];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void remove() {
|
|
|
|
|
if ( 0 <= m_pos && m_pos < m_list.Keys.Count ) {
|
|
|
|
|
int key = m_list.Keys[m_pos];
|
|
|
|
|
m_list.Remove( key );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-29 10:03:20 -07:00
|
|
|
|
public VsqBPList()
|
|
|
|
|
: this( 0, 0, 64 ) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// XMLシリアライズ用
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string Data {
|
|
|
|
|
get {
|
|
|
|
|
string ret = "";
|
|
|
|
|
int count = -1;
|
|
|
|
|
foreach ( int key in m_list.Keys ) {
|
|
|
|
|
count++;
|
2009-07-30 08:02:59 -07:00
|
|
|
|
ret += (count == 0 ? "" : "," ) + key + "=" + m_list[key].value;
|
2009-07-29 10:03:20 -07:00
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
set {
|
|
|
|
|
m_list.Clear();
|
2009-07-30 08:02:59 -07:00
|
|
|
|
m_max_id = 0;
|
2009-07-29 10:03:20 -07:00
|
|
|
|
string[] spl = value.Split( ',' );
|
|
|
|
|
for ( int i = 0; i < spl.Length; i++ ) {
|
|
|
|
|
string[] spl2 = spl[i].Split( '=' );
|
|
|
|
|
if ( spl2.Length < 2 ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
try {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
m_list.Add( int.Parse( spl2[0] ), new VsqBPPair( int.Parse( spl2[1] ), m_max_id + 1 ) );
|
|
|
|
|
m_max_id++;
|
2009-07-29 10:03:20 -07:00
|
|
|
|
} catch ( Exception ex ) {
|
|
|
|
|
#if DEBUG
|
|
|
|
|
Console.WriteLine( " ex=" + ex );
|
|
|
|
|
Console.WriteLine( " i=" + i + "; spl2[0]=" + spl2[0] + "; spl2[1]=" + spl2[1] );
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-25 07:16:22 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// このVsqBPListの同一コピーを作成します
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public object Clone() {
|
2009-07-29 10:03:20 -07:00
|
|
|
|
VsqBPList res = new VsqBPList( Default, Minimum, Maximum );
|
2009-06-25 07:16:22 -07:00
|
|
|
|
foreach ( int key in m_list.Keys ) {
|
|
|
|
|
res.m_list.Add( key, m_list[key] );
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// コンストラクタ。デフォルト値はココで指定する。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="default_value"></param>
|
|
|
|
|
public VsqBPList( int default_value, int minimum, int maximum ) {
|
2009-07-29 10:03:20 -07:00
|
|
|
|
Default = default_value;
|
|
|
|
|
Maximum = maximum;
|
|
|
|
|
Minimum = minimum;
|
2009-07-30 08:02:59 -07:00
|
|
|
|
m_max_id = 0;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// このリストに設定された最大値を取得します。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int getMaximum() {
|
2009-07-29 10:03:20 -07:00
|
|
|
|
return Maximum;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// このリストに設定された最小値を取得します
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int getMinimum() {
|
2009-07-29 10:03:20 -07:00
|
|
|
|
return Minimum;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Iterator keyClockIterator() {
|
|
|
|
|
return new KeyClockIterator( m_list );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void remove( int clock ) {
|
|
|
|
|
if ( m_list.ContainsKey( clock ) ) {
|
|
|
|
|
m_list.Remove( clock );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool isContainsKey( int clock ) {
|
|
|
|
|
return m_list.ContainsKey( clock );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getCount() {
|
|
|
|
|
return m_list.Count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int[] getKeys() {
|
2009-07-29 10:03:20 -07:00
|
|
|
|
List<int> t = new List<int>();
|
|
|
|
|
foreach( int key in m_list.Keys ){
|
|
|
|
|
t.Add( key );
|
|
|
|
|
}
|
2009-06-25 07:16:22 -07:00
|
|
|
|
return t.ToArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void clear() {
|
|
|
|
|
m_list.Clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 新しいデータ点を追加します。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="clock"></param>
|
|
|
|
|
/// <param name="value"></param>
|
|
|
|
|
public void add( int clock, int value ) {
|
|
|
|
|
lock ( m_list ) {
|
|
|
|
|
if ( m_list.ContainsKey( clock ) ) {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
VsqBPPair v = m_list[clock];
|
|
|
|
|
v.value = value;
|
|
|
|
|
m_list[clock] = v;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
} else {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
VsqBPPair v = new VsqBPPair( value, m_max_id + 1 );
|
|
|
|
|
m_max_id++;
|
|
|
|
|
m_list.Add( clock, v );
|
2009-06-25 07:16:22 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-29 10:03:20 -07:00
|
|
|
|
public int getElement( int index ) {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
return m_list[m_list.Keys[index]].value;
|
2009-07-29 10:03:20 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getKeyClock( int index ) {
|
|
|
|
|
return m_list.Keys[index];
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-30 08:02:59 -07:00
|
|
|
|
public int findValueFromID( int id ) {
|
|
|
|
|
int c = m_list.Keys.Count;
|
|
|
|
|
foreach ( int key in m_list.Keys ) {
|
|
|
|
|
if ( m_list[key].id == id ) {
|
|
|
|
|
return m_list[key].value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return Default;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setValueForID( int id, int value ) {
|
|
|
|
|
int c = m_list.Keys.Count;
|
|
|
|
|
foreach ( int key in m_list.Keys ) {
|
|
|
|
|
if ( m_list[key].id == id ) {
|
|
|
|
|
VsqBPPair v = m_list[key];
|
|
|
|
|
v.value = value;
|
|
|
|
|
m_list[key] = v;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-29 10:03:20 -07:00
|
|
|
|
public int getValue( int clock, ref int index ) {
|
|
|
|
|
if ( m_list.Count == 0 ) {
|
|
|
|
|
return Default;
|
|
|
|
|
} else {
|
|
|
|
|
if ( index < 0 ) {
|
|
|
|
|
index = 0;
|
|
|
|
|
}
|
|
|
|
|
for ( int i = index ; i < m_list.Keys.Count; i++ ) {
|
|
|
|
|
int keyclock = m_list.Keys[i];
|
|
|
|
|
if ( clock < keyclock ) {
|
|
|
|
|
if ( i > 0 ) {
|
|
|
|
|
index = i;
|
2009-07-30 08:02:59 -07:00
|
|
|
|
return m_list[m_list.Keys[i - 1]].value;
|
2009-07-29 10:03:20 -07:00
|
|
|
|
} else {
|
|
|
|
|
index = i;
|
|
|
|
|
return Default;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
index = m_list.Keys.Count - 1;
|
2009-07-30 08:02:59 -07:00
|
|
|
|
return m_list[m_list.Keys[m_list.Keys.Count - 1]].value;
|
2009-07-29 10:03:20 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getValue( int clock ) {
|
|
|
|
|
if ( m_list.Count == 0 ) {
|
|
|
|
|
return Default;
|
|
|
|
|
} else {
|
|
|
|
|
for ( int i = 0; i < m_list.Keys.Count; i++ ) {
|
|
|
|
|
int keyclock = m_list.Keys[i];
|
|
|
|
|
if ( clock < keyclock ) {
|
|
|
|
|
if ( i > 0 ) {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
return m_list[m_list.Keys[i - 1]].value;
|
2009-07-29 10:03:20 -07:00
|
|
|
|
} else {
|
|
|
|
|
return Default;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-07-30 08:02:59 -07:00
|
|
|
|
return m_list[m_list.Keys[m_list.Keys.Count - 1]].value;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// このBPListのデフォルト値を取得します
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int getDefault() {
|
2009-07-29 10:03:20 -07:00
|
|
|
|
return Default;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// このBPListの内容をテキストファイルに書き出します
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="writer"></param>
|
|
|
|
|
public void print( StreamWriter writer ) {
|
|
|
|
|
bool first = true;
|
|
|
|
|
foreach ( int key in m_list.Keys ) {
|
2009-07-30 08:02:59 -07:00
|
|
|
|
int val = m_list[key].value;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
if ( first ) {
|
|
|
|
|
writer.WriteLine( key + "=" + val );
|
|
|
|
|
first = false;
|
|
|
|
|
} else {
|
|
|
|
|
writer.WriteLine( key + "=" + val );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// このBPListの内容をテキストファイルに書き出します
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="writer"></param>
|
|
|
|
|
public void print( TextMemoryStream writer, int start, string header ) {
|
|
|
|
|
bool first = true;
|
|
|
|
|
foreach ( int key in m_list.Keys ) {
|
|
|
|
|
if ( start <= key ) {
|
|
|
|
|
if ( first ) {
|
|
|
|
|
writer.writeLine( header );
|
|
|
|
|
first = false;
|
|
|
|
|
}
|
2009-07-30 08:02:59 -07:00
|
|
|
|
int val = m_list[key].value;
|
2009-06-25 07:16:22 -07:00
|
|
|
|
writer.writeLine( key + "=" + val );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// テキストファイルからデータ点を読込み、現在のリストに追加します
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="reader"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public string appendFromText( TextMemoryStream reader ) {
|
|
|
|
|
string last_line = reader.readLine();
|
|
|
|
|
while ( !last_line.StartsWith( "[" ) ) {
|
|
|
|
|
string[] spl = last_line.Split( new char[] { '=' } );
|
|
|
|
|
int i1 = int.Parse( spl[0] );
|
|
|
|
|
int i2 = int.Parse( spl[1] );
|
2009-07-30 08:02:59 -07:00
|
|
|
|
VsqBPPair v = new VsqBPPair( i2, m_max_id + 1 );
|
|
|
|
|
m_max_id++;
|
|
|
|
|
m_list.Add( i1, v );
|
2009-06-25 07:16:22 -07:00
|
|
|
|
if ( reader.peek() < 0 ) {
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
last_line = reader.readLine();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return last_line;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|