2 using System.Collections.Generic;
\r
8 /// <para>DTXMania のバージョン。</para>
\r
9 /// <para>例1:"078b" → 整数部=078, 小数部=2000000 ('英字'+'yymmdd') </para>
\r
10 /// <para>例2:"078a(100124)" → 整数部=078, 小数部=1100124 ('英字'+'yymmdd')</para>
\r
12 public class CDTXVersion
\r
17 /// <para>バージョンが未知のときに true になる。</para>
\r
26 /// <para>DTXMania のバージョンの整数部を表す。</para>
\r
27 /// <para>例1:"078b" → 整数部=078</para>
\r
28 /// <para>例2:"078a(100124)" → 整数部=078</para>
\r
33 /// <para>DTXMania のバージョンの小数部を表す。</para>
\r
34 /// <para>小数部は、'英字(0~26) * 1000000 + 日付(yymmdd)' の式で表される整数。</para>
\r
35 /// <para>例1:"078b" → 小数部=2000000 </para>
\r
36 /// <para>例2:"078a(100124)" → 小数部=1100124</para>
\r
43 public CDTXVersion()
\r
47 this.Unknown = true;
\r
49 public CDTXVersion(int n整数部)
\r
53 this.Unknown = false;
\r
55 public CDTXVersion(string Version)
\r
59 this.Unknown = true;
\r
61 if (Version.ToLower().Equals("unknown"))
\r
63 this.Unknown = true;
\r
68 int length = Version.Length;
\r
69 if ((num < length) && char.IsDigit(Version[num]))
\r
72 while ((num < length) && char.IsDigit(Version[num]))
\r
74 this.n整数部 = (this.n整数部 * 10) + CDTXVersion.DIG10.IndexOf(Version[num++]);
\r
78 while ((num < length) && ((Version[num] == ' ') || (Version[num] == '(')))
\r
82 if ((num < length) && (CDTXVersion.DIG36.IndexOf(Version[num]) >= 10))
\r
84 this.n小数部 = CDTXVersion.DIG36.IndexOf(Version[num++]) - 10;
\r
85 if (this.n小数部 >= 0x1a)
\r
92 // 小数部(2)日付部分(yymmdd) 取得
\r
93 while ((num < length) && ((Version[num] == ' ') || (Version[num] == '(')))
\r
97 for (int i = 0; i < 6; i++)
\r
100 if ((num < length) && char.IsDigit(Version[num]))
\r
102 this.n小数部 += CDTXVersion.DIG10.IndexOf(Version[num]);
\r
106 this.Unknown = false;
\r
110 this.Unknown = true;
\r
114 public CDTXVersion(int n整数部, int n小数部)
\r
118 this.Unknown = false;
\r
124 public string toString()
\r
126 var result = new StringBuilder(32);
\r
129 result.Append(this.n整数部.ToString("000"));
\r
132 if (this.n小数部 >= 1000000)
\r
134 int n英字 = Math.Min(this.n小数部 / 1000000, 26); // 1~26
\r
135 result.Append(CDTXVersion.DIG36[10 + (n英字 - 1)]);
\r
139 int n日付 = this.n小数部 % 1000000;
\r
142 result.Append('(');
\r
143 result.Append(n日付.ToString("000000"));
\r
144 result.Append(')');
\r
147 return result.ToString();
\r
150 public static bool operator ==(CDTXVersion x, CDTXVersion y)
\r
152 return (((x.n整数部 == y.n整数部) && (x.n小数部 == y.n小数部)) && (x.Unknown == y.Unknown));
\r
154 public static bool operator >(CDTXVersion x, CDTXVersion y)
\r
156 return ((x.n整数部 > y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 > y.n小数部)));
\r
158 public static bool operator >=(CDTXVersion x, CDTXVersion y)
\r
160 return ((x.n整数部 > y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 >= y.n小数部)));
\r
162 public static bool operator !=(CDTXVersion x, CDTXVersion y)
\r
164 if ((x.n整数部 == y.n整数部) && (x.n小数部 == y.n小数部))
\r
166 return (x.Unknown != y.Unknown);
\r
170 public static bool operator <(CDTXVersion x, CDTXVersion y)
\r
172 return ((x.n整数部 < y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 < y.n小数部)));
\r
174 public static bool operator <=(CDTXVersion x, CDTXVersion y)
\r
176 return ((x.n整数部 < y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 <= y.n小数部)));
\r
178 public override bool Equals(object obj) // 2011.1.3 yyagi: warningを無くすために追加
\r
184 if (this.GetType() != obj.GetType())
\r
188 CDTXVersion objCDTXVersion = (CDTXVersion)obj;
\r
189 if (!int.Equals(this.n整数部, objCDTXVersion.n整数部) || !int.Equals(this.n小数部, objCDTXVersion.n小数部))
\r
195 public override int GetHashCode() // 2011.1.3 yyagi: warningを無くすために追加
\r
197 string v = this.toString();
\r
198 return v.GetHashCode();
\r
203 #region [ private ]
\r
204 //-----------------
\r
205 private const string DIG36 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
\r
206 private const string DIG10 = "0123456789";
\r
207 //-----------------
\r