diff options
author | Denis Koronchik <denis@mapswithme.com> | 2014-10-16 22:44:21 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:32:31 +0300 |
commit | 5fea1a57db9eab92eca9a430f0c3e905030d542a (patch) | |
tree | 59237908a46ecf421c1712306df5b8d5a7dcff4b /coding/varint_vector.hpp | |
parent | 5f1f4641c8da74ae8802397fbb2fefa3f638fc07 (diff) |
[coding] Add varint vectors
Diffstat (limited to 'coding/varint_vector.hpp')
-rw-r--r-- | coding/varint_vector.hpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/coding/varint_vector.hpp b/coding/varint_vector.hpp new file mode 100644 index 0000000000..8201fadb92 --- /dev/null +++ b/coding/varint_vector.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include "../std/vector.hpp" + + +class Writer; +class Reader; + +namespace varint +{ + +#pragma pack(push, 1) +struct TableEntry +{ + uint32_t pos; + uint64_t sum; +}; +#pragma pack(pop) + + +class VectorBuilder +{ +protected: + // Implicit expectation: total compressed size should be within 4GB. + static uint64_t const DEF_NUM_ELEMENTS_PER_TABLE_ENTRY = 1024; + +public: + VectorBuilder(uint64_t numElemPerTableEntry = DEF_NUM_ELEMENTS_PER_TABLE_ENTRY); + + void AddNum(uint64_t num); + void Finalize(Writer * writer); + +protected: + uint64_t m_numElemPerTableEntry; + uint64_t m_numsCount; + uint64_t m_sum; + vector<TableEntry> m_selectTable; + vector<uint8_t> m_serialNums; +}; + +class VectorBuilderDelayedLast : public VectorBuilder +{ + typedef VectorBuilder BaseT; + uint64_t m_last; + bool m_hasLast; + + void AddLast(); +public: + VectorBuilderDelayedLast(uint64_t numElemPerTableEntry = DEF_NUM_ELEMENTS_PER_TABLE_ENTRY) + : BaseT(numElemPerTableEntry), m_hasLast(false) + { + } + + void AddNum(uint64_t num); + void ReplaceLast(uint64_t num); + void Finalize(Writer * writer); + + bool HasLast() const { return m_hasLast; } + uint64_t GetLast() const { return m_last; } + uint64_t GetNumsCount() const { return m_numsCount + (m_hasLast ? 1 : 0); } +}; + +class Vector +{ +public: + Vector(Reader * reader); + + void FindByIndex(uint64_t countBefore, uint32_t & serialPos, uint64_t & sumBefore); + void FindBySum(uint64_t sum, uint32_t & serialPos, uint64_t & sumBefore, uint64_t & countBefore); + void Read(uint32_t & serialPos, uint64_t & num); + +private: + Reader * m_reader; + uint64_t m_numsCount; + uint64_t m_numElemPerTableEntry; + uint64_t m_numTableEntries; + uint64_t m_serialNumsSize; + uint64_t m_selectTableOffset; + uint64_t m_serialNumsOffset; +}; + +} |