コード例 #1
0
 private IEnumerator <EnumMember <TEnum> > Enumerate()
 {
     foreach (var member in _members)
     {
         yield return(UnsafeUtility.As <EnumMember <TEnum> >(member.EnumMember));
     }
 }
コード例 #2
0
ファイル: ValuesContainer.cs プロジェクト: yan2oo7/Enums.NET
 private IEnumerator <TEnum> Enumerate()
 {
     foreach (var member in _members)
     {
         var v = member.Value;
         yield return(UnsafeUtility.As <TUnderlying, TEnum>(ref v));
     }
 }
コード例 #3
0
        /// <summary>
        /// 高速なCopyFrom
        /// arrayの内容をnativeArrayのstartIndex位置にコピーする
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="nativeArray"></param>
        /// <param name="array"></param>
        public static void CopyFromFast <T, T2>(this NativeArray <T> nativeArray, int startIndex, T2[] array) where T : struct where T2 : struct
        {
#if UNITY_2020_1_OR_NEWER
            T[] ar = UnsafeUtility.As <T2[], T[]>(ref array);
#else
            T[] ar = Unsafe.As <T2[], T[]>(ref array);
#endif
            NativeArray <T> .Copy(ar, 0, nativeArray, startIndex, array.Length);
        }
コード例 #4
0
ファイル: EnumBridge.cs プロジェクト: yan2oo7/Enums.NET
 public bool CustomValidate(object customValidator, TUnderlying value) => UnsafeUtility.As <IEnumValidatorAttribute <TEnum> >(customValidator).IsValid(UnsafeUtility.As <TUnderlying, TEnum>(ref value));
コード例 #5
0
ファイル: EnumBridge.cs プロジェクト: yan2oo7/Enums.NET
 public object ToObjectUnchecked(TUnderlying value) => UnsafeUtility.As <TUnderlying, TEnum>(ref value);
        internal static unsafe void ReadPrimitiveUnsafe <TValue>(UnsafeAppendBuffer.Reader *stream, ref TValue value, Type type)
        {
#if UNITY_2020_1_OR_NEWER
            switch (Type.GetTypeCode(type))
            {
            case TypeCode.SByte:
                stream->ReadNext <sbyte>(out var _sbyte);
                value = UnsafeUtility.As <sbyte, TValue>(ref _sbyte);
                return;

            case TypeCode.Int16:
                stream->ReadNext <short>(out var _short);
                value = UnsafeUtility.As <short, TValue>(ref _short);
                return;

            case TypeCode.Int32:
                stream->ReadNext <int>(out var _int);
                value = UnsafeUtility.As <int, TValue>(ref _int);
                return;

            case TypeCode.Int64:
                stream->ReadNext <long>(out var _long);
                value = UnsafeUtility.As <long, TValue>(ref _long);
                return;

            case TypeCode.Byte:
                stream->ReadNext <byte>(out var _byte);
                value = UnsafeUtility.As <byte, TValue>(ref _byte);
                return;

            case TypeCode.UInt16:
                stream->ReadNext <ushort>(out var _ushort);
                value = UnsafeUtility.As <ushort, TValue>(ref _ushort);
                return;

            case TypeCode.UInt32:
                stream->ReadNext <uint>(out var _uint);
                value = UnsafeUtility.As <uint, TValue>(ref _uint);
                return;

            case TypeCode.UInt64:
                stream->ReadNext <ulong>(out var _ulong);
                value = UnsafeUtility.As <ulong, TValue>(ref _ulong);
                return;

            case TypeCode.Single:
                stream->ReadNext <float>(out var _float);
                value = UnsafeUtility.As <float, TValue>(ref _float);
                return;

            case TypeCode.Double:
                stream->ReadNext <double>(out var _double);
                value = UnsafeUtility.As <double, TValue>(ref _double);
                return;

            case TypeCode.Boolean:
                stream->ReadNext <byte>(out var _boolean);
                var b = _boolean == 1;
                value = UnsafeUtility.As <bool, TValue>(ref b);
                return;

            case TypeCode.Char:
                stream->ReadNext <char>(out var _char);
                value = UnsafeUtility.As <char, TValue>(ref _char);
                return;

            case TypeCode.String:
                stream->ReadNext(out string _string);
                value = (TValue)(object)_string;
                return;

            default:
                throw new ArgumentOutOfRangeException();
            }
#else
            switch (Type.GetTypeCode(type))
            {
            case TypeCode.SByte:
                stream->ReadNext <sbyte>(out var _sbyte);
                value = System.Runtime.CompilerServices.Unsafe.As <sbyte, TValue>(ref _sbyte);
                return;

            case TypeCode.Int16:
                stream->ReadNext <short>(out var _short);
                value = System.Runtime.CompilerServices.Unsafe.As <short, TValue>(ref _short);
                return;

            case TypeCode.Int32:
                stream->ReadNext <int>(out var _int);
                value = System.Runtime.CompilerServices.Unsafe.As <int, TValue>(ref _int);
                return;

            case TypeCode.Int64:
                stream->ReadNext <long>(out var _long);
                value = System.Runtime.CompilerServices.Unsafe.As <long, TValue>(ref _long);
                return;

            case TypeCode.Byte:
                stream->ReadNext <byte>(out var _byte);
                value = System.Runtime.CompilerServices.Unsafe.As <byte, TValue>(ref _byte);
                return;

            case TypeCode.UInt16:
                stream->ReadNext <ushort>(out var _ushort);
                value = System.Runtime.CompilerServices.Unsafe.As <ushort, TValue>(ref _ushort);
                return;

            case TypeCode.UInt32:
                stream->ReadNext <uint>(out var _uint);
                value = System.Runtime.CompilerServices.Unsafe.As <uint, TValue>(ref _uint);
                return;

            case TypeCode.UInt64:
                stream->ReadNext <ulong>(out var _ulong);
                value = System.Runtime.CompilerServices.Unsafe.As <ulong, TValue>(ref _ulong);
                return;

            case TypeCode.Single:
                stream->ReadNext <float>(out var _float);
                value = System.Runtime.CompilerServices.Unsafe.As <float, TValue>(ref _float);
                return;

            case TypeCode.Double:
                stream->ReadNext <double>(out var _double);
                value = System.Runtime.CompilerServices.Unsafe.As <double, TValue>(ref _double);
                return;

            case TypeCode.Boolean:
                stream->ReadNext <byte>(out var _boolean);
                var b = _boolean == 1;
                value = System.Runtime.CompilerServices.Unsafe.As <bool, TValue>(ref b);
                return;

            case TypeCode.Char:
                stream->ReadNext <char>(out var _char);
                value = System.Runtime.CompilerServices.Unsafe.As <char, TValue>(ref _char);
                return;

            case TypeCode.String:
                stream->ReadNext(out string _string);
                value = (TValue)(object)_string;
                return;

            default:
                throw new ArgumentOutOfRangeException();
            }
#endif
        }
        internal static unsafe void WritePrimitiveUnsafe <TValue>(UnsafeAppendBuffer *stream, ref TValue value, Type type)
        {
#if UNITY_2020_1_OR_NEWER
            switch (Type.GetTypeCode(type))
            {
            case TypeCode.SByte:
                stream->Add(UnsafeUtility.As <TValue, sbyte>(ref value));
                return;

            case TypeCode.Int16:
                stream->Add(UnsafeUtility.As <TValue, short>(ref value));
                return;

            case TypeCode.Int32:
                stream->Add(UnsafeUtility.As <TValue, int>(ref value));
                return;

            case TypeCode.Int64:
                stream->Add(UnsafeUtility.As <TValue, long>(ref value));
                return;

            case TypeCode.Byte:
                stream->Add(UnsafeUtility.As <TValue, byte>(ref value));
                return;

            case TypeCode.UInt16:
                stream->Add(UnsafeUtility.As <TValue, ushort>(ref value));
                return;

            case TypeCode.UInt32:
                stream->Add(UnsafeUtility.As <TValue, uint>(ref value));
                return;

            case TypeCode.UInt64:
                stream->Add(UnsafeUtility.As <TValue, ulong>(ref value));
                return;

            case TypeCode.Single:
                stream->Add(UnsafeUtility.As <TValue, float>(ref value));
                return;

            case TypeCode.Double:
                stream->Add(UnsafeUtility.As <TValue, double>(ref value));
                return;

            case TypeCode.Boolean:
                stream->Add(UnsafeUtility.As <TValue, bool>(ref value) ? (byte)1 : (byte)0);
                return;

            case TypeCode.Char:
                stream->Add(UnsafeUtility.As <TValue, char>(ref value));
                return;

            case TypeCode.String:
                stream->Add(value as string);
                return;

            default:
                throw new ArgumentOutOfRangeException();
            }
#else
            switch (Type.GetTypeCode(type))
            {
            case TypeCode.SByte:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, sbyte>(ref value));
                return;

            case TypeCode.Int16:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, short>(ref value));
                return;

            case TypeCode.Int32:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, int>(ref value));
                return;

            case TypeCode.Int64:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, long>(ref value));
                return;

            case TypeCode.Byte:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, byte>(ref value));
                return;

            case TypeCode.UInt16:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, ushort>(ref value));
                return;

            case TypeCode.UInt32:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, uint>(ref value));
                return;

            case TypeCode.UInt64:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, ulong>(ref value));
                return;

            case TypeCode.Single:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, float>(ref value));
                return;

            case TypeCode.Double:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, double>(ref value));
                return;

            case TypeCode.Boolean:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, bool>(ref value) ? (byte)1 : (byte)0);
                return;

            case TypeCode.Char:
                stream->Add(System.Runtime.CompilerServices.Unsafe.As <TValue, char>(ref value));
                return;

            case TypeCode.String:
                stream->Add(value as string);
                return;

            default:
                throw new ArgumentOutOfRangeException();
            }
#endif
        }
コード例 #8
0
ファイル: BlobVariant.cs プロジェクト: longde123/EntitiesBT
 public ref TValue Value <TValue>() where TValue : struct =>
 ref UnsafeUtility.As <int, BlobPtr <TValue> >(ref MetaDataOffsetPtr).Value;
コード例 #9
0
ファイル: EnumComparer.cs プロジェクト: pha3z/Enums.NET
 /// <summary>
 /// Compares <paramref name="x"/> to <paramref name="y"/> without boxing the values.
 /// </summary>
 /// <param name="x">The first enum value.</param>
 /// <param name="y">The second enum value.</param>
 /// <returns>1 if <paramref name="x"/> is greater than <paramref name="y"/>, 0 if <paramref name="x"/> equals <paramref name="y"/>,
 /// and -1 if <paramref name="x"/> is less than <paramref name="y"/>.</returns>
 public int Compare(TEnum x, TEnum y) => s_cache.CompareTo(ref UnsafeUtility.As <TEnum, byte>(ref x), ref UnsafeUtility.As <TEnum, byte>(ref y));
コード例 #10
0
ファイル: EnumComparer.cs プロジェクト: pha3z/Enums.NET
 /// <summary>
 /// Retrieves a hash code for <paramref name="obj"/> without boxing the value.
 /// </summary>
 /// <param name="obj">The enum value.</param>
 /// <returns>Hash code for <paramref name="obj"/> without boxing the value.</returns>
 public int GetHashCode(TEnum obj) => s_cache.GetHashCode(ref UnsafeUtility.As <TEnum, byte>(ref obj));
コード例 #11
0
ファイル: EnumComparer.cs プロジェクト: pha3z/Enums.NET
 /// <summary>
 /// Indicates if <paramref name="x"/> equals <paramref name="y"/> without boxing the values.
 /// </summary>
 /// <param name="x">The first enum value.</param>
 /// <param name="y">The second enum value.</param>
 /// <returns>Indication if <paramref name="x"/> equals <paramref name="y"/> without boxing the values.</returns>
 public bool Equals(TEnum x, TEnum y) => s_cache.Equals(ref UnsafeUtility.As <TEnum, byte>(ref x), ref UnsafeUtility.As <TEnum, byte>(ref y));