OSDN Git Service

#36057 コンフィグまわりのリファクタ(リソース不完全なので注意)
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / 全体 / CDTXVersion.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 \r
5 namespace DTXMania\r
6 {\r
7         /// <summary>\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
11         /// </summary>\r
12         public class CDTXVersion\r
13         {\r
14                 // プロパティ\r
15 \r
16                 /// <summary>\r
17                 /// <para>バージョンが未知のときに true になる。</para>\r
18                 /// </summary>\r
19                 public bool Unknown\r
20                 {\r
21                         get;\r
22                         private set;\r
23                 }\r
24 \r
25                 /// <summary>\r
26                 /// <para>DTXMania のバージョンの整数部を表す。</para>\r
27                 /// <para>例1:"078b" → 整数部=078</para>\r
28                 /// <para>例2:"078a(100124)" → 整数部=078</para>\r
29                 /// </summary>\r
30                 public int n整数部;\r
31 \r
32                 /// <summary>\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
37                 /// </summary>\r
38                 public int n小数部;\r
39 \r
40 \r
41                 // コンストラクタ\r
42 \r
43                 public CDTXVersion()\r
44                 {\r
45                         this.n整数部 = 0;\r
46                         this.n小数部 = 0;\r
47                         this.Unknown = true;\r
48                 }\r
49                 public CDTXVersion(int n整数部)\r
50                 {\r
51                         this.n整数部 = n整数部;\r
52                         this.n小数部 = 0;\r
53                         this.Unknown = false;\r
54                 }\r
55                 public CDTXVersion(string Version)\r
56                 {\r
57                         this.n整数部 = 0;\r
58                         this.n小数部 = 0;\r
59                         this.Unknown = true;\r
60 \r
61                         if (Version.ToLower().Equals("unknown"))\r
62                         {\r
63                                 this.Unknown = true;\r
64                         }\r
65                         else\r
66                         {\r
67                                 int num = 0;\r
68                                 int length = Version.Length;\r
69                                 if ((num < length) && char.IsDigit(Version[num]))\r
70                                 {\r
71                                         // 整数部 取得\r
72                                         while ((num < length) && char.IsDigit(Version[num]))\r
73                                         {\r
74                                                 this.n整数部 = (this.n整数部 * 10) + CDTXVersion.DIG10.IndexOf(Version[num++]);\r
75                                         }\r
76 \r
77                                         // 小数部(1)英字部分 取得\r
78                                         while ((num < length) && ((Version[num] == ' ') || (Version[num] == '(')))\r
79                                         {\r
80                                                 num++;\r
81                                         }\r
82                                         if ((num < length) && (CDTXVersion.DIG36.IndexOf(Version[num]) >= 10))\r
83                                         {\r
84                                                 this.n小数部 = CDTXVersion.DIG36.IndexOf(Version[num++]) - 10;\r
85                                                 if (this.n小数部 >= 0x1a)\r
86                                                 {\r
87                                                         this.n小数部 -= 0x1a;\r
88                                                 }\r
89                                                 this.n小数部++;\r
90                                         }\r
91 \r
92                                         // 小数部(2)日付部分(yymmdd) 取得\r
93                                         while ((num < length) && ((Version[num] == ' ') || (Version[num] == '(')))\r
94                                         {\r
95                                                 num++;\r
96                                         }\r
97                                         for (int i = 0; i < 6; i++)\r
98                                         {\r
99                                                 this.n小数部 *= 10;\r
100                                                 if ((num < length) && char.IsDigit(Version[num]))\r
101                                                 {\r
102                                                         this.n小数部 += CDTXVersion.DIG10.IndexOf(Version[num]);\r
103                                                 }\r
104                                                 num++;\r
105                                         }\r
106                                         this.Unknown = false;\r
107                                 }\r
108                                 else\r
109                                 {\r
110                                         this.Unknown = true;\r
111                                 }\r
112                         }\r
113                 }\r
114                 public CDTXVersion(int n整数部, int n小数部)\r
115                 {\r
116                         this.n整数部 = n整数部;\r
117                         this.n小数部 = n小数部;\r
118                         this.Unknown = false;\r
119                 }\r
120 \r
121 \r
122                 // メソッド\r
123 \r
124                 public string toString()\r
125                 {\r
126                         var result = new StringBuilder(32);\r
127 \r
128                         // 整数部\r
129                         result.Append(this.n整数部.ToString("000"));\r
130 \r
131                         // 英字部分(あれば)\r
132                         if (this.n小数部 >= 1000000)\r
133                         {\r
134                                 int n英字 = Math.Min(this.n小数部 / 1000000, 26);  // 1~26\r
135                                 result.Append(CDTXVersion.DIG36[10 + (n英字 - 1)]);\r
136                         }\r
137 \r
138                         // 日付部分(あれば)\r
139                         int n日付 = this.n小数部 % 1000000;\r
140                         if (n日付 > 0)\r
141                         {\r
142                                 result.Append('(');\r
143                                 result.Append(n日付.ToString("000000"));\r
144                                 result.Append(')');\r
145                         }\r
146 \r
147                         return result.ToString();\r
148                 }\r
149 \r
150                 public static bool operator ==(CDTXVersion x, CDTXVersion y)\r
151                 {\r
152                         return (((x.n整数部 == y.n整数部) && (x.n小数部 == y.n小数部)) && (x.Unknown == y.Unknown));\r
153                 }\r
154                 public static bool operator >(CDTXVersion x, CDTXVersion y)\r
155                 {\r
156                         return ((x.n整数部 > y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 > y.n小数部)));\r
157                 }\r
158                 public static bool operator >=(CDTXVersion x, CDTXVersion y)\r
159                 {\r
160                         return ((x.n整数部 > y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 >= y.n小数部)));\r
161                 }\r
162                 public static bool operator !=(CDTXVersion x, CDTXVersion y)\r
163                 {\r
164                         if ((x.n整数部 == y.n整数部) && (x.n小数部 == y.n小数部))\r
165                         {\r
166                                 return (x.Unknown != y.Unknown);\r
167                         }\r
168                         return true;\r
169                 }\r
170                 public static bool operator <(CDTXVersion x, CDTXVersion y)\r
171                 {\r
172                         return ((x.n整数部 < y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 < y.n小数部)));\r
173                 }\r
174                 public static bool operator <=(CDTXVersion x, CDTXVersion y)\r
175                 {\r
176                         return ((x.n整数部 < y.n整数部) || ((x.n整数部 == y.n整数部) && (x.n小数部 <= y.n小数部)));\r
177                 }\r
178                 public override bool Equals(object obj)     // 2011.1.3 yyagi: warningを無くすために追加\r
179                 {\r
180                         if (obj == null)\r
181                         {\r
182                                 return false;\r
183                         }\r
184                         if (this.GetType() != obj.GetType())\r
185                         {\r
186                                 return false;\r
187                         }\r
188                         CDTXVersion objCDTXVersion = (CDTXVersion)obj;\r
189                         if (!int.Equals(this.n整数部, objCDTXVersion.n整数部) || !int.Equals(this.n小数部, objCDTXVersion.n小数部))\r
190                         {\r
191                                 return false;\r
192                         }\r
193                         return true;\r
194                 }\r
195                 public override int GetHashCode()       // 2011.1.3 yyagi: warningを無くすために追加\r
196                 {\r
197                         string v = this.toString();\r
198                         return v.GetHashCode();\r
199                 }\r
200 \r
201                 // その他\r
202 \r
203                 #region [ private ]\r
204                 //-----------------\r
205                 private const string DIG36 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";\r
206                 private const string DIG10 = "0123456789";\r
207                 //-----------------\r
208                 #endregion\r
209         }\r
210 }\r