211 lines
5.6 KiB
C#
211 lines
5.6 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace TJAPlayer3
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// <para>DTXMania のバージョン。</para>
|
|||
|
/// <para>例1:"078b" → 整数部=078, 小数部=2000000 ('英字'+'yymmdd') </para>
|
|||
|
/// <para>例2:"078a(100124)" → 整数部=078, 小数部=1100124 ('英字'+'yymmdd')</para>
|
|||
|
/// </summary>
|
|||
|
public class CDTXVersion
|
|||
|
{
|
|||
|
// プロパティ
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <para>バージョンが未知のときに true になる。</para>
|
|||
|
/// </summary>
|
|||
|
public bool Unknown
|
|||
|
{
|
|||
|
get;
|
|||
|
private set;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <para>DTXMania のバージョンの整数部を表す。</para>
|
|||
|
/// <para>例1:"078b" → 整数部=078</para>
|
|||
|
/// <para>例2:"078a(100124)" → 整数部=078</para>
|
|||
|
/// </summary>
|
|||
|
public int n整数部;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <para>DTXMania のバージョンの小数部を表す。</para>
|
|||
|
/// <para>小数部は、'英字(0~26) * 1000000 + 日付(yymmdd)' の式で表される整数。</para>
|
|||
|
/// <para>例1:"078b" → 小数部=2000000 </para>
|
|||
|
/// <para>例2:"078a(100124)" → 小数部=1100124</para>
|
|||
|
/// </summary>
|
|||
|
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
|
|||
|
}
|
|||
|
}
|