ViewExtensions.hx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package cpp.marshal;
  2. import cpp.Pointer;
  3. import cpp.Star;
  4. import cpp.RawPointer;
  5. import cpp.Char;
  6. import cpp.UInt8;
  7. import cpp.NativeString;
  8. import haxe.io.Bytes;
  9. import haxe.io.ArrayBufferView;
  10. import haxe.io.Float32Array;
  11. import haxe.io.Float64Array;
  12. import haxe.io.Int32Array;
  13. import haxe.io.UInt32Array;
  14. import haxe.io.UInt16Array;
  15. import haxe.io.UInt8Array;
  16. import haxe.ds.Vector;
  17. import haxe.extern.AsVar;
  18. import haxe.exceptions.ArgumentException;
  19. final class ViewExtensions {
  20. public static inline overload extern function asView<T>(source:Pointer<T>, length:Int):View<T> {
  21. return new View(source, length);
  22. }
  23. public static inline overload extern function asView<T>(source:Star<T>, length:Int):View<T> {
  24. return new View(Pointer.fromStar(source), length);
  25. }
  26. public static inline overload extern function asView<T>(source:RawPointer<T>, length:Int):View<T> {
  27. return new View(Pointer.fromRaw(source), length);
  28. }
  29. public static inline overload extern function asView<T>(source:Array<T>):View<T> {
  30. return new View(Pointer.ofArray(source), source.length);
  31. }
  32. public static inline overload extern function asView<T>(source:Vector<T>):View<T> {
  33. return new View(Pointer.ofArray(source.toData()), source.length);
  34. }
  35. public static inline overload extern function asView(source:Bytes):View<UInt8> {
  36. return new View(Pointer.ofArray(source.getData()), source.length);
  37. }
  38. public static inline overload extern function asView(source:ArrayBufferView):View<UInt8> {
  39. return asView(source.buffer).slice(source.byteOffset, source.byteLength);
  40. }
  41. public static inline overload extern function asView(source:Float32Array):View<cpp.Float32> {
  42. return asView(source.view).reinterpret();
  43. }
  44. public static inline overload extern function asView(source:Float64Array):View<cpp.Float64> {
  45. return asView(source.view).reinterpret();
  46. }
  47. public static inline overload extern function asView(source:Int32Array):View<cpp.Int32> {
  48. return asView(source.view).reinterpret();
  49. }
  50. public static inline overload extern function asView(source:UInt32Array):View<cpp.UInt32> {
  51. return asView(source.view).reinterpret();
  52. }
  53. public static inline overload extern function asView(source:UInt16Array):View<cpp.UInt16> {
  54. return asView(source.view).reinterpret();
  55. }
  56. public static inline overload extern function asView(source:UInt8Array):View<cpp.UInt8> {
  57. return asView(source.view).reinterpret();
  58. }
  59. public static inline extern function refAsView<T>(source:AsVar<T>):View<T> {
  60. return new View(Pointer.addressOf(source), 1);
  61. }
  62. public static inline extern function empty<T>():View<T> {
  63. return new View(null, 0);
  64. }
  65. public static inline extern function asBytesView<T>(source:View<T>):View<UInt8> {
  66. return source.reinterpret();
  67. }
  68. @:unreflective @:generic public static function toArray<T>(source:View<T>):Array<T> {
  69. if (source.length > 2147483647) {
  70. throw new ArgumentException("source");
  71. }
  72. final output = cpp.NativeArray.create(source.length);
  73. final destination = asView(output);
  74. source.copyTo(destination);
  75. return output;
  76. }
  77. @:unreflective @:generic public static function toVector<T>(source:View<T>):Vector<T> {
  78. if (source.length > 2147483647) {
  79. throw new ArgumentException("source");
  80. }
  81. final output = new Vector(source.length);
  82. final destination = asView(output);
  83. source.copyTo(destination);
  84. return output;
  85. }
  86. @:unreflective @:generic public static function toBytes<T>(source:View<T>):Bytes {
  87. final bytes = asBytesView(source);
  88. if (bytes.length > 2147483647) {
  89. throw new ArgumentException("source");
  90. }
  91. final output = Bytes.alloc(bytes.length);
  92. final destination = ViewExtensions.asView(output);
  93. bytes.copyTo(destination);
  94. return output;
  95. }
  96. }