public void EnsureAllocation(ref RegionHandle <T> handle, int capacity) { if (handle.IsNull) { handle = Allocate(capacity); } else { if (capacity > heaps[handle.HeapIndex].Length) { var newHandle = Allocate(capacity); for (int i = 0; i < heaps[handle.HeapIndex].Length; i++) { newHandle.Handle.Array[newHandle.Handle.Offset + i] = handle.Handle.Array[handle.Handle.Offset + i]; } for (int i = heaps[handle.HeapIndex].Length; i < heaps[newHandle.HeapIndex].Length; i++) { newHandle.Handle.Array[newHandle.Handle.Offset + i] = default(T); } Release(ref handle); handle = newHandle; } } }
public void Release(ref RegionHandle<T> handle) { if (!handle.IsNull) { heaps[handle.HeapIndex].Release(handle.HeapOffset); handle = new RegionHandle<T>(); } }
public RegionHandle<T> Dereference(int identifier) { var result = new RegionHandle<T>(identifier); if (!result.IsNull) result.Handle = heaps[result.HeapIndex].Dereference(result.HeapOffset); return result; }
public RegionHandle<T> Allocate(int capacity) { var index = 0; while (capacity > heaps[index].Length) index++; var result = new RegionHandle<T>(heaps[index].Allocate(), index); result.Handle = heaps[result.HeapIndex].Dereference(result.HeapOffset); return result; }