Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Variant.cs
Go to the documentation of this file.
5
6namespace System;
7
8internal struct Variant
9{
10 private object _objref;
11
12 private long _data;
13
14 private int _flags;
15
16 internal const int CV_EMPTY = 0;
17
18 internal const int CV_VOID = 1;
19
20 internal const int CV_BOOLEAN = 2;
21
22 internal const int CV_CHAR = 3;
23
24 internal const int CV_I1 = 4;
25
26 internal const int CV_U1 = 5;
27
28 internal const int CV_I2 = 6;
29
30 internal const int CV_U2 = 7;
31
32 internal const int CV_I4 = 8;
33
34 internal const int CV_U4 = 9;
35
36 internal const int CV_I8 = 10;
37
38 internal const int CV_U8 = 11;
39
40 internal const int CV_R4 = 12;
41
42 internal const int CV_R8 = 13;
43
44 internal const int CV_STRING = 14;
45
46 internal const int CV_PTR = 15;
47
48 internal const int CV_DATETIME = 16;
49
50 internal const int CV_TIMESPAN = 17;
51
52 internal const int CV_OBJECT = 18;
53
54 internal const int CV_DECIMAL = 19;
55
56 internal const int CV_ENUM = 21;
57
58 internal const int CV_MISSING = 22;
59
60 internal const int CV_NULL = 23;
61
62 internal const int CV_LAST = 24;
63
64 internal const int TypeCodeBitMask = 65535;
65
66 internal const int VTBitMask = -16777216;
67
68 internal const int VTBitShift = 24;
69
70 internal const int ArrayBitMask = 65536;
71
72 internal const int EnumI1 = 1048576;
73
74 internal const int EnumU1 = 2097152;
75
76 internal const int EnumI2 = 3145728;
77
78 internal const int EnumU2 = 4194304;
79
80 internal const int EnumI4 = 5242880;
81
82 internal const int EnumU4 = 6291456;
83
84 internal const int EnumI8 = 7340032;
85
86 internal const int EnumU8 = 8388608;
87
88 internal const int EnumMask = 15728640;
89
90 internal static readonly Type[] ClassTypes = new Type[23]
91 {
92 typeof(Empty),
93 typeof(void),
94 typeof(bool),
95 typeof(char),
96 typeof(sbyte),
97 typeof(byte),
98 typeof(short),
99 typeof(ushort),
100 typeof(int),
101 typeof(uint),
102 typeof(long),
103 typeof(ulong),
104 typeof(float),
105 typeof(double),
106 typeof(string),
107 typeof(void),
108 typeof(DateTime),
109 typeof(TimeSpan),
110 typeof(object),
111 typeof(decimal),
112 typeof(object),
113 typeof(Missing),
114 typeof(DBNull)
115 };
116
117 internal static readonly Variant Empty;
118
119 internal static readonly Variant Missing = new Variant(22, Type.Missing, 0L);
120
121 internal static readonly Variant DBNull = new Variant(23, System.DBNull.Value, 0L);
122
123 internal int CVType => _flags & 0xFFFF;
124
125 [MethodImpl(MethodImplOptions.InternalCall)]
126 internal extern void SetFieldsObject(object val);
127
128 internal Variant(int flags, object or, long data)
129 {
130 _flags = flags;
131 _objref = or;
132 _data = data;
133 }
134
135 public Variant(bool val)
136 {
137 _objref = null;
138 _flags = 2;
139 _data = (val ? 1 : 0);
140 }
141
142 public Variant(sbyte val)
143 {
144 _objref = null;
145 _flags = 4;
146 _data = val;
147 }
148
149 public Variant(byte val)
150 {
151 _objref = null;
152 _flags = 5;
153 _data = val;
154 }
155
156 public Variant(short val)
157 {
158 _objref = null;
159 _flags = 6;
160 _data = val;
161 }
162
163 public Variant(ushort val)
164 {
165 _objref = null;
166 _flags = 7;
167 _data = val;
168 }
169
170 public Variant(char val)
171 {
172 _objref = null;
173 _flags = 3;
174 _data = val;
175 }
176
177 public Variant(int val)
178 {
179 _objref = null;
180 _flags = 8;
181 _data = val;
182 }
183
184 public Variant(uint val)
185 {
186 _objref = null;
187 _flags = 9;
188 _data = val;
189 }
190
191 public Variant(long val)
192 {
193 _objref = null;
194 _flags = 10;
195 _data = val;
196 }
197
198 public Variant(ulong val)
199 {
200 _objref = null;
201 _flags = 11;
202 _data = (long)val;
203 }
204
205 public Variant(float val)
206 {
207 _objref = null;
208 _flags = 12;
210 }
211
212 public Variant(double val)
213 {
214 _objref = null;
215 _flags = 13;
217 }
218
219 public Variant(DateTime val)
220 {
221 _objref = null;
222 _flags = 16;
223 _data = val.Ticks;
224 }
225
226 public Variant(decimal val)
227 {
228 _objref = val;
229 _flags = 19;
230 _data = 0L;
231 }
232
233 public Variant(object obj)
234 {
235 _data = 0L;
236 VarEnum varEnum = VarEnum.VT_EMPTY;
237 if (obj is DateTime)
238 {
239 _objref = null;
240 _flags = 16;
241 _data = ((DateTime)obj).Ticks;
242 return;
243 }
244 if (obj is string)
245 {
246 _flags = 14;
247 _objref = obj;
248 return;
249 }
250 if (obj == null)
251 {
252 this = Empty;
253 return;
254 }
255 if (obj == System.DBNull.Value)
256 {
257 this = DBNull;
258 return;
259 }
260 if (obj == Type.Missing)
261 {
262 this = Missing;
263 return;
264 }
265 if (obj is Array)
266 {
267 _flags = 65554;
268 _objref = obj;
269 return;
270 }
271 _flags = 0;
272 _objref = null;
273 if (obj is UnknownWrapper)
274 {
275 varEnum = VarEnum.VT_UNKNOWN;
276 obj = ((UnknownWrapper)obj).WrappedObject;
277 }
278 else if (obj is DispatchWrapper)
279 {
280 varEnum = VarEnum.VT_DISPATCH;
281 obj = ((DispatchWrapper)obj).WrappedObject;
282 }
283 else if (obj is ErrorWrapper)
284 {
285 varEnum = VarEnum.VT_ERROR;
286 obj = ((ErrorWrapper)obj).ErrorCode;
287 }
288 else if (obj is CurrencyWrapper)
289 {
290 varEnum = VarEnum.VT_CY;
291 obj = ((CurrencyWrapper)obj).WrappedObject;
292 }
293 else if (obj is BStrWrapper)
294 {
295 varEnum = VarEnum.VT_BSTR;
296 obj = ((BStrWrapper)obj).WrappedObject;
297 }
298 if (obj != null)
299 {
301 }
302 if (varEnum != 0)
303 {
304 _flags |= (int)varEnum << 24;
305 }
306 }
307
308 public object ToObject()
309 {
310 return CVType switch
311 {
312 0 => null,
313 2 => (int)_data != 0,
314 4 => (sbyte)_data,
315 5 => (byte)_data,
316 3 => (char)_data,
317 6 => (short)_data,
318 7 => (ushort)_data,
319 8 => (int)_data,
320 9 => (uint)_data,
321 10 => _data,
322 11 => (ulong)_data,
325 16 => new DateTime(_data),
326 17 => new TimeSpan(_data),
327 21 => BoxEnum(),
328 22 => Type.Missing,
329 23 => System.DBNull.Value,
330 _ => _objref,
331 };
332 }
333
334 [MethodImpl(MethodImplOptions.InternalCall)]
335 private extern object BoxEnum();
336
337 internal static void MarshalHelperConvertObjectToVariant(object o, ref Variant v)
338 {
339 if (o == null)
340 {
341 v = Empty;
342 }
343 else if (o is IConvertible convertible)
344 {
346 v = convertible.GetTypeCode() switch
347 {
348 TypeCode.Empty => Empty,
349 TypeCode.Object => new Variant(o),
350 TypeCode.DBNull => DBNull,
351 TypeCode.Boolean => new Variant(convertible.ToBoolean(invariantCulture)),
352 TypeCode.Char => new Variant(convertible.ToChar(invariantCulture)),
353 TypeCode.SByte => new Variant(convertible.ToSByte(invariantCulture)),
354 TypeCode.Byte => new Variant(convertible.ToByte(invariantCulture)),
355 TypeCode.Int16 => new Variant(convertible.ToInt16(invariantCulture)),
356 TypeCode.UInt16 => new Variant(convertible.ToUInt16(invariantCulture)),
357 TypeCode.Int32 => new Variant(convertible.ToInt32(invariantCulture)),
358 TypeCode.UInt32 => new Variant(convertible.ToUInt32(invariantCulture)),
359 TypeCode.Int64 => new Variant(convertible.ToInt64(invariantCulture)),
360 TypeCode.UInt64 => new Variant(convertible.ToUInt64(invariantCulture)),
361 TypeCode.Single => new Variant(convertible.ToSingle(invariantCulture)),
362 TypeCode.Double => new Variant(convertible.ToDouble(invariantCulture)),
363 TypeCode.Decimal => new Variant(convertible.ToDecimal(invariantCulture)),
364 TypeCode.DateTime => new Variant(convertible.ToDateTime(invariantCulture)),
365 TypeCode.String => new Variant(convertible.ToString(invariantCulture)),
366 _ => throw new NotSupportedException(SR.Format(SR.NotSupported_UnknownTypeCode, convertible.GetTypeCode())),
367 };
368 }
369 else
370 {
371 v = new Variant(o);
372 }
373 }
374
375 internal static object MarshalHelperConvertVariantToObject(ref Variant v)
376 {
377 return v.ToObject();
378 }
379
380 internal static void MarshalHelperCastVariant(object pValue, int vt, ref Variant v)
381 {
382 if (!(pValue is IConvertible convertible))
383 {
384 switch (vt)
385 {
386 case 9:
387 v = new Variant(new DispatchWrapper(pValue));
388 return;
389 case 12:
390 v = new Variant(pValue);
391 return;
392 case 13:
393 v = new Variant(new UnknownWrapper(pValue));
394 return;
395 case 36:
396 v = new Variant(pValue);
397 return;
398 case 8:
399 if (pValue == null)
400 {
401 v = new Variant(null)
402 {
403 _flags = 14
404 };
405 return;
406 }
407 break;
408 }
410 }
412 v = vt switch
413 {
414 0 => Empty,
415 1 => DBNull,
416 2 => new Variant(convertible.ToInt16(invariantCulture)),
417 3 => new Variant(convertible.ToInt32(invariantCulture)),
418 4 => new Variant(convertible.ToSingle(invariantCulture)),
419 5 => new Variant(convertible.ToDouble(invariantCulture)),
420 6 => new Variant(new CurrencyWrapper(convertible.ToDecimal(invariantCulture))),
421 7 => new Variant(convertible.ToDateTime(invariantCulture)),
422 8 => new Variant(convertible.ToString(invariantCulture)),
423 9 => new Variant(new DispatchWrapper(convertible)),
424 10 => new Variant(new ErrorWrapper(convertible.ToInt32(invariantCulture))),
425 11 => new Variant(convertible.ToBoolean(invariantCulture)),
426 12 => new Variant(convertible),
427 13 => new Variant(new UnknownWrapper(convertible)),
428 14 => new Variant(convertible.ToDecimal(invariantCulture)),
429 16 => new Variant(convertible.ToSByte(invariantCulture)),
430 17 => new Variant(convertible.ToByte(invariantCulture)),
431 18 => new Variant(convertible.ToUInt16(invariantCulture)),
432 19 => new Variant(convertible.ToUInt32(invariantCulture)),
433 20 => new Variant(convertible.ToInt64(invariantCulture)),
434 21 => new Variant(convertible.ToUInt64(invariantCulture)),
435 22 => new Variant(convertible.ToInt32(invariantCulture)),
436 23 => new Variant(convertible.ToUInt32(invariantCulture)),
438 };
439 }
440}
static unsafe double Int64BitsToDouble(long value)
static unsafe long DoubleToInt64Bits(double value)
static uint SingleToUInt32Bits(float value)
static float UInt32BitsToSingle(uint value)
static readonly DBNull Value
Definition DBNull.cs:8
static CultureInfo InvariantCulture
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string InvalidCast_CannotCoerceByRefVariant
Definition SR.cs:1384
static string NotSupported_UnknownTypeCode
Definition SR.cs:1726
Definition SR.cs:7
static readonly object Missing
Definition Type.cs:21
static readonly Variant Empty
Definition Variant.cs:117
const int VTBitShift
Definition Variant.cs:68
static void MarshalHelperCastVariant(object pValue, int vt, ref Variant v)
Definition Variant.cs:380
const int CV_STRING
Definition Variant.cs:44
const int CV_MISSING
Definition Variant.cs:58
static object MarshalHelperConvertVariantToObject(ref Variant v)
Definition Variant.cs:375
const int CV_U2
Definition Variant.cs:30
const int CV_DECIMAL
Definition Variant.cs:54
const int CV_LAST
Definition Variant.cs:62
Variant(int flags, object or, long data)
Definition Variant.cs:128
const int CV_ENUM
Definition Variant.cs:56
Variant(double val)
Definition Variant.cs:212
const int CV_I4
Definition Variant.cs:32
const int ArrayBitMask
Definition Variant.cs:70
const int CV_I8
Definition Variant.cs:36
const int CV_U8
Definition Variant.cs:38
Variant(sbyte val)
Definition Variant.cs:142
Variant(short val)
Definition Variant.cs:156
const int EnumU1
Definition Variant.cs:74
object ToObject()
Definition Variant.cs:308
const int EnumI1
Definition Variant.cs:72
Variant(object obj)
Definition Variant.cs:233
Variant(ulong val)
Definition Variant.cs:198
Variant(bool val)
Definition Variant.cs:135
Variant(int val)
Definition Variant.cs:177
const int CV_NULL
Definition Variant.cs:60
const int EnumU4
Definition Variant.cs:82
Variant(DateTime val)
Definition Variant.cs:219
Variant(uint val)
Definition Variant.cs:184
const int EnumU2
Definition Variant.cs:78
const int CV_CHAR
Definition Variant.cs:22
void SetFieldsObject(object val)
const int CV_U1
Definition Variant.cs:26
const int CV_R8
Definition Variant.cs:42
Variant(char val)
Definition Variant.cs:170
Variant(long val)
Definition Variant.cs:191
const int CV_TIMESPAN
Definition Variant.cs:50
Variant(ushort val)
Definition Variant.cs:163
const int EnumI2
Definition Variant.cs:76
const int EnumI8
Definition Variant.cs:84
object BoxEnum()
static readonly Variant Missing
Definition Variant.cs:119
const int EnumI4
Definition Variant.cs:80
const int CV_EMPTY
Definition Variant.cs:16
const int VTBitMask
Definition Variant.cs:66
object _objref
Definition Variant.cs:10
Variant(byte val)
Definition Variant.cs:149
const int CV_DATETIME
Definition Variant.cs:48
const int CV_U4
Definition Variant.cs:34
static void MarshalHelperConvertObjectToVariant(object o, ref Variant v)
Definition Variant.cs:337
const int CV_OBJECT
Definition Variant.cs:52
static readonly Type[] ClassTypes
Definition Variant.cs:90
Variant(decimal val)
Definition Variant.cs:226
const int TypeCodeBitMask
Definition Variant.cs:64
const int CV_PTR
Definition Variant.cs:46
const int CV_BOOLEAN
Definition Variant.cs:20
Variant(float val)
Definition Variant.cs:205
const int CV_R4
Definition Variant.cs:40
static readonly Variant DBNull
Definition Variant.cs:121
const int EnumU8
Definition Variant.cs:86
const int CV_I2
Definition Variant.cs:28
const int CV_VOID
Definition Variant.cs:18
const int CV_I1
Definition Variant.cs:24
const int EnumMask
Definition Variant.cs:88