Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public unsafe struct TriangleArray : IDisposable
- {
- private int _capacity;
- private int _length;
- public int Length => _length;
- private Triangle* _array;
- public Triangle* this[int index]
- {
- get
- {
- return &_array[index];
- }
- set
- {
- _array[index] = *value;
- }
- }
- public TriangleArray(int capacity)
- {
- _array = (Triangle*) Marshal.AllocHGlobal(capacity * sizeof(Triangle)).ToPointer();
- _capacity = capacity;
- _length = 0;
- }
- public void Clear()
- {
- _length = 0;
- }
- public int AddExisting(Triangle item)
- {
- CheckCapacity();
- _array[_length++].CopyFrom(item); //in case GC kills above item
- return _length - 1;
- }
- public Triangle* GetNew()
- {
- CheckCapacity();
- return &_array[_length++];
- }
- public int RemoveAt(int index)
- {
- _array[index] = _array[_length - 1];
- _length--;
- return _length - 1;
- }
- public Triangle[] ToArray()
- {
- var array = new Triangle[_length];
- for (var i = 0; i < _length; i++)
- {
- array[i] = _array[i];
- }
- return array;
- }
- public void Resize(int newCapacity)
- {
- var arrayIntPtr = (IntPtr) _array;
- var newArrayPtr = Marshal.ReAllocHGlobal(arrayIntPtr, (IntPtr)(newCapacity * sizeof(Triangle))).ToPointer();
- Marshal.FreeHGlobal(arrayIntPtr);
- _array = (Triangle*) newArrayPtr;
- _capacity = newCapacity;
- }
- public void Dispose()
- {
- Marshal.FreeHGlobal((IntPtr)_array);
- }
- private void CheckCapacity()
- {
- if (_length >= _capacity - 1)
- {
- Resize(_capacity * 2);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement