Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Version.cs
Go to the documentation of this file.
4
5namespace System;
6
8[TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
9public sealed class Version : ICloneable, IComparable, IComparable<Version?>, IEquatable<Version?>, ISpanFormattable, IFormattable
10{
11 private readonly int _Major;
12
13 private readonly int _Minor;
14
15 private readonly int _Build;
16
17 private readonly int _Revision;
18
19 public int Major => _Major;
20
21 public int Minor => _Minor;
22
23 public int Build => _Build;
24
25 public int Revision => _Revision;
26
27 public short MajorRevision => (short)(_Revision >> 16);
28
29 public short MinorRevision => (short)(_Revision & 0xFFFF);
30
32 {
33 get
34 {
35 if (_Build != -1)
36 {
37 if (_Revision != -1)
38 {
39 return 4;
40 }
41 return 3;
42 }
43 return 2;
44 }
45 }
46
47 public Version(int major, int minor, int build, int revision)
48 {
49 if (major < 0)
50 {
52 }
53 if (minor < 0)
54 {
56 }
57 if (build < 0)
58 {
60 }
61 if (revision < 0)
62 {
64 }
65 _Major = major;
66 _Minor = minor;
67 _Build = build;
68 _Revision = revision;
69 }
70
71 public Version(int major, int minor, int build)
72 {
73 if (major < 0)
74 {
76 }
77 if (minor < 0)
78 {
80 }
81 if (build < 0)
82 {
84 }
85 _Major = major;
86 _Minor = minor;
87 _Build = build;
88 _Revision = -1;
89 }
90
91 public Version(int major, int minor)
92 {
93 if (major < 0)
94 {
96 }
97 if (minor < 0)
98 {
100 }
101 _Major = major;
102 _Minor = minor;
103 _Build = -1;
104 _Revision = -1;
105 }
106
107 public Version(string version)
108 {
109 Version version2 = Parse(version);
110 _Major = version2.Major;
111 _Minor = version2.Minor;
112 _Build = version2.Build;
113 _Revision = version2.Revision;
114 }
115
116 public Version()
117 {
118 _Build = -1;
119 _Revision = -1;
120 }
121
122 private Version(Version version)
123 {
124 _Major = version._Major;
125 _Minor = version._Minor;
126 _Build = version._Build;
127 _Revision = version._Revision;
128 }
129
130 public object Clone()
131 {
132 return new Version(this);
133 }
134
135 public int CompareTo(object? version)
136 {
137 if (version == null)
138 {
139 return 1;
140 }
141 if (version is Version value)
142 {
143 return CompareTo(value);
144 }
146 }
147
149 {
150 if ((object)value != this)
151 {
152 if ((object)value != null)
153 {
154 if (_Major == value._Major)
155 {
156 if (_Minor == value._Minor)
157 {
158 if (_Build == value._Build)
159 {
160 if (_Revision == value._Revision)
161 {
162 return 0;
163 }
164 if (_Revision <= value._Revision)
165 {
166 return -1;
167 }
168 return 1;
169 }
170 if (_Build <= value._Build)
171 {
172 return -1;
173 }
174 return 1;
175 }
176 if (_Minor <= value._Minor)
177 {
178 return -1;
179 }
180 return 1;
181 }
182 if (_Major <= value._Major)
183 {
184 return -1;
185 }
186 return 1;
187 }
188 return 1;
189 }
190 return 0;
191 }
192
193 public override bool Equals([NotNullWhen(true)] object? obj)
194 {
195 return Equals(obj as Version);
196 }
197
198 public bool Equals([NotNullWhen(true)] Version? obj)
199 {
200 if ((object)obj != this)
201 {
202 if ((object)obj != null && _Major == obj._Major && _Minor == obj._Minor && _Build == obj._Build)
203 {
204 return _Revision == obj._Revision;
205 }
206 return false;
207 }
208 return true;
209 }
210
211 public override int GetHashCode()
212 {
213 int num = 0;
214 num |= (_Major & 0xF) << 28;
215 num |= (_Minor & 0xFF) << 20;
216 num |= (_Build & 0xFF) << 12;
217 return num | (_Revision & 0xFFF);
218 }
219
220 public override string ToString()
221 {
223 }
224
225 public string ToString(int fieldCount)
226 {
227 Span<char> destination = stackalloc char[47];
228 int charsWritten;
229 bool flag = TryFormat(destination, fieldCount, out charsWritten);
230 return destination.Slice(0, charsWritten).ToString();
231 }
232
233 string IFormattable.ToString(string format, IFormatProvider formatProvider)
234 {
235 return ToString();
236 }
237
238 public bool TryFormat(Span<char> destination, out int charsWritten)
239 {
240 return TryFormat(destination, DefaultFormatFieldCount, out charsWritten);
241 }
242
243 public bool TryFormat(Span<char> destination, int fieldCount, out int charsWritten)
244 {
245 switch (fieldCount)
246 {
247 default:
248 ThrowArgumentException("4");
249 break;
250 case 3:
251 case 4:
252 if (_Build != -1)
253 {
254 if (fieldCount == 4 && _Revision == -1)
255 {
256 ThrowArgumentException("3");
257 }
258 }
259 else
260 {
261 ThrowArgumentException("2");
262 }
263 break;
264 case 0:
265 case 1:
266 case 2:
267 break;
268 }
269 int num = 0;
270 for (int i = 0; i < fieldCount; i++)
271 {
272 if (i != 0)
273 {
274 if (destination.IsEmpty)
275 {
276 charsWritten = 0;
277 return false;
278 }
279 destination[0] = '.';
280 destination = destination.Slice(1);
281 num++;
282 }
283 if (!(i switch
284 {
285 0 => (uint)_Major,
286 1 => (uint)_Minor,
287 2 => (uint)_Build,
288 _ => (uint)_Revision,
289 }).TryFormat(destination, out var charsWritten2))
290 {
291 charsWritten = 0;
292 return false;
293 }
294 num += charsWritten2;
295 destination = destination.Slice(charsWritten2);
296 }
297 charsWritten = num;
298 return true;
299 static void ThrowArgumentException(string failureUpperBound)
300 {
301 throw new ArgumentException(SR.Format(SR.ArgumentOutOfRange_Bounds_Lower_Upper, "0", failureUpperBound), "fieldCount");
302 }
303 }
304
306 {
307 return TryFormat(destination, DefaultFormatFieldCount, out charsWritten);
308 }
309
310 public static Version Parse(string input)
311 {
312 if (input == null)
313 {
314 throw new ArgumentNullException("input");
315 }
316 return ParseVersion(input.AsSpan(), throwOnFailure: true);
317 }
318
320 {
321 return ParseVersion(input, throwOnFailure: true);
322 }
323
324 public static bool TryParse([NotNullWhen(true)] string? input, [NotNullWhen(true)] out Version? result)
325 {
326 if (input == null)
327 {
328 result = null;
329 return false;
330 }
331 return (result = ParseVersion(input.AsSpan(), throwOnFailure: false)) != null;
332 }
333
334 public static bool TryParse(ReadOnlySpan<char> input, [NotNullWhen(true)] out Version? result)
335 {
336 return (result = ParseVersion(input, throwOnFailure: false)) != null;
337 }
338
339 private static Version ParseVersion(ReadOnlySpan<char> input, bool throwOnFailure)
340 {
341 int num = input.IndexOf('.');
342 if (num < 0)
343 {
344 if (throwOnFailure)
345 {
346 throw new ArgumentException(SR.Arg_VersionString, "input");
347 }
348 return null;
349 }
350 int num2 = -1;
351 int num3 = input.Slice(num + 1).IndexOf('.');
352 if (num3 != -1)
353 {
354 num3 += num + 1;
355 num2 = input.Slice(num3 + 1).IndexOf('.');
356 if (num2 != -1)
357 {
358 num2 += num3 + 1;
359 if (input.Slice(num2 + 1).Contains('.'))
360 {
361 if (throwOnFailure)
362 {
363 throw new ArgumentException(SR.Arg_VersionString, "input");
364 }
365 return null;
366 }
367 }
368 }
369 if (!TryParseComponent(input.Slice(0, num), "input", throwOnFailure, out var parsedComponent))
370 {
371 return null;
372 }
373 int parsedComponent2;
374 if (num3 != -1)
375 {
376 if (!TryParseComponent(input.Slice(num + 1, num3 - num - 1), "input", throwOnFailure, out parsedComponent2))
377 {
378 return null;
379 }
380 int parsedComponent3;
381 if (num2 != -1)
382 {
383 if (!TryParseComponent(input.Slice(num3 + 1, num2 - num3 - 1), "build", throwOnFailure, out parsedComponent3) || !TryParseComponent(input.Slice(num2 + 1), "revision", throwOnFailure, out var parsedComponent4))
384 {
385 return null;
386 }
387 return new Version(parsedComponent, parsedComponent2, parsedComponent3, parsedComponent4);
388 }
389 if (!TryParseComponent(input.Slice(num3 + 1), "build", throwOnFailure, out parsedComponent3))
390 {
391 return null;
392 }
393 return new Version(parsedComponent, parsedComponent2, parsedComponent3);
394 }
395 if (!TryParseComponent(input.Slice(num + 1), "input", throwOnFailure, out parsedComponent2))
396 {
397 return null;
398 }
399 return new Version(parsedComponent, parsedComponent2);
400 }
401
402 private static bool TryParseComponent(ReadOnlySpan<char> component, string componentName, bool throwOnFailure, out int parsedComponent)
403 {
404 if (throwOnFailure)
405 {
406 if ((parsedComponent = int.Parse(component, NumberStyles.Integer, CultureInfo.InvariantCulture)) < 0)
407 {
409 }
410 return true;
411 }
412 if (int.TryParse(component, NumberStyles.Integer, CultureInfo.InvariantCulture, out parsedComponent))
413 {
414 return parsedComponent >= 0;
415 }
416 return false;
417 }
418
419 [MethodImpl(MethodImplOptions.AggressiveInlining)]
420 public static bool operator ==(Version? v1, Version? v2)
421 {
422 if ((object)v2 == null)
423 {
424 if ((object)v1 != null)
425 {
426 return false;
427 }
428 return true;
429 }
430 if ((object)v2 != v1)
431 {
432 return v2.Equals(v1);
433 }
434 return true;
435 }
436
437 public static bool operator !=(Version? v1, Version? v2)
438 {
439 return !(v1 == v2);
440 }
441
442 public static bool operator <(Version? v1, Version? v2)
443 {
444 if ((object)v1 == null)
445 {
446 return (object)v2 != null;
447 }
448 return v1.CompareTo(v2) < 0;
449 }
450
451 public static bool operator <=(Version? v1, Version? v2)
452 {
453 if ((object)v1 == null)
454 {
455 return true;
456 }
457 return v1.CompareTo(v2) <= 0;
458 }
459
460 public static bool operator >(Version? v1, Version? v2)
461 {
462 return v2 < v1;
463 }
464
465 public static bool operator >=(Version? v1, Version? v2)
466 {
467 return v2 <= v1;
468 }
469}
static CultureInfo InvariantCulture
static string Arg_MustBeVersion
Definition SR.cs:314
static string Arg_VersionString
Definition SR.cs:450
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string ArgumentOutOfRange_Version
Definition SR.cs:1124
static string ArgumentOutOfRange_Bounds_Lower_Upper
Definition SR.cs:980
Definition SR.cs:7
short MajorRevision
Definition Version.cs:27
static bool operator<=(Version? v1, Version? v2)
Definition Version.cs:451
readonly int _Minor
Definition Version.cs:13
static bool operator==(Version? v1, Version? v2)
Definition Version.cs:420
Version(int major, int minor, int build, int revision)
Definition Version.cs:47
override bool Equals([NotNullWhen(true)] object? obj)
Definition Version.cs:193
static bool TryParseComponent(ReadOnlySpan< char > component, string componentName, bool throwOnFailure, out int parsedComponent)
Definition Version.cs:402
int DefaultFormatFieldCount
Definition Version.cs:32
static Version Parse(ReadOnlySpan< char > input)
Definition Version.cs:319
int CompareTo(object? version)
Definition Version.cs:135
Version(string version)
Definition Version.cs:107
Version(int major, int minor, int build)
Definition Version.cs:71
Version(int major, int minor)
Definition Version.cs:91
static Version Parse(string input)
Definition Version.cs:310
string ToString(int fieldCount)
Definition Version.cs:225
int CompareTo(Version? value)
Definition Version.cs:148
static bool operator>=(Version? v1, Version? v2)
Definition Version.cs:465
override string ToString()
Definition Version.cs:220
static bool operator<(Version? v1, Version? v2)
Definition Version.cs:442
readonly int _Major
Definition Version.cs:11
static bool TryParse(ReadOnlySpan< char > input, [NotNullWhen(true)] out Version? result)
Definition Version.cs:334
bool TryFormat(Span< char > destination, out int charsWritten)
Definition Version.cs:238
readonly int _Build
Definition Version.cs:15
override int GetHashCode()
Definition Version.cs:211
bool TryFormat(Span< char > destination, int fieldCount, out int charsWritten)
Definition Version.cs:243
object Clone()
Definition Version.cs:130
static bool TryParse([NotNullWhen(true)] string? input, [NotNullWhen(true)] out Version? result)
Definition Version.cs:324
Version(Version version)
Definition Version.cs:122
short MinorRevision
Definition Version.cs:29
static Version ParseVersion(ReadOnlySpan< char > input, bool throwOnFailure)
Definition Version.cs:339
bool Equals([NotNullWhen(true)] Version? obj)
Definition Version.cs:198
static bool operator>(Version? v1, Version? v2)
Definition Version.cs:460
readonly int _Revision
Definition Version.cs:17
static bool operator!=(Version? v1, Version? v2)
Definition Version.cs:437
string ToString(string? format, IFormatProvider? formatProvider)
bool TryFormat(Span< char > destination, out int charsWritten, ReadOnlySpan< char > format, IFormatProvider? provider)