module structs.endian; private { import std.bitmanip; import std.system; } public { /++ + Dumps the value with little endian. + Params: + value = Input value to dump + destination = Target output buffer +/ @nogc pure nothrow void dumpBigEndian(TYPE)(immutable TYPE value, ref ubyte[] destination) in (destination.length == TYPE.sizeof) { destination.write!(TYPE, Endian.bigEndian)(value, 0); } /++ + Dumps the value in big endian. + Params: + value = Input value to dump + destination = Target output buffer +/ @nogc pure nothrow void dumpLittleEndian(TYPE)(immutable TYPE value, ref ubyte[] destination) in (destination.length == TYPE.sizeof) { destination.write!(TYPE, Endian.littleEndian)(value, 0); } /++ + Loads the value with little endian. + Params: + source = Source buffer +/ @nogc pure nothrow TYPE loadBigEndian(TYPE)(immutable(ubyte)[] source) in (source.length == TYPE.sizeof) { return source.read!(TYPE, Endian.bigEndian)(); } /++ + Dumps the value in big endian. + Params: + source = Source buffer +/ @nogc pure nothrow TYPE loadLittleEndian(TYPE)(immutable(ubyte)[] source) in (source.length == TYPE.sizeof) { return source.read!(TYPE, Endian.littleEndian)(); } } private unittest { // Test dump big endian { // 1 Byte ubyte[] target = [0]; dumpBigEndian!byte(1, target); assert(target == [1]); dumpBigEndian!ubyte(2, target); assert(target == [2]); dumpBigEndian!char(3, target); assert(target == [3]); } { ubyte[] target = [0, 0]; dumpBigEndian!short(0x0102, target); assert(target == [1, 2]); dumpBigEndian!ushort(0x0304, target); assert(target == [3, 4]); } { ubyte[] target = [0, 0, 0, 0]; dumpBigEndian!int(0x01020304, target); assert(target == [1, 2, 3, 4]); dumpBigEndian!uint(0x05060708, target); assert(target == [5, 6, 7, 8]); } { ubyte[] target = [0, 0, 0, 0, 0, 0, 0, 0]; dumpBigEndian!long(0x0102030405060708, target); assert(target == [1, 2, 3, 4, 5, 6, 7, 8]); dumpBigEndian!ulong(0x090a0b0c0d0e0f10, target); assert(target == [9, 10, 11, 12, 13, 14, 15, 16]); } // Test dump little endian { // 1 Byte ubyte[] target = [0]; dumpLittleEndian!byte(1, target); assert(target == [1]); dumpLittleEndian!ubyte(2, target); assert(target == [2]); dumpLittleEndian!char(3, target); assert(target == [3]); } { ubyte[] target = [0, 0]; dumpLittleEndian!short(0x0102, target); assert(target == [2, 1]); dumpLittleEndian!ushort(0x0304, target); assert(target == [4, 3]); } { ubyte[] target = [0, 0, 0, 0]; dumpLittleEndian!int(0x01020304, target); assert(target == [4, 3, 2, 1]); dumpLittleEndian!uint(0x05060708, target); assert(target == [8, 7, 6, 5]); } { ubyte[] target = [0, 0, 0, 0, 0, 0, 0, 0]; dumpLittleEndian!long(0x0102030405060708, target); assert(target == [8, 7, 6, 5, 4, 3, 2, 1]); dumpLittleEndian!ulong(0x090a0b0c0d0e0f10, target); assert(target == [16, 15, 14, 13, 12, 11, 10, 9]); } }