using OpenCvSharp.Internal.Util; namespace OpenCvSharp.Internal.Vectors; /// /// // ReSharper disable once InconsistentNaming public class VectorOfVectorPoint2f : DisposableCvObject, IStdVector { /// /// Constructor /// public VectorOfVectorPoint2f() { ptr = NativeMethods.vector_vector_Point2f_new1(); } /// /// Releases unmanaged resources /// protected override void DisposeUnmanaged() { NativeMethods.vector_vector_Point2f_delete(ptr); base.DisposeUnmanaged(); } /// /// vector.size() /// public int GetSize1() { var res = NativeMethods.vector_vector_Point2f_getSize1(ptr); GC.KeepAlive(this); return (int)res; } /// /// /// public int Size => GetSize1(); /// /// vector[i].size() /// public IReadOnlyList GetSize2() { var size1 = GetSize1(); var size2 = new nuint[size1]; NativeMethods.vector_vector_Point2f_getSize2(ptr, size2); GC.KeepAlive(this); return size2.Select(s => (long)s).ToArray(); } /// /// Converts std::vector to managed array /// /// public Point2f[][] ToArray() { var size1 = GetSize1(); if (size1 == 0) return Array.Empty(); var size2 = GetSize2(); var ret = new Point2f[size1][]; for (var i = 0; i < size1; i++) { ret[i] = new Point2f[size2[i]]; } using var retPtr = new ArrayAddress2(ret); NativeMethods.vector_vector_Point2f_copy(ptr, retPtr.GetPointer()); GC.KeepAlive(this); return ret; } }