using System; using System.Runtime.InteropServices; namespace ProtoBuf { /// Represent multiple types as a union; this is used as part of OneOf - /// note that it is the caller's responsbility to only read/write the value as the same type public readonly partial struct DiscriminatedUnionObject { /// The value typed as Object public readonly object Object; /// Indicates whether the specified discriminator is assigned public bool Is(int discriminator) => Discriminator == discriminator; /// Create a new discriminated union value public DiscriminatedUnionObject(int discriminator, object value) { Discriminator = discriminator; Object = value; } /// Reset a value if the specified discriminator is assigned public static void Reset(ref DiscriminatedUnionObject value, int discriminator) { if (value.Discriminator == discriminator) value = default; } /// The discriminator value public int Discriminator { get; } } /// Represent multiple types as a union; this is used as part of OneOf - /// note that it is the caller's responsbility to only read/write the value as the same type [StructLayout(LayoutKind.Explicit)] public readonly partial struct DiscriminatedUnion64 { #if !FEAT_SAFE unsafe static DiscriminatedUnion64() { if (sizeof(DateTime) > 8) throw new InvalidOperationException(nameof(DateTime) + " was unexpectedly too big for " + nameof(DiscriminatedUnion64)); if (sizeof(TimeSpan) > 8) throw new InvalidOperationException(nameof(TimeSpan) + " was unexpectedly too big for " + nameof(DiscriminatedUnion64)); } #endif [FieldOffset(0)] private readonly int _discriminator; // note that we can't pack further because Object needs x8 alignment/padding on x64 /// The value typed as Int64 [FieldOffset(8)] public readonly long Int64; /// The value typed as UInt64 [FieldOffset(8)] public readonly ulong UInt64; /// The value typed as Int32 [FieldOffset(8)] public readonly int Int32; /// The value typed as UInt32 [FieldOffset(8)] public readonly uint UInt32; /// The value typed as Boolean [FieldOffset(8)] public readonly bool Boolean; /// The value typed as Single [FieldOffset(8)] public readonly float Single; /// The value typed as Double [FieldOffset(8)] public readonly double Double; /// The value typed as DateTime [FieldOffset(8)] public readonly DateTime DateTime; /// The value typed as TimeSpan [FieldOffset(8)] public readonly TimeSpan TimeSpan; private DiscriminatedUnion64(int discriminator) : this() { _discriminator = discriminator; } /// Indicates whether the specified discriminator is assigned public bool Is(int discriminator) => _discriminator == discriminator; /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, long value) : this(discriminator) { Int64 = value; } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, int value) : this(discriminator) { Int32 = value; } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, uint value) : this(discriminator) { UInt32 = value; } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, float value) : this(discriminator) { Single = value; } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, double value) : this(discriminator) { Double = value; } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, bool value) : this(discriminator) { Boolean = value; } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, DateTime? value) : this(value.HasValue ? discriminator: 0) { DateTime = value.GetValueOrDefault(); } /// Create a new discriminated union value public DiscriminatedUnion64(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } /// Reset a value if the specified discriminator is assigned public static void Reset(ref DiscriminatedUnion64 value, int discriminator) { if (value.Discriminator == discriminator) value = default; } /// The discriminator value public int Discriminator => _discriminator; } /// Represent multiple types as a union; this is used as part of OneOf - /// note that it is the caller's responsbility to only read/write the value as the same type [StructLayout(LayoutKind.Explicit)] public readonly partial struct DiscriminatedUnion128Object { #if !FEAT_SAFE unsafe static DiscriminatedUnion128Object() { if (sizeof(DateTime) > 16) throw new InvalidOperationException(nameof(DateTime) + " was unexpectedly too big for " + nameof(DiscriminatedUnion128Object)); if (sizeof(TimeSpan) > 16) throw new InvalidOperationException(nameof(TimeSpan) + " was unexpectedly too big for " + nameof(DiscriminatedUnion128Object)); if (sizeof(Guid) > 16) throw new InvalidOperationException(nameof(Guid) + " was unexpectedly too big for " + nameof(DiscriminatedUnion128Object)); } #endif [FieldOffset(0)] private readonly int _discriminator; // note that we can't pack further because Object needs x8 alignment/padding on x64 /// The value typed as Int64 [FieldOffset(8)] public readonly long Int64; /// The value typed as UInt64 [FieldOffset(8)] public readonly ulong UInt64; /// The value typed as Int32 [FieldOffset(8)] public readonly int Int32; /// The value typed as UInt32 [FieldOffset(8)] public readonly uint UInt32; /// The value typed as Boolean [FieldOffset(8)] public readonly bool Boolean; /// The value typed as Single [FieldOffset(8)] public readonly float Single; /// The value typed as Double [FieldOffset(8)] public readonly double Double; /// The value typed as DateTime [FieldOffset(8)] public readonly DateTime DateTime; /// The value typed as TimeSpan [FieldOffset(8)] public readonly TimeSpan TimeSpan; /// The value typed as Guid [FieldOffset(8)] public readonly Guid Guid; /// The value typed as Object [FieldOffset(24)] public readonly object Object; private DiscriminatedUnion128Object(int discriminator) : this() { _discriminator = discriminator; } /// Indicates whether the specified discriminator is assigned public bool Is(int discriminator) => _discriminator == discriminator; /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, long value) : this(discriminator) { Int64 = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, int value) : this(discriminator) { Int32 = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, uint value) : this(discriminator) { UInt32 = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, float value) : this(discriminator) { Single = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, double value) : this(discriminator) { Double = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, bool value) : this(discriminator) { Boolean = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, object value) : this(value != null ? discriminator : 0) { Object = value; } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, DateTime? value) : this(value.HasValue ? discriminator: 0) { DateTime = value.GetValueOrDefault(); } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } /// Create a new discriminated union value public DiscriminatedUnion128Object(int discriminator, Guid? value) : this(value.HasValue ? discriminator : 0) { Guid = value.GetValueOrDefault(); } /// Reset a value if the specified discriminator is assigned public static void Reset(ref DiscriminatedUnion128Object value, int discriminator) { if (value.Discriminator == discriminator) value = default; } /// The discriminator value public int Discriminator => _discriminator; } /// Represent multiple types as a union; this is used as part of OneOf - /// note that it is the caller's responsbility to only read/write the value as the same type [StructLayout(LayoutKind.Explicit)] public readonly partial struct DiscriminatedUnion128 { #if !FEAT_SAFE unsafe static DiscriminatedUnion128() { if (sizeof(DateTime) > 16) throw new InvalidOperationException(nameof(DateTime) + " was unexpectedly too big for " + nameof(DiscriminatedUnion128)); if (sizeof(TimeSpan) > 16) throw new InvalidOperationException(nameof(TimeSpan) + " was unexpectedly too big for " + nameof(DiscriminatedUnion128)); if (sizeof(Guid) > 16) throw new InvalidOperationException(nameof(Guid) + " was unexpectedly too big for " + nameof(DiscriminatedUnion128)); } #endif [FieldOffset(0)] private readonly int _discriminator; // note that we can't pack further because Object needs x8 alignment/padding on x64 /// The value typed as Int64 [FieldOffset(8)] public readonly long Int64; /// The value typed as UInt64 [FieldOffset(8)] public readonly ulong UInt64; /// The value typed as Int32 [FieldOffset(8)] public readonly int Int32; /// The value typed as UInt32 [FieldOffset(8)] public readonly uint UInt32; /// The value typed as Boolean [FieldOffset(8)] public readonly bool Boolean; /// The value typed as Single [FieldOffset(8)] public readonly float Single; /// The value typed as Double [FieldOffset(8)] public readonly double Double; /// The value typed as DateTime [FieldOffset(8)] public readonly DateTime DateTime; /// The value typed as TimeSpan [FieldOffset(8)] public readonly TimeSpan TimeSpan; /// The value typed as Guid [FieldOffset(8)] public readonly Guid Guid; private DiscriminatedUnion128(int discriminator) : this() { _discriminator = discriminator; } /// Indicates whether the specified discriminator is assigned public bool Is(int discriminator) => _discriminator == discriminator; /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, long value) : this(discriminator) { Int64 = value; } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, int value) : this(discriminator) { Int32 = value; } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, uint value) : this(discriminator) { UInt32 = value; } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, float value) : this(discriminator) { Single = value; } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, double value) : this(discriminator) { Double = value; } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, bool value) : this(discriminator) { Boolean = value; } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, DateTime? value) : this(value.HasValue ? discriminator: 0) { DateTime = value.GetValueOrDefault(); } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } /// Create a new discriminated union value public DiscriminatedUnion128(int discriminator, Guid? value) : this(value.HasValue ? discriminator : 0) { Guid = value.GetValueOrDefault(); } /// Reset a value if the specified discriminator is assigned public static void Reset(ref DiscriminatedUnion128 value, int discriminator) { if (value.Discriminator == discriminator) value = default; } /// The discriminator value public int Discriminator => _discriminator; } /// Represent multiple types as a union; this is used as part of OneOf - /// note that it is the caller's responsbility to only read/write the value as the same type [StructLayout(LayoutKind.Explicit)] public readonly partial struct DiscriminatedUnion64Object { #if !FEAT_SAFE unsafe static DiscriminatedUnion64Object() { if (sizeof(DateTime) > 8) throw new InvalidOperationException(nameof(DateTime) + " was unexpectedly too big for " + nameof(DiscriminatedUnion64Object)); if (sizeof(TimeSpan) > 8) throw new InvalidOperationException(nameof(TimeSpan) + " was unexpectedly too big for " + nameof(DiscriminatedUnion64Object)); } #endif [FieldOffset(0)] private readonly int _discriminator; // note that we can't pack further because Object needs x8 alignment/padding on x64 /// The value typed as Int64 [FieldOffset(8)] public readonly long Int64; /// The value typed as UInt64 [FieldOffset(8)] public readonly ulong UInt64; /// The value typed as Int32 [FieldOffset(8)] public readonly int Int32; /// The value typed as UInt32 [FieldOffset(8)] public readonly uint UInt32; /// The value typed as Boolean [FieldOffset(8)] public readonly bool Boolean; /// The value typed as Single [FieldOffset(8)] public readonly float Single; /// The value typed as Double [FieldOffset(8)] public readonly double Double; /// The value typed as DateTime [FieldOffset(8)] public readonly DateTime DateTime; /// The value typed as TimeSpan [FieldOffset(8)] public readonly TimeSpan TimeSpan; /// The value typed as Object [FieldOffset(16)] public readonly object Object; private DiscriminatedUnion64Object(int discriminator) : this() { _discriminator = discriminator; } /// Indicates whether the specified discriminator is assigned public bool Is(int discriminator) => _discriminator == discriminator; /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, long value) : this(discriminator) { Int64 = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, int value) : this(discriminator) { Int32 = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, uint value) : this(discriminator) { UInt32 = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, float value) : this(discriminator) { Single = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, double value) : this(discriminator) { Double = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, bool value) : this(discriminator) { Boolean = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, object value) : this(value != null ? discriminator : 0) { Object = value; } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, DateTime? value) : this(value.HasValue ? discriminator: 0) { DateTime = value.GetValueOrDefault(); } /// Create a new discriminated union value public DiscriminatedUnion64Object(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } /// Reset a value if the specified discriminator is assigned public static void Reset(ref DiscriminatedUnion64Object value, int discriminator) { if (value.Discriminator == discriminator) value = default; } /// The discriminator value public int Discriminator => _discriminator; } /// Represent multiple types as a union; this is used as part of OneOf - /// note that it is the caller's responsbility to only read/write the value as the same type [StructLayout(LayoutKind.Explicit)] public readonly partial struct DiscriminatedUnion32 { [FieldOffset(0)] private readonly int _discriminator; /// The value typed as Int32 [FieldOffset(4)] public readonly int Int32; /// The value typed as UInt32 [FieldOffset(4)] public readonly uint UInt32; /// The value typed as Boolean [FieldOffset(4)] public readonly bool Boolean; /// The value typed as Single [FieldOffset(4)] public readonly float Single; private DiscriminatedUnion32(int discriminator) : this() { _discriminator = discriminator; } /// Indicates whether the specified discriminator is assigned public bool Is(int discriminator) => _discriminator == discriminator; /// Create a new discriminated union value public DiscriminatedUnion32(int discriminator, int value) : this(discriminator) { Int32 = value; } /// Create a new discriminated union value public DiscriminatedUnion32(int discriminator, uint value) : this(discriminator) { UInt32 = value; } /// Create a new discriminated union value public DiscriminatedUnion32(int discriminator, float value) : this(discriminator) { Single = value; } /// Create a new discriminated union value public DiscriminatedUnion32(int discriminator, bool value) : this(discriminator) { Boolean = value; } /// Reset a value if the specified discriminator is assigned public static void Reset(ref DiscriminatedUnion32 value, int discriminator) { if (value.Discriminator == discriminator) value = default; } /// The discriminator value public int Discriminator => _discriminator; } /// Represent multiple types as a union; this is used as part of OneOf - /// note that it is the caller's responsbility to only read/write the value as the same type [StructLayout(LayoutKind.Explicit)] public readonly partial struct DiscriminatedUnion32Object { [FieldOffset(0)] private readonly int _discriminator; /// The value typed as Int32 [FieldOffset(4)] public readonly int Int32; /// The value typed as UInt32 [FieldOffset(4)] public readonly uint UInt32; /// The value typed as Boolean [FieldOffset(4)] public readonly bool Boolean; /// The value typed as Single [FieldOffset(4)] public readonly float Single; /// The value typed as Object [FieldOffset(8)] public readonly object Object; private DiscriminatedUnion32Object(int discriminator) : this() { _discriminator = discriminator; } /// Indicates whether the specified discriminator is assigned public bool Is(int discriminator) => _discriminator == discriminator; /// Create a new discriminated union value public DiscriminatedUnion32Object(int discriminator, int value) : this(discriminator) { Int32 = value; } /// Create a new discriminated union value public DiscriminatedUnion32Object(int discriminator, uint value) : this(discriminator) { UInt32 = value; } /// Create a new discriminated union value public DiscriminatedUnion32Object(int discriminator, float value) : this(discriminator) { Single = value; } /// Create a new discriminated union value public DiscriminatedUnion32Object(int discriminator, bool value) : this(discriminator) { Boolean = value; } /// Create a new discriminated union value public DiscriminatedUnion32Object(int discriminator, object value) : this(value != null ? discriminator : 0) { Object = value; } /// Reset a value if the specified discriminator is assigned public static void Reset(ref DiscriminatedUnion32Object value, int discriminator) { if (value.Discriminator == discriminator) value = default; } /// The discriminator value public int Discriminator => _discriminator; } }