#if ENABLE_UNSAFE_MSGPACK using MessagePack.Formatters; using System; using System.Collections.Generic; using UnityEngine; namespace MessagePack.Unity.Extension { /// /// Special Resolver for Vector2[], Vector3[], Vector4[], Quaternion[], Color[], Bounds[], Rect[] /// public class UnityBlitResolver : IFormatterResolver { public static IFormatterResolver Instance = new UnityBlitResolver(); UnityBlitResolver() { } public IMessagePackFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IMessagePackFormatter formatter; static FormatterCache() { formatter = (IMessagePackFormatter)UnityBlitResolverGetFormatterHelper.GetFormatter(typeof(T)); } } } /// /// Special Resolver for Vector2[], Vector3[], Vector4[], Quaternion[], Color[], Bounds[], Rect[] + int[], float[], double[] /// public class UnityBlitWithPrimitiveArrayResolver : IFormatterResolver { public static IFormatterResolver Instance = new UnityBlitWithPrimitiveArrayResolver(); UnityBlitWithPrimitiveArrayResolver() { } public IMessagePackFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IMessagePackFormatter formatter; static FormatterCache() { formatter = (IMessagePackFormatter)UnityBlitWithPrimitiveResolverGetFormatterHelper.GetFormatter(typeof(T)); if (formatter == null) { formatter = UnityBlitResolver.Instance.GetFormatter(); } } } } internal static class UnityBlitResolverGetFormatterHelper { static readonly Dictionary formatterMap = new Dictionary() { {typeof(Vector2[]), typeof(Vector2ArrayBlitFormatter)}, {typeof(Vector3[]), typeof(Vector3ArrayBlitFormatter)}, {typeof(Vector4[]), typeof(Vector4ArrayBlitFormatter)}, {typeof(Quaternion[]), typeof(QuaternionArrayBlitFormatter)}, {typeof(Color[]), typeof(ColorArrayBlitFormatter)}, {typeof(Bounds[]), typeof(BoundsArrayBlitFormatter)}, {typeof(Rect[]), typeof(RectArrayBlitFormatter)}, }; internal static object GetFormatter(Type t) { Type formatterType; if (formatterMap.TryGetValue(t, out formatterType)) { return Activator.CreateInstance(formatterType); } return null; } } internal static class UnityBlitWithPrimitiveResolverGetFormatterHelper { static readonly Dictionary formatterMap = new Dictionary() { {typeof(int[]), typeof(IntArrayBlitFormatter)}, {typeof(float[]), typeof(FloatArrayBlitFormatter)}, {typeof(double[]), typeof(DoubleArrayBlitFormatter)}, }; internal static object GetFormatter(Type t) { Type formatterType; if (formatterMap.TryGetValue(t, out formatterType)) { return Activator.CreateInstance(formatterType); } return null; } } } #endif