VectorOfString.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.Text;
  2. namespace OpenCvSharp.Internal.Vectors;
  3. /// <summary>
  4. /// </summary>
  5. public class VectorOfString : DisposableCvObject, IStdVector<string?>
  6. {
  7. /// <summary>
  8. /// Constructor
  9. /// </summary>
  10. public VectorOfString()
  11. {
  12. ptr = NativeMethods.vector_string_new1();
  13. }
  14. /// <summary>
  15. /// Constructor
  16. /// </summary>
  17. /// <param name="size"></param>
  18. public VectorOfString(nuint size)
  19. {
  20. if (size < 0)
  21. throw new ArgumentOutOfRangeException(nameof(size));
  22. ptr = NativeMethods.vector_string_new2(size);
  23. }
  24. /// <summary>
  25. /// Releases unmanaged resources
  26. /// </summary>
  27. protected override void DisposeUnmanaged()
  28. {
  29. NativeMethods.vector_string_delete(ptr);
  30. base.DisposeUnmanaged();
  31. }
  32. /// <summary>
  33. /// vector.size()
  34. /// </summary>
  35. public int Size
  36. {
  37. get
  38. {
  39. var res = NativeMethods.vector_string_getSize(ptr);
  40. GC.KeepAlive(this);
  41. return (int)res;
  42. }
  43. }
  44. /// <summary>
  45. /// Converts std::vector to managed array
  46. /// </summary>
  47. /// <returns></returns>
  48. public string[] ToArray()
  49. {
  50. var size = Size;
  51. if (size == 0)
  52. return Array.Empty<string>();
  53. var ret = new string[size];
  54. var cStringPointers = new IntPtr[size];
  55. var stringLengths = new int[size];
  56. NativeMethods.vector_string_getElements(ptr, cStringPointers, stringLengths);
  57. for (var i = 0; i < size; i++)
  58. {
  59. unsafe
  60. {
  61. ret[i] = Encoding.UTF8.GetString((byte*) cStringPointers[i], stringLengths[i]);
  62. }
  63. }
  64. GC.KeepAlive(cStringPointers);
  65. GC.KeepAlive(stringLengths);
  66. GC.KeepAlive(this);
  67. return ret;
  68. }
  69. }