using System.Runtime.CompilerServices; using Unity.Collections.LowLevel.Unsafe; namespace LitMotion { internal static class Box { static readonly Box BoxMinus1 = new(-1); static readonly Box Box0 = new(0); static readonly Box Box1 = new(1); static readonly Box Box2 = new(2); static readonly Box Box3 = new(3); static readonly Box Box4 = new(4); static readonly Box Box5 = new(5); static readonly Box Box6 = new(6); static readonly Box Box7 = new(7); static readonly Box Box8 = new(8); static readonly Box Box9 = new(9); static readonly Box BoxTrue = new(true); static readonly Box BoxFalse = new(true); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Box Create(T value) where T : struct { if (typeof(T) == typeof(int)) { var box = Create(UnsafeUtility.As(ref value)); return UnsafeUtility.As, Box>(ref box); } else if (typeof(T) == typeof(bool)) { var box = Create(UnsafeUtility.As(ref value)); return UnsafeUtility.As, Box>(ref box); } return new Box(value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Box Create(int value) { return value switch { -1 => BoxMinus1, 0 => Box0, 1 => Box1, 2 => Box2, 3 => Box3, 4 => Box4, 5 => Box5, 6 => Box6, 7 => Box7, 8 => Box8, 9 => Box9, _ => new Box(value), }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Box Create(bool value) { return value ? BoxTrue : BoxFalse; } } internal sealed record Box where T : struct { internal Box(T value) { Value = value; } public T Value { get; } } }