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