using Qrakhen.Qamp.Core.Values.Objects; using System.Runtime.InteropServices; using Qrakhen.Qamp.Core.Collections; using System.Diagnostics.CodeAnalysis; namespace Qrakhen.Qamp.Core.Values; [StructLayout(LayoutKind.Sequential, Size = sizeof(ulong))] public readonly struct Ptr { private static readonly PushStack _register = new(0x10); [Serialized] public readonly Address Address; //private readonly IntPtr _pointer; //public IntPtr Pointer => _pointer; public Obj? Value { get { if (_register.TryGet(Address, out Obj obj)) return obj; return null; //if (_pointer == IntPtr.Zero) // throw new ObjectDisposedException(nameof(Ptr)); //return (Obj)GCHandle.FromIntPtr(_pointer).Target!; } } public Ptr(Obj obj) { //_pointer = GCHandle.ToIntPtr(GCHandle.Alloc(obj, GCHandleType.Normal)); Address = _register.Add(obj); } public T? As(bool throwWhenNull = true) where T : Obj { T? value = Value as T; if (value == null && throwWhenNull) throw new RuntimeException($"Could not convert Object {Value} to target type {typeof(T)}.", Value); return value; } public override string ToString() => $"0x{Value}"; }