package cpp.marshal; import cpp.Pointer; import cpp.Star; import cpp.RawPointer; import cpp.Char; import cpp.UInt8; import cpp.NativeString; import haxe.io.Bytes; import haxe.io.ArrayBufferView; import haxe.io.Float32Array; import haxe.io.Float64Array; import haxe.io.Int32Array; import haxe.io.UInt32Array; import haxe.io.UInt16Array; import haxe.io.UInt8Array; import haxe.ds.Vector; import haxe.extern.AsVar; import haxe.exceptions.ArgumentException; final class ViewExtensions { public static inline overload extern function asView(source:Pointer, length:Int):View { return new View(source, length); } public static inline overload extern function asView(source:Star, length:Int):View { return new View(Pointer.fromStar(source), length); } public static inline overload extern function asView(source:RawPointer, length:Int):View { return new View(Pointer.fromRaw(source), length); } public static inline overload extern function asView(source:Array):View { return new View(Pointer.ofArray(source), source.length); } public static inline overload extern function asView(source:Vector):View { return new View(Pointer.ofArray(source.toData()), source.length); } public static inline overload extern function asView(source:Bytes):View { return new View(Pointer.ofArray(source.getData()), source.length); } public static inline overload extern function asView(source:ArrayBufferView):View { return asView(source.buffer).slice(source.byteOffset, source.byteLength); } public static inline overload extern function asView(source:Float32Array):View { return asView(source.view).reinterpret(); } public static inline overload extern function asView(source:Float64Array):View { return asView(source.view).reinterpret(); } public static inline overload extern function asView(source:Int32Array):View { return asView(source.view).reinterpret(); } public static inline overload extern function asView(source:UInt32Array):View { return asView(source.view).reinterpret(); } public static inline overload extern function asView(source:UInt16Array):View { return asView(source.view).reinterpret(); } public static inline overload extern function asView(source:UInt8Array):View { return asView(source.view).reinterpret(); } public static inline extern function refAsView(source:AsVar):View { return new View(Pointer.addressOf(source), 1); } public static inline extern function empty():View { return new View(null, 0); } public static inline extern function asBytesView(source:View):View { return source.reinterpret(); } @:unreflective @:generic public static function toArray(source:View):Array { if (source.length > 2147483647) { throw new ArgumentException("source"); } final output = cpp.NativeArray.create(source.length); final destination = asView(output); source.copyTo(destination); return output; } @:unreflective @:generic public static function toVector(source:View):Vector { if (source.length > 2147483647) { throw new ArgumentException("source"); } final output = new Vector(source.length); final destination = asView(output); source.copyTo(destination); return output; } @:unreflective @:generic public static function toBytes(source:View):Bytes { final bytes = asBytesView(source); if (bytes.length > 2147483647) { throw new ArgumentException("source"); } final output = Bytes.alloc(bytes.length); final destination = ViewExtensions.asView(output); bytes.copyTo(destination); return output; } }