From 5fba35a0a207072961c93d62940e8c3c18e4e75a Mon Sep 17 00:00:00 2001 From: Pasha Date: Fri, 15 May 2026 21:43:28 +0100 Subject: [PATCH] Added unique --- Assets/Pacore/Runtime/MemUtil.meta | 8 ++ Assets/Pacore/Runtime/MemUtil/Unique.cs | 82 ++++++++++++++++++++ Assets/Pacore/Runtime/MemUtil/Unique.cs.meta | 11 +++ Assets/Pacore/Runtime/Pacore.asmdef | 2 +- 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 Assets/Pacore/Runtime/MemUtil.meta create mode 100644 Assets/Pacore/Runtime/MemUtil/Unique.cs create mode 100644 Assets/Pacore/Runtime/MemUtil/Unique.cs.meta diff --git a/Assets/Pacore/Runtime/MemUtil.meta b/Assets/Pacore/Runtime/MemUtil.meta new file mode 100644 index 0000000..cc17c17 --- /dev/null +++ b/Assets/Pacore/Runtime/MemUtil.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9b64dde6eaaefc498098e1b5641cb52 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Pacore/Runtime/MemUtil/Unique.cs b/Assets/Pacore/Runtime/MemUtil/Unique.cs new file mode 100644 index 0000000..ec55a1d --- /dev/null +++ b/Assets/Pacore/Runtime/MemUtil/Unique.cs @@ -0,0 +1,82 @@ +using Unity.Collections.LowLevel.Unsafe; +using System.Runtime.CompilerServices; +using System.Diagnostics; +using Unity.Collections; +using System; + +namespace PashaBibko.Pacore.MemUtil +{ + public unsafe struct Unique : IDisposable + where T : unmanaged + { + private T* mPtr; + + public bool IsValid + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => mPtr != null; + } + + public T Value + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + DebugOnly_CheckValid(); + return *mPtr; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + DebugOnly_CheckValid(); + *mPtr = value; + } + } + + public ref T Ref + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + DebugOnly_CheckValid(); + return ref *mPtr; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Unique Create(T val = default) + { + T* ptr = (T*)UnsafeUtility.Malloc + ( + sizeof(T), + UnsafeUtility.SizeOf(), + Allocator.Persistent + ); + *ptr = val; + + return new Unique { mPtr = ptr }; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Dispose() + { + if (IsValid) + { + UnsafeUtility.Free(mPtr, Allocator.Persistent); + } + } + + [Conditional("UNITY_EDITOR")] + private void DebugOnly_CheckValid() + { + if (!IsValid) + { + throw new InvalidOperationException + ( + $"Owned<{nameof(T)}> was expected to be valid." + ); + } + } + } +} diff --git a/Assets/Pacore/Runtime/MemUtil/Unique.cs.meta b/Assets/Pacore/Runtime/MemUtil/Unique.cs.meta new file mode 100644 index 0000000..e666f7c --- /dev/null +++ b/Assets/Pacore/Runtime/MemUtil/Unique.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f4ac012a56e2aa9429ff4f33c5554e7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Pacore/Runtime/Pacore.asmdef b/Assets/Pacore/Runtime/Pacore.asmdef index 8c723c7..a38b8ad 100644 --- a/Assets/Pacore/Runtime/Pacore.asmdef +++ b/Assets/Pacore/Runtime/Pacore.asmdef @@ -4,7 +4,7 @@ "references": [], "includePlatforms": [], "excludePlatforms": [], - "allowUnsafeCode": false, + "allowUnsafeCode": true, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true,