public void i8ReadWriteLimits()
        {
            var writer = new BitBufferWriter <SevenBitEncoding <u32ArrayMemory> >();

            writer.i8(13, 0, 14);
            writer.i8(2, 4);
            var bitsWritten = writer.BitsWritten;
            var data        = writer.ToArray();
            var reader      = new BitBufferReader <SevenBitDecoding <u32ArrayMemory> >();

            reader.CopyFrom(data);
            Assert.AreEqual(13, reader.i8(0, 14));
            Assert.AreEqual(2, reader.i8(4));
            Assert.AreEqual(bitsWritten, reader.BitsRead);
        }
        private void i8ReadWrite <TEncoder, TDecoder>()
            where TEncoder : struct, ICompression <RawBitWriter <u32ArrayMemory> >
            where TDecoder : struct, IDecompression <RawBitReader <u32ArrayMemory> >
        {
            var writer = new BitBufferWriter <TEncoder>();

            writer.i8(i8.MinValue);
            i8 half = i8.MaxValue / 2;

            writer.i8(half);
            writer.i8(i8.MaxValue);
            var data   = writer.ToArray();
            var reader = new BitBufferReader <TDecoder>();

            reader.CopyFrom(data);
            Assert.AreEqual(i8.MinValue, reader.i8());
            Assert.AreEqual(half, reader.i8Peek());
            Assert.AreEqual(half, reader.i8());
            Assert.AreEqual(i8.MaxValue, reader.i8());
        }