using System.Runtime.InteropServices; namespace OpenCvSharp.Internal.Vectors; /// /// public class VectorOfDouble : DisposableCvObject, IStdVector { /// /// Constructor /// public VectorOfDouble() { ptr = NativeMethods.vector_double_new1(); } /// /// Constructor /// /// public VectorOfDouble(nuint size) { if (size < 0) throw new ArgumentOutOfRangeException(nameof(size)); ptr = NativeMethods.vector_double_new2(size); } /// /// Constructor /// /// public VectorOfDouble(IEnumerable data) { if (data is null) throw new ArgumentNullException(nameof(data)); var array = data.ToArray(); ptr = NativeMethods.vector_double_new3(array, (nuint)array.Length); } /// /// Releases unmanaged resources /// protected override void DisposeUnmanaged() { NativeMethods.vector_double_delete(ptr); base.DisposeUnmanaged(); } /// /// vector.size() /// public int Size { get { var res = NativeMethods.vector_double_getSize(ptr); GC.KeepAlive(this); return (int)res; } } /// /// &vector[0] /// public IntPtr ElemPtr { get { var res = NativeMethods.vector_double_getPointer(ptr); GC.KeepAlive(this); return res; } } /// /// Converts std::vector to managed array /// /// public double[] ToArray() { var size = Size; if (size == 0) { return Array.Empty(); } var dst = new double[size]; Marshal.Copy(ElemPtr, dst, 0, dst.Length); 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; } }