diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-07-29 10:59:18 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-08-04 08:05:38 +0300 |
commit | c8d53fa85cc413f6a1c3dfbdb1bf15a71792f265 (patch) | |
tree | f4c8006c88a2ce54e4858d3a990c217f3fa85c0e /indexer/feature_altitude.hpp | |
parent | 927891f51b79bfb96773d349bf078ecaef21c765 (diff) |
Separating preparing altitudes for saving and writing them. Using bit writer to save them.
Diffstat (limited to 'indexer/feature_altitude.hpp')
-rw-r--r-- | indexer/feature_altitude.hpp | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/indexer/feature_altitude.hpp b/indexer/feature_altitude.hpp index 81b0c918ed..755ecb0be3 100644 --- a/indexer/feature_altitude.hpp +++ b/indexer/feature_altitude.hpp @@ -1,4 +1,6 @@ #pragma once +#include "coding/bit_streams.hpp" +#include "coding/elias_coder.hpp" #include "coding/reader.hpp" #include "coding/varint.hpp" #include "coding/write_to_sink.hpp" @@ -51,7 +53,7 @@ struct AltitudeHeader size_t GetFeatureTableSize() const { return m_altitudesOffset - m_featureTableOffset; } - size_t GetAltitudeInfo() const { return m_endOffset - m_altitudesOffset; } + size_t GetAltitudeInfoSize() const { return m_endOffset - m_altitudesOffset; } void Reset() { @@ -81,40 +83,24 @@ public: template <class TSink> void Serialize(TAltitude minAltitude, TSink & sink) const { - CHECK(!m_altitudes.empty(), ()); - - WriteVarInt(sink, static_cast<int32_t>(m_altitudes[0]) - static_cast<int32_t>(minAltitude)); - for (size_t i = 1; i < m_altitudes.size(); ++i) - { - WriteVarInt(sink, - static_cast<int32_t>(m_altitudes[i]) - static_cast<int32_t>(m_altitudes[i - 1])); - } + vector<uint32_t> deviations; + PrepareSerializationData(minAltitude, deviations); + + BitWriter<TSink> bits(sink); + for (auto const d : deviations) + coding::DeltaCoder::Encode(bits, d); } template <class TSource> bool Deserialize(TAltitude minAltitude, size_t pointCount, TSource & src) { - m_altitudes.clear(); - if (pointCount == 0) - { - ASSERT(false, ()); - return false; - } - - m_altitudes.resize(pointCount); - TAltitude prevAltitude = minAltitude; + vector<uint32_t> deviations(pointCount); + BitReader<TSource> bits(src); + for (size_t i = 0; i < pointCount; ++i) - { - m_altitudes[i] = static_cast<TAltitude>(ReadVarInt<int32_t>(src) + prevAltitude); - if (m_altitudes[i] < minAltitude) - { - ASSERT(false, ()); - m_altitudes.clear(); - return false; - } - prevAltitude = m_altitudes[i]; - } - return true; + deviations[i] = coding::DeltaCoder::Decode(bits); + + return FillAltitudesByDeserializedDate(minAltitude, deviations); } /// \note |m_altitudes| is a vector of feature point altitudes. There's two possibilities: @@ -122,5 +108,9 @@ public: /// * size of |m_pointAlt| is equal to the number of this feature's points. If so /// all items of |m_altitudes| have valid value. TAltitudes m_altitudes; + +private: + void PrepareSerializationData(TAltitude minAltitude, vector<uint32_t> & deviations) const; + bool FillAltitudesByDeserializedDate(TAltitude minAltitude, vector<uint32_t> const & deviations); }; } // namespace feature |