VectorOfVec4f.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System.Runtime.InteropServices;
  2. using OpenCvSharp.Internal.Util;
  3. namespace OpenCvSharp.Internal.Vectors;
  4. /// <summary>
  5. /// </summary>
  6. // ReSharper disable once InconsistentNaming
  7. public class VectorOfVec4f : DisposableCvObject, IStdVector<Vec4f>
  8. {
  9. /// <summary>
  10. /// Constructor
  11. /// </summary>
  12. public VectorOfVec4f()
  13. {
  14. ptr = NativeMethods.vector_Vec4f_new1();
  15. }
  16. /// <summary>
  17. /// Constructor
  18. /// </summary>
  19. /// <param name="data"></param>
  20. public VectorOfVec4f(IEnumerable<Vec4f> data)
  21. {
  22. if (data is null)
  23. throw new ArgumentNullException(nameof(data));
  24. var array = data.ToArray();
  25. ptr = NativeMethods.vector_Vec4f_new3(array, (nuint)array.Length);
  26. }
  27. /// <summary>
  28. /// Releases unmanaged resources
  29. /// </summary>
  30. protected override void DisposeUnmanaged()
  31. {
  32. NativeMethods.vector_Vec4f_delete(ptr);
  33. base.DisposeUnmanaged();
  34. }
  35. /// <summary>
  36. /// vector.size()
  37. /// </summary>
  38. public int Size
  39. {
  40. get
  41. {
  42. var res = NativeMethods.vector_Vec4f_getSize(ptr);
  43. GC.KeepAlive(this);
  44. return (int)res;
  45. }
  46. }
  47. /// <summary>
  48. /// &amp;vector[0]
  49. /// </summary>
  50. public IntPtr ElemPtr
  51. {
  52. get
  53. {
  54. var res = NativeMethods.vector_Vec4f_getPointer(ptr);
  55. GC.KeepAlive(this);
  56. return res;
  57. }
  58. }
  59. /// <summary>
  60. /// Converts std::vector to managed array
  61. /// </summary>
  62. /// <returns></returns>
  63. public Vec4f[] ToArray()
  64. {
  65. return ToArray<Vec4f>();
  66. }
  67. /// <summary>
  68. /// Converts std::vector to managed array
  69. /// </summary>
  70. /// <typeparam name="T">structure that has four int members (ex. CvLineSegmentPoint, CvRect)</typeparam>
  71. /// <returns></returns>
  72. public T[] ToArray<T>() where T : unmanaged
  73. {
  74. var typeSize = Marshal.SizeOf<T>();
  75. if (typeSize != sizeof (float)*4)
  76. throw new OpenCvSharpException($"Unsupported type '{typeof(T)}'");
  77. var arySize = Size;
  78. if (arySize == 0)
  79. {
  80. return Array.Empty<T>();
  81. }
  82. var dst = new T[arySize];
  83. using (var dstPtr = new ArrayAddress1<T>(dst))
  84. {
  85. long bytesToCopy = typeSize * dst.Length;
  86. unsafe
  87. {
  88. Buffer.MemoryCopy(ElemPtr.ToPointer(), dstPtr.Pointer.ToPointer(), bytesToCopy, bytesToCopy);
  89. }
  90. }
  91. GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so
  92. // make sure we are not disposed until finished with copy.
  93. return dst;
  94. }
  95. }