#include "testing/testing.hpp" #include "coding/bit_streams.hpp" #include "coding/elias_coder.hpp" #include "coding/reader.hpp" #include "coding/writer.hpp" #include "base/bits.hpp" #include "std/vector.hpp" namespace { template void TestCoder(string const & name) { using TBuffer = vector; using TWriter = MemWriter; uint64_t const kMask = 0xfedcba9876543210; TBuffer buf; { TWriter w(buf); BitWriter bits(w); for (int i = 0; i <= 64; ++i) { uint64_t const mask = bits::GetFullMask(i); uint64_t const value = kMask & mask; if (value == 0) TEST(!TCoder::Encode(bits, value), (name, i)); else TEST(TCoder::Encode(bits, value), (name, i)); } } { MemReader r(buf.data(), buf.size()); ReaderSource src(r); BitReader> bits(src); for (int i = 0; i <= 64; ++i) { uint64_t const mask = bits::GetFullMask(i); uint64_t const expected = kMask & mask; if (expected == 0) continue; TEST_EQUAL(expected, TCoder::Decode(bits), (name, i)); } } } UNIT_TEST(EliasCoder_Gamma) { TestCoder("Gamma"); } UNIT_TEST(EliasCoder_Delta) { TestCoder("Delta"); } } // namespace