using System.Runtime.InteropServices;
using OpenCvSharp.Internal.Util;
namespace OpenCvSharp.Internal.Vectors;
///
///
// ReSharper disable once InconsistentNaming
internal class VectorOfVec6f : DisposableCvObject, IStdVector
{
///
/// Constructor
///
public VectorOfVec6f()
{
ptr = NativeMethods.vector_Vec6f_new1();
}
///
/// Releases unmanaged resources
///
protected override void DisposeUnmanaged()
{
NativeMethods.vector_Vec6f_delete(ptr);
base.DisposeUnmanaged();
}
///
/// vector.size()
///
public int Size
{
get
{
var res = NativeMethods.vector_Vec6f_getSize(ptr);
GC.KeepAlive(this);
return (int)res;
}
}
///
/// &vector[0]
///
public IntPtr ElemPtr
{
get
{
var res = NativeMethods.vector_Vec6f_getPointer(ptr);
GC.KeepAlive(this);
return res;
}
}
///
/// Converts std::vector to managed array
///
///
public Vec6f[] ToArray()
{
return ToArray();
}
///
/// Converts std::vector to managed array
///
/// structure that has four int members (ex. CvLineSegmentPoint, CvRect)
///
public T[] ToArray() where T : unmanaged
{
var typeSize = Marshal.SizeOf();
if (typeSize != sizeof (float)*6)
throw new OpenCvSharpException($"Unsupported type '{typeof(T)}'");
var arySize = Size;
if (arySize == 0)
{
return Array.Empty();
}
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;
}
}