diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-08-03 10:57:52 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-08-04 08:05:39 +0300 |
commit | f6fb8db5ba00ad635d71ac86c27e2455db0fcb73 (patch) | |
tree | 92a43732f046e5219db695659ede09c507a83db4 /indexer/feature_altitude.hpp | |
parent | 6cf3bf60339f91c133755e0b1a46b69583ae9091 (diff) |
Altitudes. Getting rid of deltas.
Diffstat (limited to 'indexer/feature_altitude.hpp')
-rw-r--r-- | indexer/feature_altitude.hpp | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/indexer/feature_altitude.hpp b/indexer/feature_altitude.hpp index ceca72aa9f..67a10d8cef 100644 --- a/indexer/feature_altitude.hpp +++ b/indexer/feature_altitude.hpp @@ -6,6 +6,7 @@ #include "coding/write_to_sink.hpp" #include "base/assert.hpp" +#include "base/bits.hpp" #include "std/cstdint.hpp" #include "std/limits.hpp" @@ -83,33 +84,50 @@ public: template <class TSink> void Serialize(TAltitude minAltitude, TSink & sink) const { - vector<uint32_t> deltas; - PrepareSerializationDate(minAltitude, deltas); + CHECK(!m_altitudes.empty(), ()); BitWriter<TSink> bits(sink); - for (auto const d : deltas) - coding::DeltaCoder::Encode(bits, d + 1 /* making it greater than zero */); + TAltitude prevAltitude = minAltitude; + for (auto const a : m_altitudes) + { + CHECK_LESS_OR_EQUAL(minAltitude, a, ("A point altitude is less then min mwm altitude")); + uint32_t const delta = bits::ZigZagEncode(static_cast<int32_t>(a) - + static_cast<int32_t>(prevAltitude)); + coding::DeltaCoder::Encode(bits, delta + 1 /* making it greater than zero */); + prevAltitude = a; + } } template <class TSource> bool Deserialize(TAltitude minAltitude, size_t pointCount, TSource & src) { - vector<uint32_t> deltas(pointCount); + ASSERT_NOT_EQUAL(pointCount, 0, ()); + BitReader<TSource> bits(src); + TAltitude prevAltitude = minAltitude; + m_altitudes.resize(pointCount); for (size_t i = 0; i < pointCount; ++i) { uint32_t const decoded = coding::DeltaCoder::Decode(bits); if (decoded == 0) { - ASSERT(false, (i)); + ASSERT(false, ("Decoded altitude delta is zero. Point number in its feature is", i)); m_altitudes.clear(); return false; } - deltas[i] = decoded - 1 /* recovering value */; - } + uint32_t const delta = decoded - 1 /* recovering value */; - return FillAltitudesByDeserializedDate(minAltitude, deltas); + m_altitudes[i] = static_cast<TAltitude>(bits::ZigZagDecode(delta) + prevAltitude); + if (m_altitudes[i] < minAltitude) + { + ASSERT(false, ("A point altitude readed from file is less then min mwm altitude. Point number in its feature is", i)); + m_altitudes.clear(); + return false; + } + prevAltitude = m_altitudes[i]; + } + return true; } /// \note |m_altitudes| is a vector of feature point altitudes. There's two possibilities: @@ -117,9 +135,5 @@ 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 PrepareSerializationDate(TAltitude minAltitude, vector<uint32_t> & deltas) const; - bool FillAltitudesByDeserializedDate(TAltitude minAltitude, vector<uint32_t> const & deltas); }; } // namespace feature |