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); | ||
|  | 	} | ||
|  | } |