diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-07-19 14:49:38 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-07-23 10:25:11 +0300 |
commit | 3fa7071a1b57145da7559144f2316ad3be555d39 (patch) | |
tree | e82db81c207ae5b5bfc93037d735279a301ca5b3 /indexer/feature_altitude.hpp | |
parent | ec73bce900be6b5379b49200781d2b1f7c4e4411 (diff) |
Implementation index for altitude data with the help of succinct strutures.
Diffstat (limited to 'indexer/feature_altitude.hpp')
-rw-r--r-- | indexer/feature_altitude.hpp | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/indexer/feature_altitude.hpp b/indexer/feature_altitude.hpp index 4d59135342..84582fac7c 100644 --- a/indexer/feature_altitude.hpp +++ b/indexer/feature_altitude.hpp @@ -11,44 +11,55 @@ using TAltitude = int16_t; using TAltitudes = vector<feature::TAltitude>; TAltitude constexpr kInvalidAltitude = numeric_limits<TAltitude>::min(); -struct Altitudes -{ - Altitudes() = default; - Altitudes(TAltitude b, TAltitude e) : begin(b), end(e) {} - - TAltitude begin = kInvalidAltitude; - TAltitude end = kInvalidAltitude; -}; - class Altitude { public: Altitude() = default; - Altitude(uint32_t featureId, Altitudes const & altitudes) - : m_featureId(featureId), m_altitudes(altitudes) - { - } + Altitude(TAltitudes const & altitudes) : m_pointAlt(altitudes) {} template <class TSink> - void Serialize(TSink & sink) const + void Serialize(TAltitude minAltitude, TSink & sink) const { - sink.Write(&m_featureId, sizeof(uint32_t)); - sink.Write(&m_altitudes.begin, sizeof(TAltitude)); - sink.Write(&m_altitudes.end, sizeof(TAltitude)); + CHECK(!m_pointAlt.empty(), ()); + + TAltitude prevPntAltitude = minAltitude; + for (size_t i = 0; i < m_pointAlt.size(); ++i) + { + WriteVarInt(sink, static_cast<int32_t>(static_cast<int32_t>(m_pointAlt[i] - prevPntAltitude))); + prevPntAltitude = m_pointAlt[i]; + } } - /// @TODO template <class TSource> void Deserialize(TSource & src) should be implement here. - /// But now for test purposes deserialization is done with DDVector construction. + template <class TSource> + void Deserialize(TAltitude minAltitude, size_t pointCount, TSource & src) + { + m_pointAlt.clear(); + if (pointCount == 0) + { + ASSERT(false, ()); + return; + } + + m_pointAlt.resize(pointCount); + TAltitude prevPntAltitude = minAltitude; + for (size_t i = 0; i < pointCount; ++i) + { + m_pointAlt[i] = static_cast<TAltitude>(ReadVarInt<int32_t>(src) + prevPntAltitude); + prevPntAltitude = m_pointAlt[i]; + } + } - uint32_t GetFeatureId() const { return m_featureId; } - Altitudes const & GetAltitudes() const { return m_altitudes; } + TAltitudes GetAltitudes() const + { + return m_pointAlt; + } private: - /// @TODO Note. Feature id is located here because there's no index for altitudes. - /// There's only pairs sorted by feature id. Before merging to master some index has to be - /// implemented. - /// Don't forget to remove |m_featureId|. - uint32_t m_featureId = 0; - Altitudes m_altitudes; + /// \note |m_pointAlt| is a vector of feature point altitudes. There's two posibilities: + /// * |m_pointAlt| is empty. It means no altitude information defines. + /// * size of |m_pointAlt| is equal to feature point number. In that case every item of + /// |m_pointAlt| defines altitude in meters for every feature point. If altitude is not defined + /// for some feature point corresponding vector items are equel to |kInvalidAltitude| + TAltitudes m_pointAlt; }; } // namespace feature |