Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.12 KB | None | 0 0
  1.     public unsafe struct TriangleArray : IDisposable
  2.     {
  3.         private int _capacity;
  4.  
  5.         private int _length;
  6.         public int Length => _length;
  7.  
  8.         private Triangle* _array;
  9.  
  10.         public Triangle* this[int index]
  11.         {
  12.             get
  13.             {
  14.                 return &_array[index];
  15.             }
  16.             set
  17.             {
  18.                 _array[index] = *value;
  19.             }
  20.         }
  21.  
  22.         public TriangleArray(int capacity)
  23.         {
  24.             _array = (Triangle*) Marshal.AllocHGlobal(capacity * sizeof(Triangle)).ToPointer();
  25.             _capacity = capacity;
  26.             _length = 0;
  27.         }
  28.  
  29.         public void Clear()
  30.         {
  31.             _length = 0;
  32.         }
  33.        
  34.         public int AddExisting(Triangle item)
  35.         {
  36.             CheckCapacity();
  37.             _array[_length++].CopyFrom(item); //in case GC kills above item
  38.             return _length - 1;
  39.         }
  40.  
  41.         public Triangle* GetNew()
  42.         {
  43.             CheckCapacity();
  44.             return &_array[_length++];
  45.         }
  46.  
  47.         public int RemoveAt(int index)
  48.         {
  49.             _array[index] = _array[_length - 1];
  50.             _length--;
  51.             return _length - 1;
  52.         }
  53.  
  54.         public Triangle[] ToArray()
  55.         {
  56.             var array = new Triangle[_length];
  57.             for (var i = 0; i < _length; i++)
  58.             {
  59.                 array[i] = _array[i];
  60.             }
  61.             return array;
  62.         }
  63.  
  64.         public void Resize(int newCapacity)
  65.         {
  66.             var arrayIntPtr = (IntPtr) _array;
  67.             var newArrayPtr = Marshal.ReAllocHGlobal(arrayIntPtr, (IntPtr)(newCapacity * sizeof(Triangle))).ToPointer();
  68.             Marshal.FreeHGlobal(arrayIntPtr);
  69.             _array = (Triangle*) newArrayPtr;
  70.             _capacity = newCapacity;
  71.         }
  72.  
  73.         public void Dispose()
  74.         {
  75.             Marshal.FreeHGlobal((IntPtr)_array);
  76.         }
  77.  
  78.         private void CheckCapacity()
  79.         {
  80.             if (_length >= _capacity - 1)
  81.             {
  82.                 Resize(_capacity * 2);
  83.             }
  84.         }
  85.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement