private IEnumerator <EnumMember <TEnum> > Enumerate() { foreach (var member in _members) { yield return(UnsafeUtility.As <EnumMember <TEnum> >(member.EnumMember)); } }
private IEnumerator <TEnum> Enumerate() { foreach (var member in _members) { var v = member.Value; yield return(UnsafeUtility.As <TUnderlying, TEnum>(ref v)); } }
/// <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); }
public bool CustomValidate(object customValidator, TUnderlying value) => UnsafeUtility.As <IEnumValidatorAttribute <TEnum> >(customValidator).IsValid(UnsafeUtility.As <TUnderlying, TEnum>(ref value));
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 }
public ref TValue Value <TValue>() where TValue : struct => ref UnsafeUtility.As <int, BlobPtr <TValue> >(ref MetaDataOffsetPtr).Value;
/// <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));
/// <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));
/// <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));