1
0
mirror of synced 2024-11-25 08:00:21 +01:00
OpenTaiko/TJAPlayer3/Common/CDTXVersion.cs

211 lines
5.6 KiB
C#
Raw Normal View History

2021-09-21 00:16:38 +02:00
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>小数部は、'英字(026) * 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 ); // 126
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
}
}