using System.Runtime.InteropServices; using OpenCvSharp.Internal.Util; namespace OpenCvSharp.Internal.Vectors; /// /// // ReSharper disable once InconsistentNaming public class VectorOfVec2f : DisposableCvObject, IStdVector { /// /// Constructor /// public VectorOfVec2f() { ptr = NativeMethods.vector_Vec2f_new1(); } /// /// Releases unmanaged resources /// protected override void DisposeUnmanaged() { NativeMethods.vector_Vec2f_delete(ptr); base.DisposeUnmanaged(); } /// /// vector.size() /// public int Size { get { var res = NativeMethods.vector_Vec2f_getSize(ptr); GC.KeepAlive(this); return (int)res; } } /// /// &vector[0] /// public IntPtr ElemPtr { get { var res = NativeMethods.vector_Vec2f_getPointer(ptr); GC.KeepAlive(this); return res; } } /// /// Converts std::vector to managed array /// /// public Vec2f[] ToArray() { return ToArray(); } /// /// Converts std::vector to managed array /// /// structure that has two float members (ex. CvLineSegmentPolar, CvPoint2D32f, PointF) /// public T[] ToArray() where T : unmanaged { var typeSize = Marshal.SizeOf(); if (typeSize != sizeof (float)*2) throw new OpenCvSharpException($"Unsupported type '{typeof(T)}'"); var arySize = Size; if (arySize == 0) { return Array.Empty(); } else { var dst = new T[arySize]; using (var dstPtr = new ArrayAddress1(dst)) { long bytesToCopy = typeSize * dst.Length; unsafe { Buffer.MemoryCopy(ElemPtr.ToPointer(), dstPtr.Pointer.ToPointer(), bytesToCopy, bytesToCopy); } } GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so // make sure we are not disposed until finished with copy. return dst; } } }