From f6fb8db5ba00ad635d71ac86c27e2455db0fcb73 Mon Sep 17 00:00:00 2001 From: Vladimir Byko-Ianko Date: Wed, 3 Aug 2016 10:57:52 +0300 Subject: [PATCH] Altitudes. Getting rid of deltas. --- indexer/feature_altitude.cpp | 50 ------------------------------------ indexer/feature_altitude.hpp | 40 +++++++++++++++++++---------- indexer/indexer.pro | 1 - 3 files changed, 27 insertions(+), 64 deletions(-) delete mode 100644 indexer/feature_altitude.cpp diff --git a/indexer/feature_altitude.cpp b/indexer/feature_altitude.cpp deleted file mode 100644 index c8b5182136..0000000000 --- a/indexer/feature_altitude.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "indexer/feature_altitude.hpp" - -#include "base/bits.hpp" - -namespace feature -{ -void Altitudes::PrepareSerializationDate(TAltitude minAltitude, vector & deltas) const -{ - CHECK(!m_altitudes.empty(), ()); - CHECK_LESS_OR_EQUAL(minAltitude, m_altitudes[0], ()); - - deltas.resize(m_altitudes.size()); - uint32_t const firstPntDeviation = - bits::ZigZagEncode(static_cast(m_altitudes[0]) - - static_cast(minAltitude)); - - deltas[0] = firstPntDeviation; - for (size_t i = 1; i < m_altitudes.size(); ++i) - { - CHECK_LESS_OR_EQUAL(minAltitude, m_altitudes[i], (i)); - deltas[i] = bits::ZigZagEncode(static_cast(m_altitudes[i]) - - static_cast(m_altitudes[i - 1])); - } -} - -bool Altitudes::FillAltitudesByDeserializedDate(TAltitude minAltitude, vector const & deltas) -{ - m_altitudes.resize(deltas.size()); - if (deltas.size() == 0) - { - ASSERT(false, ("A vector of delta altitudes readed from mwm are empty.")); - m_altitudes.clear(); - return false; - } - - TAltitude prevAltitude = minAltitude; - for (size_t i = 0; i < deltas.size(); ++i) - { - m_altitudes[i] = static_cast(bits::ZigZagDecode(deltas[i]) + 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; -} -} // namespace feature 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 void Serialize(TAltitude minAltitude, TSink & sink) const { - vector deltas; - PrepareSerializationDate(minAltitude, deltas); + CHECK(!m_altitudes.empty(), ()); BitWriter 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(a) - + static_cast(prevAltitude)); + coding::DeltaCoder::Encode(bits, delta + 1 /* making it greater than zero */); + prevAltitude = a; + } } template bool Deserialize(TAltitude minAltitude, size_t pointCount, TSource & src) { - vector deltas(pointCount); + ASSERT_NOT_EQUAL(pointCount, 0, ()); + BitReader 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(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 & deltas) const; - bool FillAltitudesByDeserializedDate(TAltitude minAltitude, vector const & deltas); }; } // namespace feature diff --git a/indexer/indexer.pro b/indexer/indexer.pro index 905a1f3c0c..f5b6d8e255 100644 --- a/indexer/indexer.pro +++ b/indexer/indexer.pro @@ -29,7 +29,6 @@ SOURCES += \ edits_migration.cpp \ feature.cpp \ feature_algo.cpp \ - feature_altitude.cpp \ feature_covering.cpp \ feature_data.cpp \ feature_decl.cpp \