using OpenCvSharp.Internal.Util;
namespace OpenCvSharp.Internal.Vectors;
///
///
public class VectorOfVectorPoint : DisposableCvObject, IStdVector
{
///
/// Constructor
///
public VectorOfVectorPoint()
{
ptr = NativeMethods.vector_vector_Point_new1();
}
///
/// Constructor
///
///
public VectorOfVectorPoint(nuint size)
{
if (size < 0)
throw new ArgumentOutOfRangeException(nameof(size));
ptr = NativeMethods.vector_vector_Point_new2(size);
}
///
/// Releases unmanaged resources
///
protected override void DisposeUnmanaged()
{
NativeMethods.vector_vector_Point_delete(ptr);
base.DisposeUnmanaged();
}
///
/// vector.size()
///
public int GetSize1()
{
var res = NativeMethods.vector_vector_Point_getSize1(ptr);
GC.KeepAlive(this);
return (int)res;
}
///
///
///
public int Size => GetSize1();
///
/// vector.size()
///
public IReadOnlyList GetSize2()
{
var size1 = GetSize1();
var size2 = new nuint[size1];
NativeMethods.vector_vector_Point_getSize2(ptr, size2);
GC.KeepAlive(this);
return size2.Select(s => (long)s).ToArray();
}
///
/// Converts std::vector to managed array
///
///
public Point[][] ToArray()
{
var size1 = GetSize1();
if (size1 == 0)
return Array.Empty();
var size2 = GetSize2();
var ret = new Point[size1][];
for (var i = 0; i < size1; i++)
{
ret[i] = new Point[size2[i]];
}
using var retPtr = new ArrayAddress2(ret);
NativeMethods.vector_vector_Point_copy(ptr, retPtr.GetPointer());
GC.KeepAlive(this);
return ret;
}
}