ArrayAddress2.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Runtime.InteropServices;
  2. namespace OpenCvSharp.Internal.Util;
  3. /// <summary>
  4. /// Class to get address of specified jagged array
  5. /// </summary>
  6. /// <typeparam name="T"></typeparam>
  7. public class ArrayAddress2<T> : DisposableObject
  8. where T : unmanaged
  9. {
  10. private readonly T[][] array;
  11. private readonly GCHandle[] gch;
  12. private readonly IntPtr[] ptr;
  13. /// <summary>
  14. ///
  15. /// </summary>
  16. /// <param name="array"></param>
  17. public ArrayAddress2(T[][] array)
  18. {
  19. this.array = array ?? throw new ArgumentNullException(nameof(array));
  20. // T[][]をIntPtr[]に変換する
  21. ptr = new IntPtr[array.Length];
  22. gch = new GCHandle[array.Length];
  23. for (var i = 0; i < array.Length; i++)
  24. {
  25. var elem = array[i];
  26. if (elem is null/* || elem.Length == 0*/)
  27. throw new ArgumentException($"array[{i}] is not valid array object.");
  28. // メモリ確保
  29. gch[i] = GCHandle.Alloc(elem, GCHandleType.Pinned);
  30. ptr[i] = gch[i].AddrOfPinnedObject();
  31. }
  32. }
  33. /// <summary>
  34. ///
  35. /// </summary>
  36. /// <param name="enumerable"></param>
  37. public ArrayAddress2(IEnumerable<IEnumerable<T>> enumerable)
  38. : this(enumerable.Select(x => x.ToArray()).ToArray())
  39. {
  40. }
  41. /// <summary>
  42. /// Releases unmanaged resources
  43. /// </summary>
  44. protected override void DisposeUnmanaged()
  45. {
  46. foreach (var h in gch)
  47. {
  48. if (h.IsAllocated)
  49. {
  50. h.Free();
  51. }
  52. }
  53. base.DisposeUnmanaged();
  54. }
  55. /// <summary>
  56. /// </summary>
  57. public IntPtr[] GetPointer()
  58. {
  59. return ptr;
  60. }
  61. /// <summary>
  62. /// </summary>
  63. #pragma warning disable CA1024 // Use properties where appropriate
  64. public int GetDim1Length() => array.Length;
  65. #pragma warning restore CA1024 // Use properties where appropriate
  66. /// <summary>
  67. /// </summary>
  68. public int[] GetDim2Lengths()
  69. {
  70. var lengths = new int[array.Length];
  71. for (var i = 0; i < array.Length; i++)
  72. {
  73. lengths[i] = array[i].Length;
  74. }
  75. return lengths;
  76. }
  77. }