Queue.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. namespace NativeCollection
  4. {
  5. public unsafe class Queue<T> : INativeCollectionClass where T : unmanaged
  6. {
  7. private UnsafeType.Queue<T>* _queue;
  8. public Queue(int capacity = 10)
  9. {
  10. _queue = UnsafeType.Queue<T>.Create(capacity);
  11. IsDisposed = false;
  12. }
  13. public int Count => _queue->Count;
  14. public void Dispose()
  15. {
  16. if (IsDisposed)
  17. {
  18. return;
  19. }
  20. if (_queue != null)
  21. {
  22. _queue->Dispose();
  23. NativeMemoryHelper.Free(_queue);
  24. GC.RemoveMemoryPressure(Unsafe.SizeOf<UnsafeType.Queue<T>>());
  25. IsDisposed = true;
  26. }
  27. }
  28. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  29. public void Clear()
  30. {
  31. _queue->Clear();
  32. }
  33. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  34. public void Enqueue(in T item)
  35. {
  36. _queue->Enqueue(item);
  37. }
  38. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  39. public T Dequeue()
  40. {
  41. return _queue->Dequeue();
  42. }
  43. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  44. public bool TryDequeue(out T result)
  45. {
  46. var value = _queue->TryDequeue(out result);
  47. return value;
  48. }
  49. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  50. public T Peek()
  51. {
  52. return _queue->Peek();
  53. }
  54. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  55. public bool TryPeek(out T result)
  56. {
  57. var value = _queue->TryPeek(out result);
  58. return value;
  59. }
  60. ~Queue()
  61. {
  62. Dispose();
  63. }
  64. public void ReInit()
  65. {
  66. if (IsDisposed)
  67. {
  68. _queue = UnsafeType.Queue<T>.Create();
  69. IsDisposed = false;
  70. }
  71. }
  72. public bool IsDisposed { get; private set; }
  73. }
  74. }