@safe unittest { import std.bitmanip; struct A { int a; mixin(bitfields!( uint, "x", 2, int, "y", 3, uint, "z", 2, bool, "flag", 1)); } A obj; obj.x = 2; obj.z = obj.x; assert(obj.x == 2); assert(obj.y == 0); assert(obj.z == 2); assert(obj.flag == false); } @safe unittest { import std.bitmanip; struct A { mixin(bitfields!( bool, "flag1", 1, bool, "flag2", 1, uint, "", 6)); } A a; assert(a.flag1 == 0); a.flag1 = 1; assert(a.flag1 == 1); a.flag1 = 0; assert(a.flag1 == 0); } @safe unittest { import std.bitmanip; enum ABC { A, B, C } struct EnumTest { mixin(bitfields!( ABC, "x", 2, bool, "y", 1, ubyte, "z", 5)); } } @safe unittest { import std.bitmanip; struct A { int a; mixin(taggedPointer!( uint*, "x", bool, "b1", 1, bool, "b2", 1)); } A obj; obj.x = new uint; obj.b1 = true; obj.b2 = false; } @safe unittest { import std.bitmanip; struct A { int a; mixin(taggedClassRef!( Object, "o", uint, "i", 2)); } A obj; obj.o = new Object(); obj.i = 3; } @safe unittest { import std.bitmanip; FloatRep rep = {value: 0}; assert(rep.fraction == 0); assert(rep.exponent == 0); assert(!rep.sign); rep.value = 42; assert(rep.fraction == 2621440); assert(rep.exponent == 132); assert(!rep.sign); rep.value = 10; assert(rep.fraction == 2097152); assert(rep.exponent == 130); } @safe unittest { import std.bitmanip; FloatRep rep = {value: 1}; assert(rep.fraction == 0); assert(rep.exponent == 127); assert(!rep.sign); rep.exponent = 126; assert(rep.value == 0.5); rep.exponent = 130; assert(rep.value == 8); } @safe unittest { import std.bitmanip; FloatRep rep = {value: 1}; rep.value = -0.5; assert(rep.fraction == 0); assert(rep.exponent == 126); assert(rep.sign); rep.value = -1. / 3; assert(rep.fraction == 2796203); assert(rep.exponent == 125); assert(rep.sign); } @safe unittest { import std.bitmanip; DoubleRep rep = {value: 0}; assert(rep.fraction == 0); assert(rep.exponent == 0); assert(!rep.sign); rep.value = 42; assert(rep.fraction == 1407374883553280); assert(rep.exponent == 1028); assert(!rep.sign); rep.value = 10; assert(rep.fraction == 1125899906842624); assert(rep.exponent == 1026); } @safe unittest { import std.bitmanip; DoubleRep rep = {value: 1}; assert(rep.fraction == 0); assert(rep.exponent == 1023); assert(!rep.sign); rep.exponent = 1022; assert(rep.value == 0.5); rep.exponent = 1026; assert(rep.value == 8); } @safe unittest { import std.bitmanip; DoubleRep rep = {value: 1}; rep.value = -0.5; assert(rep.fraction == 0); assert(rep.exponent == 1022); assert(rep.sign); rep.value = -1. / 3; assert(rep.fraction == 1501199875790165); assert(rep.exponent == 1021); assert(rep.sign); } @safe unittest { import std.bitmanip; DoubleRep x; x.value = 1.0; assert(x.fraction == 0 && x.exponent == 1023 && !x.sign); x.value = -0.5; assert(x.fraction == 0 && x.exponent == 1022 && x.sign); x.value = 0.5; assert(x.fraction == 0 && x.exponent == 1022 && !x.sign); } @safe unittest { import std.bitmanip; DoubleRep x; x.fraction = 1125899906842624; x.exponent = 1025; x.sign = true; assert(x.value == -5.0); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; bool[] input = [true, false, false, true, true]; auto a = BitArray(input); assert(a.length == 5); assert(a.bitsSet.equal([0, 3, 4])); // This also works because an implicit cast to bool[] occurs for this array. auto b = BitArray([0, 0, 1]); assert(b.length == 3); assert(b.bitsSet.equal([2])); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; import std.array : array; import std.range : iota, repeat; BitArray a = true.repeat(70).array; assert(a.length == 70); assert(a.bitsSet.equal(iota(0, 70))); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; auto a = BitArray([1, 0, 0, 1, 1]); // Inverse of the cast. auto v = cast(void[]) a; auto b = BitArray(v, a.length); assert(b.length == 5); assert(b.bitsSet.equal([0, 3, 4])); // a and b share the underlying data. a[0] = 0; assert(b[0] == 0); assert(a == b); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; size_t[] source = [0b1100, 0b0011]; enum sbits = size_t.sizeof * 8; auto ba = BitArray(source, source.length * sbits); // The least significant bit in each unit is this unit's starting bit. assert(ba.bitsSet.equal([2, 3, sbits, sbits + 1])); } @system unittest { import std.bitmanip; // Example from the doc for this constructor. static immutable size_t[] sourceData = [1, 0b101, 3, 3424234, 724398, 230947, 389492]; size_t[] source = sourceData.dup; enum sbits = size_t.sizeof * 8; auto ba = BitArray(source, source.length * sbits); foreach (n; 0 .. source.length * sbits) { auto nth_bit = cast(bool) (source[n / sbits] & (1L << (n % sbits))); assert(ba[n] == nth_bit); } // Example of mapping only part of the array. import std.algorithm.comparison : equal; auto bc = BitArray(source, sbits + 1); assert(bc.bitsSet.equal([0, sbits])); // Source array has not been modified. assert(source == sourceData); } @system unittest { import std.bitmanip; static void fun(const BitArray arr) { auto x = arr[0]; assert(x == 1); } BitArray a; a.length = 3; a[0] = 1; fun(a); } @system pure nothrow unittest { import std.bitmanip; import std.algorithm.comparison : equal; auto b = BitArray([1, 0, 1, 0, 1, 1]); b[] = true; // all bits are set assert(b.bitsSet.equal([0, 1, 2, 3, 4, 5])); b[] = false; // none of the bits are set assert(b.bitsSet.empty); } @system pure nothrow unittest { import std.bitmanip; import std.algorithm.comparison : equal; import std.range : iota; import std.stdio; auto b = BitArray([1, 0, 0, 0, 1, 1, 0]); b[1 .. 3] = true; assert(b.bitsSet.equal([0, 1, 2, 4, 5])); bool[72] bitArray; auto b1 = BitArray(bitArray); b1[63 .. 67] = true; assert(b1.bitsSet.equal([63, 64, 65, 66])); b1[63 .. 67] = false; assert(b1.bitsSet.empty); b1[0 .. 64] = true; assert(b1.bitsSet.equal(iota(0, 64))); b1[0 .. 64] = false; assert(b1.bitsSet.empty); bool[256] bitArray2; auto b2 = BitArray(bitArray2); b2[3 .. 245] = true; assert(b2.bitsSet.equal(iota(3, 245))); b2[3 .. 245] = false; assert(b2.bitsSet.empty); } @system pure nothrow unittest { import std.bitmanip; import std.algorithm.comparison : equal; import std.range : iota; // positions 0, 2, 4 are set auto b = BitArray([1, 0, 1, 0, 1, 0]); b.flip(); // after flipping, positions 1, 3, 5 are set assert(b.bitsSet.equal([1, 3, 5])); bool[270] bits; auto b1 = BitArray(bits); b1.flip(); assert(b1.bitsSet.equal(iota(0, 270))); } @system pure nothrow unittest { import std.bitmanip; auto ax = BitArray([1, 0, 0, 1]); ax.flip(0); assert(ax[0] == 0); bool[200] y; y[90 .. 130] = true; auto ay = BitArray(y); ay.flip(100); assert(ay[100] == 0); } @system pure nothrow unittest { import std.bitmanip; auto a = BitArray([0, 1, 1, 0, 0, 1, 1]); assert(a.count == 4); BitArray b; assert(b.count == 0); bool[200] boolArray; boolArray[45 .. 130] = true; auto c = BitArray(boolArray); assert(c.count == 85); } @system unittest { import std.bitmanip; BitArray a; BitArray b; a.length = 3; a[0] = 1; a[1] = 0; a[2] = 1; b = a.dup; assert(b.length == 3); foreach (i; 0 .. 3) assert(b[i] == (((i ^ 1) & 1) ? true : false)); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1]; auto a = BitArray(ba); int i; foreach (b;a) { switch (i) { case 0: assert(b == true); break; case 1: assert(b == false); break; case 2: assert(b == true); break; default: assert(0); } i++; } foreach (j,b;a) { switch (j) { case 0: assert(b == true); break; case 1: assert(b == false); break; case 2: assert(b == true); break; default: assert(0); } } } @system unittest { import std.bitmanip; BitArray b; bool[5] data = [1,0,1,1,0]; b = BitArray(data); b.reverse; foreach (i; 0 .. data.length) assert(b[i] == data[4 - i]); } @system unittest { import std.bitmanip; size_t x = 0b1100011000; auto ba = BitArray(10, &x); ba.sort; foreach (i; 0 .. 6) assert(ba[i] == false); foreach (i; 6 .. 10) assert(ba[i] == true); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1]; bool[] bc = [1,0,1,0,1,0,1]; bool[] bd = [1,0,1,1,1]; bool[] be = [1,0,1,0,1]; bool[] bf = [1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; bool[] bg = [1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]; auto a = BitArray(ba); auto b = BitArray(bb); auto c = BitArray(bc); auto d = BitArray(bd); auto e = BitArray(be); auto f = BitArray(bf); auto g = BitArray(bg); assert(a != b); assert(a != c); assert(a != d); assert(a == e); assert(f != g); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1]; bool[] bc = [1,0,1,0,1,0,1]; bool[] bd = [1,0,1,1,1]; bool[] be = [1,0,1,0,1]; bool[] bf = [1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]; bool[] bg = [1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); auto c = BitArray(bc); auto d = BitArray(bd); auto e = BitArray(be); auto f = BitArray(bf); auto g = BitArray(bg); assert(a > b); assert(a >= b); assert(a < c); assert(a <= c); assert(a < d); assert(a <= d); assert(a == e); assert(a <= e); assert(a >= e); assert(f < g); assert(g <= g); } @system unittest { import std.bitmanip; import std.array : array; import std.range : repeat, take; // bit array with 300 elements auto a = BitArray(true.repeat.take(300).array); size_t[] v = cast(size_t[]) a; const blockSize = size_t.sizeof * 8; assert(v.length == (a.length + blockSize - 1) / blockSize); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; auto a = BitArray(ba); BitArray b = ~a; assert(b[0] == 0); assert(b[1] == 1); assert(b[2] == 0); assert(b[3] == 1); assert(b[4] == 0); } @system unittest { import std.bitmanip; static bool[] ba = [1,0,1,0,1]; static bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); BitArray c = a & b; assert(c[0] == 1); assert(c[1] == 0); assert(c[2] == 1); assert(c[3] == 0); assert(c[4] == 0); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); BitArray c = a | b; assert(c[0] == 1); assert(c[1] == 0); assert(c[2] == 1); assert(c[3] == 1); assert(c[4] == 1); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); BitArray c = a ^ b; assert(c[0] == 0); assert(c[1] == 0); assert(c[2] == 0); assert(c[3] == 1); assert(c[4] == 1); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); BitArray c = a - b; assert(c[0] == 0); assert(c[1] == 0); assert(c[2] == 0); assert(c[3] == 0); assert(c[4] == 1); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1,1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); BitArray c = a; c.length = 5; c &= b; assert(a[5] == 1); assert(a[6] == 0); assert(a[7] == 1); assert(a[8] == 0); assert(a[9] == 1); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); a &= b; assert(a[0] == 1); assert(a[1] == 0); assert(a[2] == 1); assert(a[3] == 0); assert(a[4] == 0); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); a |= b; assert(a[0] == 1); assert(a[1] == 0); assert(a[2] == 1); assert(a[3] == 1); assert(a[4] == 1); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); a ^= b; assert(a[0] == 0); assert(a[1] == 0); assert(a[2] == 0); assert(a[3] == 1); assert(a[4] == 1); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; bool[] bb = [1,0,1,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); a -= b; assert(a[0] == 0); assert(a[1] == 0); assert(a[2] == 0); assert(a[3] == 0); assert(a[4] == 1); } @system unittest { import std.bitmanip; bool[] ba = [1,0,1,0,1]; auto a = BitArray(ba); BitArray b; b = (a ~= true); assert(a[0] == 1); assert(a[1] == 0); assert(a[2] == 1); assert(a[3] == 0); assert(a[4] == 1); assert(a[5] == 1); assert(b == a); } @system unittest { import std.bitmanip; bool[] ba = [1,0]; bool[] bb = [0,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); BitArray c; c = (a ~= b); assert(a.length == 5); assert(a[0] == 1); assert(a[1] == 0); assert(a[2] == 0); assert(a[3] == 1); assert(a[4] == 0); assert(c == a); } @system unittest { import std.bitmanip; bool[] ba = [1,0]; bool[] bb = [0,1,0]; auto a = BitArray(ba); auto b = BitArray(bb); BitArray c; c = (a ~ b); assert(c.length == 5); assert(c[0] == 1); assert(c[1] == 0); assert(c[2] == 0); assert(c[3] == 1); assert(c[4] == 0); c = (a ~ true); assert(c.length == 3); assert(c[0] == 1); assert(c[1] == 0); assert(c[2] == 1); c = (false ~ a); assert(c.length == 3); assert(c[0] == 0); assert(c[1] == 1); assert(c[2] == 0); } @system unittest { import std.bitmanip; import std.format : format; auto b = BitArray([1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1]); b <<= 1; assert(format("%b", b) == "01100_10101101"); b >>= 1; assert(format("%b", b) == "11001_01011010"); b <<= 4; assert(format("%b", b) == "00001_10010101"); b >>= 5; assert(format("%b", b) == "10010_10100000"); b <<= 13; assert(format("%b", b) == "00000_00000000"); b = BitArray([1, 0, 1, 1, 0, 1, 1, 1]); b >>= 8; assert(format("%b", b) == "00000000"); } @system pure unittest { import std.bitmanip; import std.format : format; auto b = BitArray([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); auto s1 = format("%s", b); assert(s1 == "[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]"); auto s2 = format("%b", b); assert(s2 == "00001111_00001111"); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; auto b1 = BitArray([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); assert(b1.bitsSet.equal([4, 5, 6, 7, 12, 13, 14, 15])); BitArray b2; b2.length = 1000; b2[333] = true; b2[666] = true; b2[999] = true; assert(b2.bitsSet.equal([333, 666, 999])); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; import std.range : iota; bool[] buf = new bool[64 * 3]; buf[0 .. 64] = true; BitArray b = BitArray(buf); assert(b.bitsSet.equal(iota(0, 64))); b <<= 64; assert(b.bitsSet.equal(iota(64, 128))); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; auto b = BitArray([1, 0]); b ~= true; assert(b[2] == 1); b ~= BitArray([0, 1]); auto c = BitArray([1, 0, 1, 0, 1]); assert(b == c); assert(b.bitsSet.equal([0, 2, 4])); } @system unittest { import std.bitmanip; import std.algorithm.comparison : equal; auto b = BitArray([1, 1, 0, 1]); b &= BitArray([0, 1, 1, 0]); assert(b.bitsSet.equal([1])); b.flip; assert(b.bitsSet.equal([0, 2, 3])); } @system unittest { import std.bitmanip; import std.format : format; auto b = BitArray([1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); assert(format("%b", b) == "1_00001111_00001111"); } @system unittest { import std.bitmanip; import std.format : format; BitArray b; b = BitArray([]); assert(format("%s", b) == "[]"); assert(format("%b", b) is null); b = BitArray([1]); assert(format("%s", b) == "[1]"); assert(format("%b", b) == "1"); b = BitArray([0, 0, 0, 0]); assert(format("%b", b) == "0000"); b = BitArray([0, 0, 0, 0, 1, 1, 1, 1]); assert(format("%s", b) == "[0, 0, 0, 0, 1, 1, 1, 1]"); assert(format("%b", b) == "00001111"); b = BitArray([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); assert(format("%s", b) == "[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]"); assert(format("%b", b) == "00001111_00001111"); b = BitArray([1, 0, 0, 0, 0, 1, 1, 1, 1]); assert(format("%b", b) == "1_00001111"); b = BitArray([1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]); assert(format("%b", b) == "1_00001111_00001111"); } @safe unittest { import std.bitmanip; assert(42.swapEndian == 704643072); assert(42.swapEndian.swapEndian == 42); // reflexive assert(1.swapEndian == 16777216); assert(true.swapEndian == true); assert(byte(10).swapEndian == 10); assert(char(10).swapEndian == 10); assert(ushort(10).swapEndian == 2560); assert(long(10).swapEndian == 720575940379279360); assert(ulong(10).swapEndian == 720575940379279360); } @safe unittest { import std.bitmanip; int i = 12345; ubyte[4] swappedI = nativeToBigEndian(i); assert(i == bigEndianToNative!int(swappedI)); float f = 123.45f; ubyte[4] swappedF = nativeToBigEndian(f); assert(f == bigEndianToNative!float(swappedF)); const float cf = 123.45f; ubyte[4] swappedCF = nativeToBigEndian(cf); assert(cf == bigEndianToNative!float(swappedCF)); double d = 123.45; ubyte[8] swappedD = nativeToBigEndian(d); assert(d == bigEndianToNative!double(swappedD)); const double cd = 123.45; ubyte[8] swappedCD = nativeToBigEndian(cd); assert(cd == bigEndianToNative!double(swappedCD)); } @safe unittest { import std.bitmanip; ushort i = 12345; ubyte[2] swappedI = nativeToBigEndian(i); assert(i == bigEndianToNative!ushort(swappedI)); dchar c = 'D'; ubyte[4] swappedC = nativeToBigEndian(c); assert(c == bigEndianToNative!dchar(swappedC)); } @safe unittest { import std.bitmanip; int i = 12345; ubyte[4] swappedI = nativeToLittleEndian(i); assert(i == littleEndianToNative!int(swappedI)); float f = 123.45f; ubyte[4] swappedF = nativeToLittleEndian(f); assert(f == littleEndianToNative!float(swappedF)); const float cf = 123.45f; ubyte[4] swappedCF = nativeToLittleEndian(cf); assert(cf == littleEndianToNative!float(swappedCF)); double d = 123.45; ubyte[8] swappedD = nativeToLittleEndian(d); assert(d == littleEndianToNative!double(swappedD)); const double cd = 123.45; ubyte[8] swappedCD = nativeToLittleEndian(cd); assert(cd == littleEndianToNative!double(swappedCD)); } @safe unittest { import std.bitmanip; ushort i = 12345; ubyte[2] swappedI = nativeToLittleEndian(i); assert(i == littleEndianToNative!ushort(swappedI)); dchar c = 'D'; ubyte[4] swappedC = nativeToLittleEndian(c); assert(c == littleEndianToNative!dchar(swappedC)); } @system unittest { import std.bitmanip; ubyte[] buffer = [1, 5, 22, 9, 44, 255, 8]; assert(buffer.peek!uint() == 17110537); assert(buffer.peek!ushort() == 261); assert(buffer.peek!ubyte() == 1); assert(buffer.peek!uint(2) == 369700095); assert(buffer.peek!ushort(2) == 5641); assert(buffer.peek!ubyte(2) == 22); size_t index = 0; assert(buffer.peek!ushort(&index) == 261); assert(index == 2); assert(buffer.peek!uint(&index) == 369700095); assert(index == 6); assert(buffer.peek!ubyte(&index) == 8); assert(index == 7); } @safe unittest { import std.bitmanip; import std.algorithm.iteration : filter; ubyte[] buffer = [1, 5, 22, 9, 44, 255, 7]; auto range = filter!"true"(buffer); assert(range.peek!uint() == 17110537); assert(range.peek!ushort() == 261); assert(range.peek!ubyte() == 1); } @safe unittest { import std.bitmanip; import std.range.primitives : empty; ubyte[] buffer = [1, 5, 22, 9, 44, 255, 8]; assert(buffer.length == 7); assert(buffer.read!ushort() == 261); assert(buffer.length == 5); assert(buffer.read!uint() == 369700095); assert(buffer.length == 1); assert(buffer.read!ubyte() == 8); assert(buffer.empty); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0]; buffer.write!uint(29110231u, 0); assert(buffer == [1, 188, 47, 215, 0, 0, 0, 0]); buffer.write!ushort(927, 0); assert(buffer == [3, 159, 47, 215, 0, 0, 0, 0]); buffer.write!ubyte(42, 0); assert(buffer == [42, 159, 47, 215, 0, 0, 0, 0]); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0, 0]; buffer.write!uint(142700095u, 2); assert(buffer == [0, 0, 8, 129, 110, 63, 0, 0, 0]); buffer.write!ushort(19839, 2); assert(buffer == [0, 0, 77, 127, 110, 63, 0, 0, 0]); buffer.write!ubyte(132, 2); assert(buffer == [0, 0, 132, 127, 110, 63, 0, 0, 0]); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0]; size_t index = 0; buffer.write!ushort(261, &index); assert(buffer == [1, 5, 0, 0, 0, 0, 0, 0]); assert(index == 2); buffer.write!uint(369700095u, &index); assert(buffer == [1, 5, 22, 9, 44, 255, 0, 0]); assert(index == 6); buffer.write!ubyte(8, &index); assert(buffer == [1, 5, 22, 9, 44, 255, 8, 0]); assert(index == 7); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0]; buffer.write!bool(false, 0); assert(buffer == [0, 0]); buffer.write!bool(true, 0); assert(buffer == [1, 0]); buffer.write!bool(true, 1); assert(buffer == [1, 1]); buffer.write!bool(false, 1); assert(buffer == [1, 0]); size_t index = 0; buffer.write!bool(false, &index); assert(buffer == [0, 0]); assert(index == 1); buffer.write!bool(true, &index); assert(buffer == [0, 1]); assert(index == 2); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0]; buffer.write!char('a', 0); assert(buffer == [97, 0, 0]); buffer.write!char('b', 1); assert(buffer == [97, 98, 0]); size_t index = 0; buffer.write!char('a', &index); assert(buffer == [97, 98, 0]); assert(index == 1); buffer.write!char('b', &index); assert(buffer == [97, 98, 0]); assert(index == 2); buffer.write!char('c', &index); assert(buffer == [97, 98, 99]); assert(index == 3); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0]; buffer.write!wchar('ą', 0); assert(buffer == [1, 5, 0, 0]); buffer.write!wchar('”', 2); assert(buffer == [1, 5, 32, 29]); size_t index = 0; buffer.write!wchar('ć', &index); assert(buffer == [1, 7, 32, 29]); assert(index == 2); buffer.write!wchar('ą', &index); assert(buffer == [1, 7, 1, 5]); assert(index == 4); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0]; buffer.write!dchar('ą', 0); assert(buffer == [0, 0, 1, 5, 0, 0, 0, 0]); buffer.write!dchar('”', 4); assert(buffer == [0, 0, 1, 5, 0, 0, 32, 29]); size_t index = 0; buffer.write!dchar('ć', &index); assert(buffer == [0, 0, 1, 7, 0, 0, 32, 29]); assert(index == 4); buffer.write!dchar('ą', &index); assert(buffer == [0, 0, 1, 7, 0, 0, 1, 5]); assert(index == 8); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0]; buffer.write!float(32.0f, 0); assert(buffer == [66, 0, 0, 0, 0, 0, 0, 0]); buffer.write!float(25.0f, 4); assert(buffer == [66, 0, 0, 0, 65, 200, 0, 0]); size_t index = 0; buffer.write!float(25.0f, &index); assert(buffer == [65, 200, 0, 0, 65, 200, 0, 0]); assert(index == 4); buffer.write!float(32.0f, &index); assert(buffer == [65, 200, 0, 0, 66, 0, 0, 0]); assert(index == 8); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; buffer.write!double(32.0, 0); assert(buffer == [64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); buffer.write!double(25.0, 8); assert(buffer == [64, 64, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]); size_t index = 0; buffer.write!double(25.0, &index); assert(buffer == [64, 57, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]); assert(index == 8); buffer.write!double(32.0, &index); assert(buffer == [64, 57, 0, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0]); assert(index == 16); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; enum Foo { one = 10, two = 20, three = 30 } buffer.write!Foo(Foo.one, 0); assert(buffer == [0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0]); buffer.write!Foo(Foo.two, 4); assert(buffer == [0, 0, 0, 10, 0, 0, 0, 20, 0, 0, 0, 0]); buffer.write!Foo(Foo.three, 8); assert(buffer == [0, 0, 0, 10, 0, 0, 0, 20, 0, 0, 0, 30]); size_t index = 0; buffer.write!Foo(Foo.three, &index); assert(buffer == [0, 0, 0, 30, 0, 0, 0, 20, 0, 0, 0, 30]); assert(index == 4); buffer.write!Foo(Foo.one, &index); assert(buffer == [0, 0, 0, 30, 0, 0, 0, 10, 0, 0, 0, 30]); assert(index == 8); buffer.write!Foo(Foo.two, &index); assert(buffer == [0, 0, 0, 30, 0, 0, 0, 10, 0, 0, 0, 20]); assert(index == 12); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0]; enum Float: float { one = 32.0f, two = 25.0f } buffer.write!Float(Float.one, 0); assert(buffer == [66, 0, 0, 0, 0, 0, 0, 0]); buffer.write!Float(Float.two, 4); assert(buffer == [66, 0, 0, 0, 65, 200, 0, 0]); size_t index = 0; buffer.write!Float(Float.two, &index); assert(buffer == [65, 200, 0, 0, 65, 200, 0, 0]); assert(index == 4); buffer.write!Float(Float.one, &index); assert(buffer == [65, 200, 0, 0, 66, 0, 0, 0]); assert(index == 8); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; enum Double: double { one = 32.0, two = 25.0 } buffer.write!Double(Double.one, 0); assert(buffer == [64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); buffer.write!Double(Double.two, 8); assert(buffer == [64, 64, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]); size_t index = 0; buffer.write!Double(Double.two, &index); assert(buffer == [64, 57, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]); assert(index == 8); buffer.write!Double(Double.one, &index); assert(buffer == [64, 57, 0, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0]); assert(index == 16); } @system unittest { import std.bitmanip; ubyte[] buffer = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; enum Real: real { one = 32.0, two = 25.0 } static assert(!__traits(compiles, buffer.write!Real(Real.one))); } @safe unittest { import std.bitmanip; import std.array; auto buffer = appender!(const ubyte[])(); buffer.append!ushort(261); assert(buffer.data == [1, 5]); buffer.append!uint(369700095u); assert(buffer.data == [1, 5, 22, 9, 44, 255]); buffer.append!ubyte(8); assert(buffer.data == [1, 5, 22, 9, 44, 255, 8]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); buffer.append!bool(true); assert(buffer.data == [1]); buffer.append!bool(false); assert(buffer.data == [1, 0]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); buffer.append!char('a'); assert(buffer.data == [97]); buffer.append!char('b'); assert(buffer.data == [97, 98]); buffer.append!wchar('ą'); assert(buffer.data == [97, 98, 1, 5]); buffer.append!dchar('ą'); assert(buffer.data == [97, 98, 1, 5, 0, 0, 1, 5]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); buffer.append!float(32.0f); assert(buffer.data == [66, 0, 0, 0]); buffer.append!double(32.0); assert(buffer.data == [66, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); enum Foo { one = 10, two = 20, three = 30 } buffer.append!Foo(Foo.one); assert(buffer.data == [0, 0, 0, 10]); buffer.append!Foo(Foo.two); assert(buffer.data == [0, 0, 0, 10, 0, 0, 0, 20]); buffer.append!Foo(Foo.three); assert(buffer.data == [0, 0, 0, 10, 0, 0, 0, 20, 0, 0, 0, 30]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); enum Bool: bool { bfalse = false, btrue = true, } buffer.append!Bool(Bool.btrue); assert(buffer.data == [1]); buffer.append!Bool(Bool.bfalse); assert(buffer.data == [1, 0]); buffer.append!Bool(Bool.btrue); assert(buffer.data == [1, 0, 1]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); enum Float: float { one = 32.0f, two = 25.0f } buffer.append!Float(Float.one); assert(buffer.data == [66, 0, 0, 0]); buffer.append!Float(Float.two); assert(buffer.data == [66, 0, 0, 0, 65, 200, 0, 0]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); enum Double: double { one = 32.0, two = 25.0 } buffer.append!Double(Double.one); assert(buffer.data == [64, 64, 0, 0, 0, 0, 0, 0]); buffer.append!Double(Double.two); assert(buffer.data == [64, 64, 0, 0, 0, 0, 0, 0, 64, 57, 0, 0, 0, 0, 0, 0]); } @safe unittest { import std.bitmanip; import std.array : appender; auto buffer = appender!(const ubyte[])(); enum Real: real { one = 32.0, two = 25.0 } static assert(!__traits(compiles, buffer.append!Real(Real.one))); } @safe unittest { import std.bitmanip; import std.algorithm.comparison : equal; import std.range : iota; assert(bitsSet(1).equal([0])); assert(bitsSet(5).equal([0, 2])); assert(bitsSet(-1).equal(iota(32))); assert(bitsSet(int.min).equal([31])); }