Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Variant.cs
Go to the documentation of this file.
3
5
6[StructLayout(LayoutKind.Explicit)]
7[SupportedOSPlatform("windows")]
8internal struct Variant
9{
10 private struct TypeUnion
11 {
12 public ushort _vt;
13
14 public ushort _wReserved1;
15
16 public ushort _wReserved2;
17
18 public ushort _wReserved3;
19
21 }
22
23 private struct Record
24 {
26
28 }
29
30 [StructLayout(LayoutKind.Explicit)]
31 private struct UnionTypes
32 {
33 [FieldOffset(0)]
34 public sbyte _i1;
35
36 [FieldOffset(0)]
37 public short _i2;
38
39 [FieldOffset(0)]
40 public int _i4;
41
42 [FieldOffset(0)]
43 public long _i8;
44
45 [FieldOffset(0)]
46 public byte _ui1;
47
48 [FieldOffset(0)]
49 public ushort _ui2;
50
51 [FieldOffset(0)]
52 public uint _ui4;
53
54 [FieldOffset(0)]
55 public ulong _ui8;
56
57 [FieldOffset(0)]
58 public int _int;
59
60 [FieldOffset(0)]
61 public uint _uint;
62
63 [FieldOffset(0)]
64 public short _bool;
65
66 [FieldOffset(0)]
67 public int _error;
68
69 [FieldOffset(0)]
70 public float _r4;
71
72 [FieldOffset(0)]
73 public double _r8;
74
75 [FieldOffset(0)]
76 public long _cy;
77
78 [FieldOffset(0)]
79 public double _date;
80
81 [FieldOffset(0)]
82 public IntPtr _bstr;
83
84 [FieldOffset(0)]
86
87 [FieldOffset(0)]
89
90 [FieldOffset(0)]
92
93 [FieldOffset(0)]
94 public IntPtr _byref;
95
96 [FieldOffset(0)]
98 }
99
100 [FieldOffset(0)]
102
103 [FieldOffset(0)]
104 private decimal _decimal;
105
107 {
108 get
109 {
110 return (VarEnum)_typeUnion._vt;
111 }
112 set
113 {
114 _typeUnion._vt = (ushort)value;
115 }
116 }
117
118 public bool IsEmpty => _typeUnion._vt == 0;
119
120 public bool IsByRef => (_typeUnion._vt & 0x4000) != 0;
121
123
125
127
129
131
133
135
137
139
141
142 public bool AsBool => _typeUnion._unionTypes._bool != 0;
143
145
147
148 public double AsR8 => _typeUnion._unionTypes._r8;
149
150 public decimal AsDecimal
151 {
152 get
153 {
154 Variant variant = this;
155 variant._typeUnion._vt = 0;
156 return variant._decimal;
157 }
158 }
159
160 public decimal AsCy => decimal.FromOACurrency(_typeUnion._unionTypes._cy);
161
163
164 public string AsBstr
165 {
166 get
167 {
169 {
170 return null;
171 }
173 }
174 }
175
176 public object AsUnknown
177 {
178 get
179 {
181 {
182 return null;
183 }
185 }
186 }
187
188 public object AsDispatch
189 {
190 get
191 {
193 {
194 return null;
195 }
197 }
198 }
199
201
202 public unsafe void CopyFromIndirect(object value)
203 {
204 VarEnum varEnum = VariantType & (VarEnum)(-16385);
205 if (value == null)
206 {
207 if (varEnum == VarEnum.VT_DISPATCH || varEnum == VarEnum.VT_UNKNOWN || varEnum == VarEnum.VT_BSTR)
208 {
209 *(IntPtr*)(void*)_typeUnion._unionTypes._byref = IntPtr.Zero;
210 }
211 return;
212 }
213 if ((varEnum & VarEnum.VT_ARRAY) != 0)
214 {
215 System.Runtime.CompilerServices.Unsafe.SkipInit(out Variant variant);
217 *(IntPtr*)(void*)_typeUnion._unionTypes._byref = variant._typeUnion._unionTypes._byref;
218 return;
219 }
220 switch (varEnum)
221 {
222 case VarEnum.VT_I1:
223 *(sbyte*)(void*)_typeUnion._unionTypes._byref = (sbyte)value;
224 break;
225 case VarEnum.VT_UI1:
226 *(byte*)(void*)_typeUnion._unionTypes._byref = (byte)value;
227 break;
228 case VarEnum.VT_I2:
229 *(short*)(void*)_typeUnion._unionTypes._byref = (short)value;
230 break;
231 case VarEnum.VT_UI2:
232 *(ushort*)(void*)_typeUnion._unionTypes._byref = (ushort)value;
233 break;
234 case VarEnum.VT_BOOL:
235 *(short*)(void*)_typeUnion._unionTypes._byref = (short)(((bool)value) ? (-1) : 0);
236 break;
237 case VarEnum.VT_I4:
238 case VarEnum.VT_INT:
239 *(int*)(void*)_typeUnion._unionTypes._byref = (int)value;
240 break;
241 case VarEnum.VT_UI4:
242 case VarEnum.VT_UINT:
243 *(uint*)(void*)_typeUnion._unionTypes._byref = (uint)value;
244 break;
245 case VarEnum.VT_ERROR:
246 *(int*)(void*)_typeUnion._unionTypes._byref = ((ErrorWrapper)value).ErrorCode;
247 break;
248 case VarEnum.VT_I8:
249 *(long*)(void*)_typeUnion._unionTypes._byref = (long)value;
250 break;
251 case VarEnum.VT_UI8:
252 *(ulong*)(void*)_typeUnion._unionTypes._byref = (ulong)value;
253 break;
254 case VarEnum.VT_R4:
255 *(float*)(void*)_typeUnion._unionTypes._byref = (float)value;
256 break;
257 case VarEnum.VT_R8:
258 *(double*)(void*)_typeUnion._unionTypes._byref = (double)value;
259 break;
260 case VarEnum.VT_DATE:
261 *(double*)(void*)_typeUnion._unionTypes._byref = ((DateTime)value).ToOADate();
262 break;
263 case VarEnum.VT_UNKNOWN:
264 *(IntPtr*)(void*)_typeUnion._unionTypes._byref = Marshal.GetIUnknownForObject(value);
265 break;
266 case VarEnum.VT_DISPATCH:
267 *(IntPtr*)(void*)_typeUnion._unionTypes._byref = Marshal.GetIDispatchForObject(value);
268 break;
269 case VarEnum.VT_BSTR:
270 *(IntPtr*)(void*)_typeUnion._unionTypes._byref = Marshal.StringToBSTR((string)value);
271 break;
272 case VarEnum.VT_CY:
273 *(long*)(void*)_typeUnion._unionTypes._byref = decimal.ToOACurrency((decimal)value);
274 break;
275 case VarEnum.VT_DECIMAL:
276 *(decimal*)(void*)_typeUnion._unionTypes._byref = (decimal)value;
277 break;
278 case VarEnum.VT_VARIANT:
280 break;
281 default:
282 throw new ArgumentException();
283 }
284 }
285
286 public unsafe object ToObject()
287 {
288 if (IsEmpty)
289 {
290 return null;
291 }
292 switch (VariantType)
293 {
294 case VarEnum.VT_NULL:
295 return DBNull.Value;
296 case VarEnum.VT_I1:
297 return AsI1;
298 case VarEnum.VT_I2:
299 return AsI2;
300 case VarEnum.VT_I4:
301 return AsI4;
302 case VarEnum.VT_I8:
303 return AsI8;
304 case VarEnum.VT_UI1:
305 return AsUi1;
306 case VarEnum.VT_UI2:
307 return AsUi2;
308 case VarEnum.VT_UI4:
309 return AsUi4;
310 case VarEnum.VT_UI8:
311 return AsUi8;
312 case VarEnum.VT_INT:
313 return AsInt;
314 case VarEnum.VT_UINT:
315 return AsUint;
316 case VarEnum.VT_BOOL:
317 return AsBool;
318 case VarEnum.VT_ERROR:
319 return AsError;
320 case VarEnum.VT_R4:
321 return AsR4;
322 case VarEnum.VT_R8:
323 return AsR8;
324 case VarEnum.VT_DECIMAL:
325 return AsDecimal;
326 case VarEnum.VT_CY:
327 return AsCy;
328 case VarEnum.VT_DATE:
329 return AsDate;
330 case VarEnum.VT_BSTR:
331 return AsBstr;
332 case VarEnum.VT_UNKNOWN:
333 return AsUnknown;
334 case VarEnum.VT_DISPATCH:
335 return AsDispatch;
336 default:
337 fixed (Variant* ptr = &this)
338 {
339 void* ptr2 = ptr;
341 }
342 }
343 }
344
345 public unsafe void Clear()
346 {
347 VarEnum variantType = VariantType;
348 if ((variantType & VarEnum.VT_BYREF) != 0)
349 {
350 VariantType = VarEnum.VT_EMPTY;
351 }
352 else if ((variantType & VarEnum.VT_ARRAY) != 0 || variantType == VarEnum.VT_BSTR || variantType == VarEnum.VT_UNKNOWN || variantType == VarEnum.VT_DISPATCH || variantType == VarEnum.VT_VARIANT || variantType == VarEnum.VT_RECORD)
353 {
354 fixed (Variant* ptr = &this)
355 {
356 void* ptr2 = ptr;
358 }
359 }
360 else
361 {
362 VariantType = VarEnum.VT_EMPTY;
363 }
364 }
365}
static void VariantClear(IntPtr variant)
static readonly DBNull Value
Definition DBNull.cs:8
static void GetNativeVariantForObject(object? obj, IntPtr pDstNativeVariant)
Definition Marshal.cs:510
static ? object GetObjectForNativeVariant(IntPtr pSrcNativeVariant)
Definition Marshal.cs:533
static IntPtr GetIDispatchForObject(object o)
Definition Marshal.cs:244
static object GetObjectForIUnknown(IntPtr pUnk)
Definition Marshal.cs:295
static IntPtr GetIUnknownForObject(object o)
Definition Marshal.cs:231
static unsafe IntPtr StringToBSTR(string? s)
Definition Marshal.cs:1531
static string PtrToStringBSTR(IntPtr ptr)
Definition Marshal.cs:1542
static DateTime FromOADate(double d)
Definition DateTime.cs:732
static readonly IntPtr Zero
Definition IntPtr.cs:18
unsafe void CopyFromIndirect(object value)
Definition Variant.cs:202