|
@@ -9,6 +9,11 @@ namespace System
|
|
|
void Free(void* ptr);
|
|
|
}
|
|
|
|
|
|
+ interface ITypedAllocator : IRawAllocator
|
|
|
+ {
|
|
|
+ void* AllocTyped(Type type, int size, int align);
|
|
|
+ }
|
|
|
+
|
|
|
struct StdAllocator : IRawAllocator
|
|
|
{
|
|
|
public void* Alloc(int size, int align)
|
|
@@ -22,6 +27,76 @@ namespace System
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ class SingleAllocator : ITypedAllocator
|
|
|
+ {
|
|
|
+ void* mPtr;
|
|
|
+ int mSize;
|
|
|
+ Type mType;
|
|
|
+
|
|
|
+ [AllowAppend]
|
|
|
+ public this(int size)
|
|
|
+ {
|
|
|
+ void* ptr = append uint8[size]*(?);
|
|
|
+ mPtr = ptr;
|
|
|
+ mSize = size;
|
|
|
+ }
|
|
|
+
|
|
|
+ public ~this()
|
|
|
+ {
|
|
|
+ if ((mType != null) && (mType.IsObject))
|
|
|
+ {
|
|
|
+ Object obj = Internal.UnsafeCastToObject(mPtr);
|
|
|
+ delete:null obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mSize < 0)
|
|
|
+ delete mPtr;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual void* AllocLarge(int size, int align)
|
|
|
+ {
|
|
|
+ return new uint8[size]*;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual void FreeLarge(void* ptr)
|
|
|
+ {
|
|
|
+ delete ptr;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void* Alloc(int size, int align)
|
|
|
+ {
|
|
|
+ return AllocTyped(typeof(void), size, align);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Free(void* ptr)
|
|
|
+ {
|
|
|
+ Runtime.Assert(ptr == mPtr);
|
|
|
+ mType = typeof(void);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Optimize]
|
|
|
+ public void* AllocTyped(Type type, int size, int align)
|
|
|
+ {
|
|
|
+ Runtime.Assert(mType == null, "SingleAllocator has been used for multiple allocations");
|
|
|
+
|
|
|
+ mType = type;
|
|
|
+ do
|
|
|
+ {
|
|
|
+ if (size > size)
|
|
|
+ break;
|
|
|
+ void* usePtr = (void*)(int)Math.Align((int)mPtr, align);
|
|
|
+ if ((uint8*)usePtr + size > (uint8*)mPtr + mSize)
|
|
|
+ break;
|
|
|
+ mPtr = usePtr;
|
|
|
+ mSize = 0;
|
|
|
+ return mPtr;
|
|
|
+ }
|
|
|
+ mSize = -1;
|
|
|
+ mPtr = AllocLarge(size, align);
|
|
|
+ return mPtr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
struct AllocWrapper<T> where T : new, delete
|
|
|
{
|
|
|
alloctype(T) mVal;
|