VectorOfFloat.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.Runtime.InteropServices;
  2. namespace OpenCvSharp.Internal.Vectors;
  3. /// <summary>
  4. /// </summary>
  5. public class VectorOfFloat : DisposableCvObject, IStdVector<float>
  6. {
  7. /// <summary>
  8. /// Constructor
  9. /// </summary>
  10. public VectorOfFloat()
  11. {
  12. ptr = NativeMethods.vector_float_new1();
  13. }
  14. /// <summary>
  15. /// Constructor
  16. /// </summary>
  17. /// <param name="size"></param>
  18. public VectorOfFloat(nuint size)
  19. {
  20. if (size < 0)
  21. throw new ArgumentOutOfRangeException(nameof(size));
  22. ptr = NativeMethods.vector_float_new2(size);
  23. }
  24. /// <summary>
  25. /// Constructor
  26. /// </summary>
  27. /// <param name="data"></param>
  28. public VectorOfFloat(IEnumerable<float> data)
  29. {
  30. if (data is null)
  31. throw new ArgumentNullException(nameof(data));
  32. var array = data.ToArray();
  33. ptr = NativeMethods.vector_float_new3(array, (nuint)array.Length);
  34. }
  35. /// <summary>
  36. /// Releases unmanaged resources
  37. /// </summary>
  38. protected override void DisposeUnmanaged()
  39. {
  40. NativeMethods.vector_float_delete(ptr);
  41. base.DisposeUnmanaged();
  42. }
  43. /// <summary>
  44. /// vector.size()
  45. /// </summary>
  46. public int Size
  47. {
  48. get
  49. {
  50. var res = NativeMethods.vector_float_getSize(ptr);
  51. GC.KeepAlive(this);
  52. return (int)res;
  53. }
  54. }
  55. /// <summary>
  56. /// &amp;vector[0]
  57. /// </summary>
  58. public IntPtr ElemPtr
  59. {
  60. get
  61. {
  62. var res = NativeMethods.vector_float_getPointer(ptr);
  63. GC.KeepAlive(this);
  64. return res;
  65. }
  66. }
  67. /// <summary>
  68. /// Converts std::vector to managed array
  69. /// </summary>
  70. /// <returns></returns>
  71. public float[] ToArray()
  72. {
  73. var size = Size;
  74. if (size == 0)
  75. {
  76. return Array.Empty<float>();
  77. }
  78. var dst = new float[size];
  79. Marshal.Copy(ElemPtr, dst, 0, dst.Length);
  80. GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so
  81. // make sure we are not disposed until finished with copy.
  82. return dst;
  83. }
  84. }