Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-07-29 10:59:18 +0300
committerVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-08-04 08:05:38 +0300
commitc8d53fa85cc413f6a1c3dfbdb1bf15a71792f265 (patch)
treef4c8006c88a2ce54e4858d3a990c217f3fa85c0e /indexer/feature_altitude.hpp
parent927891f51b79bfb96773d349bf078ecaef21c765 (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.hpp48
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