367 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			367 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package kha.arrays;
 | |
| 
 | |
| import cpp.vm.Gc;
 | |
| 
 | |
| class ByteArrayPrivate {
 | |
| 	public var self: ByteBuffer;
 | |
| 	public var byteArrayOffset: Int;
 | |
| 	public var byteArrayLength: Int;
 | |
| 
 | |
| 	public inline function new(offset: Int, length: Int) {
 | |
| 		this.byteArrayOffset = offset;
 | |
| 		this.byteArrayLength = length;
 | |
| 
 | |
| 		Gc.setFinalizer(this, cpp.Function.fromStaticFunction(finalize));
 | |
| 	}
 | |
| 
 | |
| 	@:void static function finalize(arr: ByteArrayPrivate): Void {
 | |
| 		arr.self.subRef();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| abstract ByteArray(ByteArrayPrivate) {
 | |
| 	public var buffer(get, never): ByteBuffer;
 | |
| 
 | |
| 	inline function get_buffer(): ByteBuffer {
 | |
| 		return this.self;
 | |
| 	}
 | |
| 
 | |
| 	public var byteLength(get, never): Int;
 | |
| 
 | |
| 	inline function get_byteLength(): Int {
 | |
| 		return this.byteArrayLength;
 | |
| 	}
 | |
| 
 | |
| 	public var byteOffset(get, never): Int;
 | |
| 
 | |
| 	inline function get_byteOffset(): Int {
 | |
| 		return this.byteArrayOffset;
 | |
| 	}
 | |
| 
 | |
| 	public inline function new(buffer: ByteBuffer, byteOffset: Int, byteLength: Int): Void {
 | |
| 		this = new ByteArrayPrivate(byteOffset, byteLength);
 | |
| 		this.self = buffer;
 | |
| 		this.self.addRef();
 | |
| 	}
 | |
| 
 | |
| 	public static inline function make(byteLength: Int): ByteArray {
 | |
| 		var buffer = ByteBuffer.create();
 | |
| 		if (byteLength > 0) {
 | |
| 			buffer.alloc(byteLength);
 | |
| 		}
 | |
| 		return new ByteArray(buffer, 0, byteLength);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getInt8(byteOffset: Int): Int {
 | |
| 		return untyped __cpp__("*(int8_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getUint8(byteOffset: Int): Int {
 | |
| 		return untyped __cpp__("*(uint8_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getInt16(byteOffset: Int): Int {
 | |
| 		return untyped __cpp__("*(int16_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getUint16(byteOffset: Int): Int {
 | |
| 		return untyped __cpp__("*(uint16_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getInt32(byteOffset: Int): Int {
 | |
| 		return untyped __cpp__("*(int32_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getUint32(byteOffset: Int): Int {
 | |
| 		return untyped __cpp__("*(uint32_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getFloat32(byteOffset: Int): FastFloat {
 | |
| 		return untyped __cpp__("*(float *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getFloat64(byteOffset: Int): Float {
 | |
| 		return untyped __cpp__("*(double *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setInt8(byteOffset: Int, value: Int): Void {
 | |
| 		untyped __cpp__("*((int8_t *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setUint8(byteOffset: Int, value: Int): Void {
 | |
| 		untyped __cpp__("*((uint8_t *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setInt16(byteOffset: Int, value: Int): Void {
 | |
| 		untyped __cpp__("*((int16_t *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setUint16(byteOffset: Int, value: Int): Void {
 | |
| 		untyped __cpp__("*((uint16_t *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setInt32(byteOffset: Int, value: Int): Void {
 | |
| 		untyped __cpp__("*((int32_t *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setUint32(byteOffset: Int, value: Int): Void {
 | |
| 		untyped __cpp__("*((uint32_t *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setFloat32(byteOffset: Int, value: FastFloat): Void {
 | |
| 		untyped __cpp__("*((float *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function setFloat64(byteOffset: Int, value: Float): Void {
 | |
| 		untyped __cpp__("*((double *)&{0}.data[{1} + {2}]) = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 	}
 | |
| 
 | |
| 	public inline function getInt16LE(byteOffset: Int): Int {
 | |
| 		#if !sys_bigendian
 | |
| 		return untyped __cpp__("*(int16_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		return untyped __cpp__("({0}.data[{1} + {2} + 0] << 0) | ({0}.data[{1} + {2} + 1] << 8)", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getUint16LE(byteOffset: Int): Int {
 | |
| 		#if !sys_bigendian
 | |
| 		return untyped __cpp__("*(uint16_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		return untyped __cpp__("({0}.data[{1} + {2} + 0] << 0) | ({0}.data[{1} + {2} + 1] << 8)", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getInt32LE(byteOffset: Int): Int {
 | |
| 		#if !sys_bigendian
 | |
| 		return untyped __cpp__("*(int32_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		return
 | |
| 			untyped __cpp__("({0}.data[{1} + {2} + 0] << 0) | ({0}.data[{1} + {2} + 1] << 8) | ({0}.data[{1} + {2} + 2] << 16) | ({0}.data[{1} + {2} + 3] << 24)",
 | |
| 				this.self,
 | |
| 			this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getUint32LE(byteOffset: Int): Int {
 | |
| 		#if !sys_bigendian
 | |
| 		return untyped __cpp__("*(uint32_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		return
 | |
| 			untyped __cpp__("({0}.data[{1} + {2} + 0] << 0) | ({0}.data[{1} + {2} + 1] << 8) | ({0}.data[{1} + {2} + 2] << 16) | ({0}.data[{1} + {2} + 3] << 24)",
 | |
| 				this.self,
 | |
| 			this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getFloat32LE(byteOffset: Int): FastFloat {
 | |
| 		#if !sys_bigendian
 | |
| 		return untyped __cpp__("*(float *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		untyped __cpp__("int32_t i = ({0}.data[{1} + {2} + 0] << 0) | ({0}.data[{1} + {2} + 1] << 8) | ({0}.data[{1} + {2} + 2] << 16) | ({0}.data[{1} + {2} + 3] << 24)",
 | |
| 			this.self, this.byteArrayOffset, byteOffset);
 | |
| 		return untyped __cpp__("*(float *)&i");
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getFloat64LE(byteOffset: Int): Float {
 | |
| 		#if !sys_bigendian
 | |
| 		return untyped __cpp__("*(double *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		untyped __cpp__("int64_t i = ((int64_t){0}.data[{1} + {2} + 0] << 0) | ((int64_t){0}.data[{1} + {2} + 1] << 8) | ((int64_t){0}.data[{1} + {2} + 2] << 16) | ((int64_t){0}.data[{1} + {2} + 3] << 24) | ((int64_t){0}.data[{1} + {2} + 4] << 32) | ((int64_t){0}.data[{1} + {2} + 5] << 40) | ((int64_t){0}.data[{1} + {2} + 6] << 48) | ((int64_t){0}.data[{1} + {2} + 7] << 56)",
 | |
| 			this.self, this.byteArrayOffset, byteOffset);
 | |
| 		return untyped __cpp__("*(double *)&i");
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setInt16LE(byteOffset: Int, value: Int): Void {
 | |
| 		#if !sys_bigendian
 | |
| 		untyped __cpp__("*(int16_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int16_t levalue = data[0] << 8 | data[1] << 0");
 | |
| 		untyped __cpp__("*(int16_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setUint16LE(byteOffset: Int, value: Int): Void {
 | |
| 		#if !sys_bigendian
 | |
| 		untyped __cpp__("*(uint16_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("uint16_t levalue = data[0] << 8 | data[1] << 0");
 | |
| 		untyped __cpp__("*(uint16_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setInt32LE(byteOffset: Int, value: Int): Void {
 | |
| 		#if !sys_bigendian
 | |
| 		untyped __cpp__("*(int32_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int32_t levalue = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3] << 0");
 | |
| 		untyped __cpp__("*(int32_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setUint32LE(byteOffset: Int, value: Int): Void {
 | |
| 		#if !sys_bigendian
 | |
| 		untyped __cpp__("*(uint32_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("uint32_t levalue = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3] << 0");
 | |
| 		untyped __cpp__("*(uint32_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setFloat32LE(byteOffset: Int, value: FastFloat): Void {
 | |
| 		#if !sys_bigendian
 | |
| 		untyped __cpp__("*(float *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int32_t levalue = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3] << 0");
 | |
| 		untyped __cpp__("float lefloat = *(float*)&levalue");
 | |
| 		untyped __cpp__("*(float *)&{0}.data[{1} + {2}] = lefloat", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setFloat64LE(byteOffset: Int, value: Float): Void {
 | |
| 		#if !sys_bigendian
 | |
| 		untyped __cpp__("*(double *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int64_t levalue = (int64_t)data[0] << 56 | (int64_t)data[1] << 48 | (int64_t)data[2] << 40 | (int64_t)data[3] << 32 | (int64_t)data[4] << 24 | (int64_t)data[5] << 16 | (int64_t)data[6] << 8 | (int64_t)data[7] << 0");
 | |
| 		untyped __cpp__("double lefloat = *(double*)&levalue");
 | |
| 		untyped __cpp__("*(double *)&{0}.data[{1} + {2}] = lefloat", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getInt16BE(byteOffset: Int): Int {
 | |
| 		#if sys_bigendian
 | |
| 		return untyped __cpp__("*(int16_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		untyped __cpp__("int i = ({0}.data[{1} + {2} + 1] << 0) | ({0}.data[{1} + {2} + 0] << 8)", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		return untyped __cpp__("*(float *)&i;");
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getUint16BE(byteOffset: Int): Int {
 | |
| 		#if sys_bigendian
 | |
| 		return untyped __cpp__("*(uint16_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		untyped __cpp__("int i = ({0}.data[{1} + {2} + 1] << 0) | ({0}.data[{1} + {2} + 0] << 8)", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		return untyped __cpp__("*(float *)&i;");
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getInt32BE(byteOffset: Int): Int {
 | |
| 		#if sys_bigendian
 | |
| 		return untyped __cpp__("*(int32_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		return
 | |
| 			untyped __cpp__("({0}.data[{1} + {2} + 3] << 0) | ({0}.data[{1} + {2} + 2] << 8) | ({0}.data[{1} + {2} + 1] << 16) | ({0}.data[{1} + {2} + 0] << 24)",
 | |
| 				this.self,
 | |
| 			this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getUint32BE(byteOffset: Int): Int {
 | |
| 		#if sys_bigendian
 | |
| 		return untyped __cpp__("*(uint32_t *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		return
 | |
| 			untyped __cpp__("({0}.data[{1} + {2} + 3] << 0) | ({0}.data[{1} + {2} + 2] << 8) | ({0}.data[{1} + {2} + 1] << 16) | ({0}.data[{1} + {2} + 0] << 24)",
 | |
| 				this.self,
 | |
| 			this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getFloat32BE(byteOffset: Int): FastFloat {
 | |
| 		#if sys_bigendian
 | |
| 		return untyped __cpp__("*(float *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		untyped __cpp__("int32_t i = ({0}.data[{1} + {2} + 3] << 0) | ({0}.data[{1} + {2} + 2] << 8) | ({0}.data[{1} + {2} + 1] << 16) | ({0}.data[{1} + {2} + 0] << 24)",
 | |
| 			this.self, this.byteArrayOffset, byteOffset);
 | |
| 		return untyped __cpp__("*(float *)&i;");
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function getFloat64BE(byteOffset: Int): Float {
 | |
| 		#if sys_bigendian
 | |
| 		return untyped __cpp__("*(double *)&{0}.data[{1} + {2}]", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#else
 | |
| 		untyped __cpp__("int64_t i = ((int64_t){0}.data[{1} + {2} + 7] << 0) | ((int64_t){0}.data[{1} + {2} + 6] << 8) | ((int64_t){0}.data[{1} + {2} + 5] << 16) | ((int64_t){0}.data[{1} + {2} + 4] << 24) | ((int64_t){0}.data[{1} + {2} + 3] << 32) | ((int64_t){0}.data[{1} + {2} + 2] << 40) | ((int64_t){0}.data[{1} + {2} + 1] << 48) | ((int64_t){0}.data[{1} + {2} + 0] << 56)",
 | |
| 			this.self, this.byteArrayOffset, byteOffset);
 | |
| 		return untyped __cpp__("*(double *)&i;");
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setInt16BE(byteOffset: Int, value: Int): Void {
 | |
| 		#if sys_bigendian
 | |
| 		untyped __cpp__("*(int16_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int16_t levalue = data[0] << 8 | data[1] << 0");
 | |
| 		untyped __cpp__("*(int16_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setUint16BE(byteOffset: Int, value: Int): Void {
 | |
| 		#if sys_bigendian
 | |
| 		untyped __cpp__("*(uint16_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("uint16_t levalue = data[0] << 8 | data[1] << 0");
 | |
| 		untyped __cpp__("*(uint16_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setInt32BE(byteOffset: Int, value: Int): Void {
 | |
| 		#if sys_bigendian
 | |
| 		untyped __cpp__("*(int32_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int32_t levalue = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3] << 0");
 | |
| 		untyped __cpp__("*(int32_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setUint32BE(byteOffset: Int, value: Int): Void {
 | |
| 		#if sys_bigendian
 | |
| 		untyped __cpp__("*(uint32_t *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("uint32_t levalue = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3] << 0");
 | |
| 		untyped __cpp__("*(uint32_t *)&{0}.data[{1} + {2}] = levalue", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setFloat32BE(byteOffset: Int, value: FastFloat): Void {
 | |
| 		#if sys_bigendian
 | |
| 		untyped __cpp__("*(float *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int32_t levalue = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3] << 0");
 | |
| 		untyped __cpp__("float lefloat = *(float*)&levalue");
 | |
| 		untyped __cpp__("*(float *)&{0}.data[{1} + {2}] = lefloat", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public inline function setFloat64BE(byteOffset: Int, value: Float): Void {
 | |
| 		#if sys_bigendian
 | |
| 		untyped __cpp__("*(double *)&{0}.data[{1} + {2}] = {3}", this.self, this.byteArrayOffset, byteOffset, value);
 | |
| 		#else
 | |
| 		untyped __cpp__("int8_t * data = (int8_t *)&{0}", value);
 | |
| 		untyped __cpp__("int64_t levalue = (int64_t)data[0] << 56 | (int64_t)data[1] << 48 | (int64_t)data[2] << 40 | (int64_t)data[3] << 32 | (int64_t)data[4] << 24 | (int64_t)data[5] << 16 | (int64_t)data[6] << 8 | (int64_t)data[7] << 0");
 | |
| 		untyped __cpp__("double lefloat = *(double*)&levalue");
 | |
| 		untyped __cpp__("*(double *)&{0}.data[{1} + {2}] = lefloat", this.self, this.byteArrayOffset, byteOffset);
 | |
| 		#end
 | |
| 	}
 | |
| 
 | |
| 	public function subarray(start: Int, ?end: Int): ByteArray {
 | |
| 		var offset: Int = this.byteArrayOffset + start;
 | |
| 		var length: Int = end == null ? this.byteArrayLength - start : end - start;
 | |
| 		return new ByteArray(this.self, offset, length);
 | |
| 	}
 | |
| }
 |