VectorOfVec2f.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 VectorOfVec2f : DisposableCvObject, IStdVector<Vec2f>
  8. {
  9. /// <summary>
  10. /// Constructor
  11. /// </summary>
  12. public VectorOfVec2f()
  13. {
  14. ptr = NativeMethods.vector_Vec2f_new1();
  15. }
  16. /// <summary>
  17. /// Releases unmanaged resources
  18. /// </summary>
  19. protected override void DisposeUnmanaged()
  20. {
  21. NativeMethods.vector_Vec2f_delete(ptr);
  22. base.DisposeUnmanaged();
  23. }
  24. /// <summary>
  25. /// vector.size()
  26. /// </summary>
  27. public int Size
  28. {
  29. get
  30. {
  31. var res = NativeMethods.vector_Vec2f_getSize(ptr);
  32. GC.KeepAlive(this);
  33. return (int)res;
  34. }
  35. }
  36. /// <summary>
  37. /// &amp;vector[0]
  38. /// </summary>
  39. public IntPtr ElemPtr
  40. {
  41. get
  42. {
  43. var res = NativeMethods.vector_Vec2f_getPointer(ptr);
  44. GC.KeepAlive(this);
  45. return res;
  46. }
  47. }
  48. /// <summary>
  49. /// Converts std::vector to managed array
  50. /// </summary>
  51. /// <returns></returns>
  52. public Vec2f[] ToArray()
  53. {
  54. return ToArray<Vec2f>();
  55. }
  56. /// <summary>
  57. /// Converts std::vector to managed array
  58. /// </summary>
  59. /// <typeparam name="T">structure that has two float members (ex. CvLineSegmentPolar, CvPoint2D32f, PointF)</typeparam>
  60. /// <returns></returns>
  61. public T[] ToArray<T>() where T : unmanaged
  62. {
  63. var typeSize = Marshal.SizeOf<T>();
  64. if (typeSize != sizeof (float)*2)
  65. throw new OpenCvSharpException($"Unsupported type '{typeof(T)}'");
  66. var arySize = Size;
  67. if (arySize == 0)
  68. {
  69. return Array.Empty<T>();
  70. }
  71. else
  72. {
  73. var dst = new T[arySize];
  74. using (var dstPtr = new ArrayAddress1<T>(dst))
  75. {
  76. long bytesToCopy = typeSize * dst.Length;
  77. unsafe
  78. {
  79. Buffer.MemoryCopy(ElemPtr.ToPointer(), dstPtr.Pointer.ToPointer(), bytesToCopy, bytesToCopy);
  80. }
  81. }
  82. GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so
  83. // make sure we are not disposed until finished with copy.
  84. return dst;
  85. }
  86. }
  87. }