/
githubmirror
/
omim
Обзор
Документация
Войти
/
githubmirror
/
omim
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
android-95
coding/elias_coder.hpp
76 строк
2 KB
tatiana-yan
[std] Use new include style for coding, fixes.
12 апр 2019, 18:30
12 апр 2019, 18:30
a685936
Код
Авторство
О чём код?
#pragma once #include "coding/bit_streams.hpp" #include "base/assert.hpp" #include "base/bits.hpp" #include <cstdint> namespace coding { class GammaCoder { public: template <typename TWriter> static bool Encode(BitWriter<TWriter> & writer, uint64_t value) { if (value == 0) return false; uint8_t const n = bits::FloorLog(value); ASSERT_LESS_OR_EQUAL(n, 63, ()); uint64_t const msb = static_cast<uint64_t>(1) << n; writer.WriteAtMost64Bits(msb, n + 1); writer.WriteAtMost64Bits(value, n); return true; } template <typename TReader> static uint64_t Decode(BitReader<TReader> & reader) { uint8_t n = 0; while (reader.Read(1) == 0) ++n; ASSERT_LESS_OR_EQUAL(n, 63, ()); uint64_t const msb = static_cast<uint64_t>(1) << n; return msb | reader.ReadAtMost64Bits(n); } }; class DeltaCoder { public: template <typename TWriter> static bool Encode(BitWriter<TWriter> & writer, uint64_t value) { if (value == 0) return false; uint8_t const n = bits::FloorLog(value); ASSERT_LESS_OR_EQUAL(n, 63, ()); if (!GammaCoder::Encode(writer, n + 1)) return false; writer.WriteAtMost64Bits(value, n); return true; } template <typename TReader> static uint64_t Decode(BitReader<TReader> & reader) { uint8_t n = GammaCoder::Decode(reader); ASSERT_GREATER(n, 0, ()); --n; ASSERT_LESS_OR_EQUAL(n, 63, ()); uint64_t const msb = static_cast<uint64_t>(1) << n; return msb | reader.ReadAtMost64Bits(n); } }; } // namespace coding