using System; using System.Collections.Generic; using System.Text; namespace TJAPlayer3 { /// /// DTXMania のバージョン。 /// 例1:"078b" → 整数部=078, 小数部=2000000 ('英字'+'yymmdd') /// 例2:"078a(100124)" → 整数部=078, 小数部=1100124 ('英字'+'yymmdd') /// public class CDTXVersion { // プロパティ /// /// バージョンが未知のときに true になる。 /// public bool Unknown { get; private set; } /// /// DTXMania のバージョンの整数部を表す。 /// 例1:"078b" → 整数部=078 /// 例2:"078a(100124)" → 整数部=078 /// public int n整数部; /// /// DTXMania のバージョンの小数部を表す。 /// 小数部は、'英字(0~26) * 1000000 + 日付(yymmdd)' の式で表される整数。 /// 例1:"078b" → 小数部=2000000 /// 例2:"078a(100124)" → 小数部=1100124 /// public int n小数部; // コンストラクタ public CDTXVersion() { this.n整数部 = 0; this.n小数部 = 0; this.Unknown = true; } public CDTXVersion( int n整数部 ) { this.n整数部 = n整数部; this.n小数部 = 0; this.Unknown = false; } public CDTXVersion( string Version ) { this.n整数部 = 0; this.n小数部 = 0; this.Unknown = true; if( Version.ToLower().Equals( "unknown" ) ) { this.Unknown = true; } else { int num = 0; int length = Version.Length; if( ( num < length ) && char.IsDigit( Version[ num ] ) ) { // 整数部 取得 while( ( num < length ) && char.IsDigit( Version[ num ] ) ) { this.n整数部 = ( this.n整数部 * 10 ) + CDTXVersion.DIG10.IndexOf( Version[ num++ ] ); } // 小数部(1)英字部分 取得 while( ( num < length ) && ( ( Version[ num ] == ' ' ) || ( Version[ num ] == '(' ) ) ) { num++; } if( ( num < length ) && ( CDTXVersion.DIG36.IndexOf( Version[ num ] ) >= 10 ) ) { this.n小数部 = CDTXVersion.DIG36.IndexOf( Version[ num++ ] ) - 10; if( this.n小数部 >= 0x1a ) { this.n小数部 -= 0x1a; } this.n小数部++; } // 小数部(2)日付部分(yymmdd) 取得 while( ( num < length ) && ( ( Version[ num ] == ' ' ) || ( Version[ num ] == '(' ) ) ) { num++; } for( int i = 0; i < 6; i++ ) { this.n小数部 *= 10; if( ( num < length ) && char.IsDigit( Version[ num ] ) ) { this.n小数部 += CDTXVersion.DIG10.IndexOf( Version[ num ] ); } num++; } this.Unknown = false; } else { this.Unknown = true; } } } public CDTXVersion( int n整数部, int n小数部 ) { this.n整数部 = n整数部; this.n小数部 = n小数部; this.Unknown = false; } // メソッド public string toString() { var result = new StringBuilder( 32 ); // 整数部 result.Append( this.n整数部.ToString( "000" ) ); // 英字部分(あれば) if( this.n小数部 >= 1000000 ) { int n英字 = Math.Min( this.n小数部 / 1000000, 26 ); // 1~26 result.Append( CDTXVersion.DIG36[ 10 + ( n英字 - 1 ) ] ); } // 日付部分(あれば) int n日付 = this.n小数部 % 1000000; if( n日付 > 0 ) { result.Append( '(' ); result.Append( n日付.ToString( "000000" ) ); result.Append( ')' ); } return result.ToString(); } public static bool operator ==( CDTXVersion x, CDTXVersion y ) { return ( ( ( x.n整数部 == y.n整数部 ) && ( x.n小数部 == y.n小数部 ) ) && ( x.Unknown == y.Unknown ) ); } public static bool operator >( CDTXVersion x, CDTXVersion y ) { return ( ( x.n整数部 > y.n整数部 ) || ( ( x.n整数部 == y.n整数部 ) && ( x.n小数部 > y.n小数部 ) ) ); } public static bool operator >=( CDTXVersion x, CDTXVersion y ) { return ( ( x.n整数部 > y.n整数部 ) || ( ( x.n整数部 == y.n整数部 ) && ( x.n小数部 >= y.n小数部 ) ) ); } public static bool operator !=( CDTXVersion x, CDTXVersion y ) { if( ( x.n整数部 == y.n整数部 ) && ( x.n小数部 == y.n小数部 ) ) { return ( x.Unknown != y.Unknown ); } return true; } public static bool operator <( CDTXVersion x, CDTXVersion y ) { return ( ( x.n整数部 < y.n整数部 ) || ( ( x.n整数部 == y.n整数部 ) && ( x.n小数部 < y.n小数部 ) ) ); } public static bool operator <=( CDTXVersion x, CDTXVersion y ) { return ( ( x.n整数部 < y.n整数部 ) || ( ( x.n整数部 == y.n整数部 ) && ( x.n小数部 <= y.n小数部 ) ) ); } public override bool Equals(object obj) // 2011.1.3 yyagi: warningを無くすために追加 { if (obj == null) { return false; } if (this.GetType() != obj.GetType()) { return false; } CDTXVersion objCDTXVersion = (CDTXVersion)obj; if (!int.Equals(this.n整数部, objCDTXVersion.n整数部) || !int.Equals(this.n小数部, objCDTXVersion.n小数部)) { return false; } return true; } public override int GetHashCode() // 2011.1.3 yyagi: warningを無くすために追加 { string v = this.toString(); return v.GetHashCode(); } // その他 #region [ private ] //----------------- private const string DIG36 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; private const string DIG10 = "0123456789"; //----------------- #endregion } }