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); }