diff options
author | Artyom Polkovnikov <artyom.polkovnikov@gmail.com> | 2014-11-19 11:10:08 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:33:00 +0300 |
commit | 93128390790a625827708a84ac60b829b3d7c820 (patch) | |
tree | 31ca7cd8a40f46f2ac501e5835b9e1a9fff4475f /coding/compressed_bit_vector.cpp | |
parent | 23c12d01c74c5798994fe983015a890328440ad9 (diff) |
[coding] Factor out BitSink/BitSource into separate modules.
Diffstat (limited to 'coding/compressed_bit_vector.cpp')
-rw-r--r-- | coding/compressed_bit_vector.cpp | 86 |
1 files changed, 7 insertions, 79 deletions
diff --git a/coding/compressed_bit_vector.cpp b/coding/compressed_bit_vector.cpp index f63720b542..6573f573ed 100644 --- a/coding/compressed_bit_vector.cpp +++ b/coding/compressed_bit_vector.cpp @@ -1,6 +1,7 @@ #include "compressed_bit_vector.hpp" #include "arithmetic_codec.hpp" +#include "bit_streams.hpp" #include "reader.hpp" #include "writer.hpp" #include "varint_misc.hpp" @@ -17,79 +18,6 @@ namespace { } } -class BitWriter -{ -public: - BitWriter(Writer & writer) - : m_writer(writer), m_lastByte(0), m_size(0) {} - ~BitWriter() { if (m_size % 8 > 0) m_writer.Write(&m_lastByte, 1); } - uint64_t NumBitsWritten() const { return m_size; } - void Write(uint64_t bits, uint32_t writeSize) - { - if (writeSize == 0) return; - m_totalBits += writeSize; - uint32_t remSize = m_size % 8; - CHECK_LESS_OR_EQUAL(writeSize, 64 - remSize, ()); - if (remSize > 0) - { - bits <<= remSize; - bits |= m_lastByte; - writeSize += remSize; - m_size -= remSize; - } - uint32_t writeBytesSize = writeSize / 8; - m_writer.Write(&bits, writeBytesSize); - m_lastByte = (bits >> (writeBytesSize * 8)) & ((1 << (writeSize % 8)) - 1); - m_size += writeSize; - } -private: - Writer & m_writer; - uint8_t m_lastByte; - uint64_t m_size; - uint64_t m_totalBits; -}; - -class BitReader { -public: - BitReader(Reader & reader) - : m_reader(reader), m_serialCur(0), m_serialEnd(reader.Size()), - m_bits(0), m_bitsSize(0), m_totalBitsRead(0) {} - uint64_t NumBitsRead() const { return m_totalBitsRead; } - uint64_t Read(uint32_t readSize) - { - m_totalBitsRead += readSize; - if (readSize == 0) return 0; - CHECK_LESS_OR_EQUAL(readSize, 64, ()); - // First read, sets bits that are in the m_bits buffer. - uint32_t firstReadSize = readSize <= m_bitsSize ? readSize : m_bitsSize; - uint64_t result = m_bits & (~uint64_t(0) >> (64 - firstReadSize)); - m_bits >>= firstReadSize; - m_bitsSize -= firstReadSize; - readSize -= firstReadSize; - // Second read, does an extra read using m_reader. - if (readSize > 0) - { - uint32_t readByteSize = m_serialCur + sizeof(m_bits) <= m_serialEnd ? sizeof(m_bits) : m_serialEnd - m_serialCur; - m_reader.Read(m_serialCur, &m_bits, readByteSize); - m_serialCur += readByteSize; - m_bitsSize += readByteSize * 8; - if (readSize > m_bitsSize) CHECK_LESS_OR_EQUAL(readSize, m_bitsSize, ()); - result |= (m_bits & (~uint64_t(0) >> (64 - readSize))) << firstReadSize; - m_bits >>= readSize; - m_bitsSize -= readSize; - readSize = 0; - } - return result; - } -private: - Reader & m_reader; - uint64_t m_serialCur; - uint64_t m_serialEnd; - uint64_t m_bits; - uint32_t m_bitsSize; - uint64_t m_totalBitsRead; -}; - void BuildCompressedBitVector(Writer & writer, vector<uint32_t> const & posOnes, int chosenEncType) { uint32_t const BLOCK_SIZE = 7; @@ -256,8 +184,8 @@ void BuildCompressedBitVector(Writer & writer, vector<uint32_t> const & posOnes, writer.Write(serialSizesEnc.data(), serialSizesEnc.size()); } { - // Second Stage. Encode all bits of all diffs using BitWriter. - BitWriter bitWriter(writer); + // Second Stage. Encode all bits of all diffs using BitSink. + BitSink bitWriter(writer); int64_t prevOnePos = -1; uint64_t totalReadBits = 0; uint64_t totalReadCnts = 0; @@ -388,8 +316,8 @@ void BuildCompressedBitVector(Writer & writer, vector<uint32_t> const & posOnes, } { - // Second stage, encode all ranges bits using BitWriter. - BitWriter bitWriter(writer); + // Second stage, encode all ranges bits using BitSink. + BitSink bitWriter(writer); int64_t prevOnePos = -1; uint64_t onesRangeLen = 0; for (uint32_t i = 0; i < posOnes.size(); ++i) @@ -474,7 +402,7 @@ vector<uint32_t> DecodeCompressedBitVector(Reader & reader) { for (uint64_t i = 0; i < cntElements; ++i) bitsUsedVec.push_back(arithDec.Decode()); decodeOffset += encSizesBytesize; Reader * bitReaderReader = reader.CreateSubReader(decodeOffset, serialSize - decodeOffset); - BitReader bitReader(*bitReaderReader); + BitSource bitReader(*bitReaderReader); int64_t prevOnePos = -1; for (uint64_t i = 0; i < cntElements; ++i) { @@ -526,7 +454,7 @@ vector<uint32_t> DecodeCompressedBitVector(Reader & reader) { for (uint64_t i = 0; i < cntElements1; ++i) bitsSizes1.push_back(arith_dec1.Decode()); decodeOffset += enc1SizesBytesize; Reader * bitReaderReader = reader.CreateSubReader(decodeOffset, serialSize - decodeOffset); - BitReader bitReader(*bitReaderReader); + BitSource bitReader(*bitReaderReader); uint64_t sum = 0, i0 = 0, i1 = 0; while (i0 < cntElements0 && i1 < cntElements1) { |