4 using System.Collections;
5 using System.Diagnostics;
6 using System.Runtime.InteropServices;
14 [DebuggerDisplay(
"{Value}")]
18 private readonly
bool _skipDelete;
19 private unsafe
void* _nativePtr;
20 private readonly DateTime _timestamp = DateTime.Now;
22 #region Internal Constructors
34 internal unsafe
Variant(
void* nativePtr)
36 _nativePtr = nativePtr;
42 #region Internal Properties
47 internal unsafe
bool IsNullPtr => _nativePtr ==
null;
53 unsafe
void* INative.NativePtr => _nativePtr;
68 protected virtual void Dispose(
bool disposing)
97 NativeMethods.Datalayer.DLR_variantDelete(_nativePtr);
118 GC.SuppressFinalize(
this);
123 #region Public Constructors
132 _nativePtr = NativeMethods.Datalayer.DLR_variantCreate();
146 throw new ArgumentNullException(nameof(other));
151 if (NativeMethods.Datalayer.DLR_variantCopy(_nativePtr, other.ToNativePtr()).IsBad())
153 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
166 if (SetBool(value).IsBad())
168 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
181 if (SetString(value).IsBad())
183 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
195 if (SetInt8(value).IsBad())
197 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
209 if (SetInt16(value).IsBad())
211 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
223 if (SetInt32(value).IsBad())
225 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
237 if (SetInt64(value).IsBad())
239 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
251 if (SetUInt8(value).IsBad())
253 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
265 if (SetUInt16(value).IsBad())
267 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
279 if (SetUInt32(value).IsBad())
281 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
293 if (SetUInt64(value).IsBad())
295 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
307 if (SetFloat32(value).IsBad())
309 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
321 if (SetFloat64(value).IsBad())
323 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
336 if (SetArrayOfBool(value).IsBad())
338 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
351 if (SetArrayOfString(value).IsBad())
353 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
366 if (SetArrayOfInt8(value).IsBad())
368 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
381 if (SetArrayOfInt16(value).IsBad())
383 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
396 if (SetArrayOfInt32(value).IsBad())
398 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
411 if (SetArrayOfInt64(value).IsBad())
413 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
426 if (SetArrayOfUInt8(value).IsBad())
428 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
441 if (SetArrayOfUInt16(value).IsBad())
443 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
456 if (SetArrayOfUInt32(value).IsBad())
458 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
471 if (SetArrayOfUInt64(value).IsBad())
473 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
486 if (SetArrayOfFloat32(value).IsBad())
488 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
501 if (SetArrayOfFloat64(value).IsBad())
503 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
516 if (SetFlatbuffers(flatBuffers).IsBad())
518 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
533 throw new ArgumentNullException(nameof(builder));
536 if (SetFlatbuffers(builder.DataBuffer).IsBad())
538 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCreatable);
544 #region Public Overrides
569 if (ReferenceEquals(
this, other))
581 if (Utils.IsArray(dataType))
583 return StructuralComparisons.StructuralEqualityComparer.Equals(
Value, other.
Value);
589 return StructuralComparisons.StructuralEqualityComparer.Equals(
ToFlatbuffers().ToSizedArray(), other.
ToFlatbuffers().ToSizedArray());
603 return v !=
null ? base.GetHashCode() ^ v.GetHashCode() : base.GetHashCode();
615 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
625 var length = Convert.ToInt32(GetSize().
ToUInt32()) - 1;
630 return Utils.ToString(NativeMethods.Datalayer.DLR_variantGetSTRING(_nativePtr), length);
684 #region Public Statics
723 #region Public Getters
735 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
752 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
799 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
816 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
833 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
850 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
868 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
885 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
901 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
911 return NativeMethods.Datalayer.DLR_variantGetBOOL8(_nativePtr);
924 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
934 return NativeMethods.Datalayer.DLR_variantGetINT8(_nativePtr);
947 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
957 return NativeMethods.Datalayer.DLR_variantGetUINT8(_nativePtr);
970 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
980 return NativeMethods.Datalayer.DLR_variantGetINT16(_nativePtr);
993 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1003 return NativeMethods.Datalayer.DLR_variantGetUINT16(_nativePtr);
1016 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1026 return NativeMethods.Datalayer.DLR_variantGetINT32(_nativePtr);
1039 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1049 return NativeMethods.Datalayer.DLR_variantGetUINT32(_nativePtr);
1062 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1072 return NativeMethods.Datalayer.DLR_variantGetINT64(_nativePtr);
1085 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1095 return NativeMethods.Datalayer.DLR_variantGetUINT64(_nativePtr);
1108 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1118 return NativeMethods.Datalayer.DLR_variantGetFLOAT32(_nativePtr);
1131 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1141 return NativeMethods.Datalayer.DLR_variantGetFLOAT64(_nativePtr);
1154 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1164 bool* p = NativeMethods.Datalayer.DLR_variantGetArrayOfBOOL8(_nativePtr);
1170 var count = GetCount().ToUInt32();
1171 var array =
new bool[count];
1172 for (var i = 0; i < count; i++)
1189 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1199 sbyte* p = NativeMethods.Datalayer.DLR_variantGetArrayOfINT8(_nativePtr);
1205 var count = GetCount().ToUInt32();
1206 var array =
new sbyte[count];
1207 for (var i = 0; i < count; i++)
1224 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1234 byte* p = NativeMethods.Datalayer.DLR_variantGetArrayOfUINT8(_nativePtr);
1240 var count = GetCount().ToUInt32();
1241 var array =
new byte[count];
1242 for (var i = 0; i < count; i++)
1259 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1269 short* p = NativeMethods.Datalayer.DLR_variantGetArrayOfINT16(_nativePtr);
1275 var count = GetCount().ToUInt32();
1276 var array =
new short[count];
1277 for (var i = 0; i < count; i++)
1294 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1304 ushort* p = NativeMethods.Datalayer.DLR_variantGetArrayOfUINT16(_nativePtr);
1310 var count = GetCount().ToUInt32();
1311 var array =
new ushort[count];
1312 for (var i = 0; i < count; i++)
1329 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1339 int* p = NativeMethods.Datalayer.DLR_variantGetArrayOfINT32(_nativePtr);
1345 var count = GetCount().ToUInt32();
1346 var array =
new int[count];
1347 for (var i = 0; i < count; i++)
1364 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1374 uint* p = NativeMethods.Datalayer.DLR_variantGetArrayOfUINT32(_nativePtr);
1380 var count = GetCount().ToUInt32();
1381 var array =
new uint[count];
1382 for (var i = 0; i < count; i++)
1399 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1409 long* p = NativeMethods.Datalayer.DLR_variantGetArrayOfINT64(_nativePtr);
1415 var count = GetCount().ToUInt32();
1416 var array =
new long[count];
1417 for (var i = 0; i < count; i++)
1434 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1444 ulong* p = NativeMethods.Datalayer.DLR_variantGetArrayOfUINT64(_nativePtr);
1450 var count = GetCount().ToUInt32();
1451 var array =
new ulong[count];
1452 for (var i = 0; i < count; i++)
1469 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1479 float* p = NativeMethods.Datalayer.DLR_variantGetArrayOfFLOAT32(_nativePtr);
1485 var count = GetCount().ToUInt32();
1486 var array =
new float[count];
1487 for (var i = 0; i < count; i++)
1504 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1514 double* p = NativeMethods.Datalayer.DLR_variantGetArrayOfFLOAT64(_nativePtr);
1520 var count = GetCount().ToUInt32();
1521 var array =
new double[count];
1522 for (var i = 0; i < count; i++)
1539 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1549 sbyte** p = NativeMethods.Datalayer.DLR_variantGetArrayOfSTRING(_nativePtr);
1555 var count = GetCount().ToUInt32();
1556 var array =
new string[count];
1557 for (var i = 0; i < count; i++)
1559 array[i] = Utils.ToString(p[i]);
1575 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1585 return NativeMethods.Datalayer.DLR_variantGetType(_nativePtr);
1600 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1603 return Utils.ToJsonDataType(
DataType);
1616 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1631 byte* p = NativeMethods.Datalayer.DLR_variantGetData(_nativePtr);
1637 var count = GetCount().ToUInt32();
1638 var array =
new byte[count];
1639 for (var i = 0; i < count; i++)
1643 return new ByteBuffer(array);
1657 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1667 byte* p = NativeMethods.Datalayer.DLR_variantGetData(_nativePtr);
1673 var value = Marshal.PtrToStringUTF8((IntPtr)p, Convert.ToInt32(GetSize().
ToUInt32()));
1674 return Encoding.UTF8.GetBytes(value);
1680 #region Public Methods
1691 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1702 if (NativeMethods.Datalayer.DLR_variantCopy(clone.ToNativePtr(),
this.ToNativePtr()).IsBad())
1704 throw new InvalidOperationException(Utils.Strings.ErrorObjectNotCloneable);
1721 throw new ObjectDisposedException(Utils.Strings.ErrorObjectDisposed);
1731 return NativeMethods.Datalayer.DLR_variantCheckConvert(_nativePtr, type);
1737 #region Public Implicit Operators
1742 public static implicit
operator Variant(
bool source)
1750 public static implicit
operator Variant(
bool[] source)
1758 public static implicit
operator Variant(sbyte source)
1766 public static implicit
operator Variant(sbyte[] source)
1774 public static implicit
operator Variant(
byte source)
1782 public static implicit
operator Variant(
byte[] source)
1790 public static implicit
operator Variant(
short source)
1798 public static implicit
operator Variant(
short[] source)
1806 public static implicit
operator Variant(ushort source)
1814 public static implicit
operator Variant(ushort[] source)
1822 public static implicit
operator Variant(
int source)
1830 public static implicit
operator Variant(
int[] source)
1838 public static implicit
operator Variant(uint source)
1846 public static implicit
operator Variant(uint[] source)
1854 public static implicit
operator Variant(
long source)
1862 public static implicit
operator Variant(
long[] source)
1870 public static implicit
operator Variant(ulong source)
1878 public static implicit
operator Variant(ulong[] source)
1886 public static implicit
operator Variant(
float source)
1894 public static implicit
operator Variant(
float[] source)
1902 public static implicit
operator Variant(
double source)
1910 public static implicit
operator Variant(
double[] source)
1918 public static implicit
operator Variant(
string source)
1926 public static implicit
operator Variant(
string[] source)
1934 public static implicit
operator Variant(FlatBufferBuilder builder)
1942 public static implicit
operator Variant(ByteBuffer flatBuffers)
1944 return new Variant(flatBuffers);
1949 #region Private Setter
1960 return NativeMethods.Datalayer.DLR_variantSetBOOL8(_nativePtr, value);
1973 return NativeMethods.Datalayer.DLR_variantSetINT8(_nativePtr, value);
1986 return NativeMethods.Datalayer.DLR_variantSetUINT8(_nativePtr, value);
1999 return NativeMethods.Datalayer.DLR_variantSetINT16(_nativePtr, value);
2012 return NativeMethods.Datalayer.DLR_variantSetUINT16(_nativePtr, value);
2025 return NativeMethods.Datalayer.DLR_variantSetINT32(_nativePtr, value);
2038 return NativeMethods.Datalayer.DLR_variantSetUINT32(_nativePtr, value);
2051 return NativeMethods.Datalayer.DLR_variantSetINT64(_nativePtr, value);
2064 return NativeMethods.Datalayer.DLR_variantSetUINT64(_nativePtr, value);
2077 return NativeMethods.Datalayer.DLR_variantSetFLOAT32(_nativePtr, value);
2090 return NativeMethods.Datalayer.DLR_variantSetFLOAT64(_nativePtr, value);
2104 throw new ArgumentNullException(nameof(value));
2109 return NativeMethods.Datalayer.DLR_variantSetSTRING(_nativePtr, value.ToSBytePtr());
2119 private DLR_RESULT SetArrayOfBool(
bool[] value)
2123 throw new ArgumentNullException(nameof(value));
2128 fixed (
bool* p = value)
2130 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_BOOL8(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2141 private DLR_RESULT SetArrayOfInt8(sbyte[] value)
2145 throw new ArgumentNullException(nameof(value));
2150 fixed (sbyte* p = value)
2152 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_INT8(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2163 private DLR_RESULT SetArrayOfUInt8(
byte[] value)
2167 throw new ArgumentNullException(nameof(value));
2172 fixed (
byte* p = value)
2174 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_UINT8(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2185 private DLR_RESULT SetArrayOfInt16(
short[] value)
2189 throw new ArgumentNullException(nameof(value));
2194 fixed (
short* p = value)
2196 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_INT16(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2207 private DLR_RESULT SetArrayOfUInt16(ushort[] value)
2211 throw new ArgumentNullException(nameof(value));
2216 fixed (ushort* p = value)
2218 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_UINT16(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2229 private DLR_RESULT SetArrayOfInt32(
int[] value)
2233 throw new ArgumentNullException(nameof(value));
2238 fixed (
int* p = value)
2240 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_INT32(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2251 private DLR_RESULT SetArrayOfUInt32(uint[] value)
2255 throw new ArgumentNullException(nameof(value));
2260 fixed (uint* p = value)
2262 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_UINT32(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2273 private DLR_RESULT SetArrayOfInt64(
long[] value)
2277 throw new ArgumentNullException(nameof(value));
2282 fixed (
long* p = value)
2284 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_INT64(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2295 private DLR_RESULT SetArrayOfUInt64(ulong[] value)
2299 throw new ArgumentNullException(nameof(value));
2304 fixed (ulong* p = value)
2306 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_UINT64(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2317 private DLR_RESULT SetArrayOfFloat32(
float[] value)
2321 throw new ArgumentNullException(nameof(value));
2326 fixed (
float* p = value)
2328 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_FLOAT32(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2339 private DLR_RESULT SetArrayOfFloat64(
double[] value)
2343 throw new ArgumentNullException(nameof(value));
2348 fixed (
double* p = value)
2350 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_FLOAT64(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2361 private DLR_RESULT SetArrayOfString(
string[] value)
2365 throw new ArgumentNullException(nameof(value));
2370 var array =
new sbyte*[value.Length];
2371 for (var i = 0; i < value.Length; i++)
2373 array[i] = value[i].ToSBytePtr();
2376 fixed (sbyte** p = array)
2378 return NativeMethods.Datalayer.DLR_variantSetARRAY_OF_STRING(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(value.Length)));
2389 private DLR_RESULT SetFlatbuffers(ByteBuffer value)
2393 throw new ArgumentNullException(nameof(value));
2396 var sbyteArray = Array.ConvertAll(value.ToSizedArray(), b => unchecked((sbyte)b));
2400 fixed (sbyte* p = sbyteArray)
2402 return NativeMethods.Datalayer.DLR_variantSetFlatbuffers(_nativePtr, p,
new UIntPtr(Convert.ToUInt32(sbyteArray.Length)));
2409 #region Private Methods
2415 internal UIntPtr GetSize()
2419 return UIntPtr.Zero;
2424 return NativeMethods.Datalayer.DLR_variantGetSize(_nativePtr);
2432 internal UIntPtr GetCount()
2436 return UIntPtr.Zero;
2441 return NativeMethods.Datalayer.DLR_variantGetCount(_nativePtr);