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:
authorvng <viktor.govako@gmail.com>2011-01-30 20:38:30 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:11:21 +0300
commit8371e69d15eaeecb270dcbdfa448598d436bb196 (patch)
treeb556c2352c13d370a3a2bad67c9a445f0b58513c /indexer/geometry_serialization.hpp
parent3551c4143e840e52b7ffb247e7a1c8ebde861965 (diff)
Build-in new geometry coding API in feature geometry serilization.
Only for pathes for a while ...
Diffstat (limited to 'indexer/geometry_serialization.hpp')
-rw-r--r--indexer/geometry_serialization.hpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/indexer/geometry_serialization.hpp b/indexer/geometry_serialization.hpp
new file mode 100644
index 0000000000..974a3c1b9a
--- /dev/null
+++ b/indexer/geometry_serialization.hpp
@@ -0,0 +1,65 @@
+#pragma once
+
+#include "../geometry/point2d.hpp"
+
+#include "../coding/writer.hpp"
+#include "../coding/varint.hpp"
+
+#include "../base/buffer_vector.hpp"
+#include "../base/stl_add.hpp"
+
+
+namespace serial
+{
+ template <class T, class TSink>
+ inline void WriteVarUintArray(vector<T> const & v, TSink & sink)
+ {
+ for (size_t i = 0; i != v.size(); ++i)
+ WriteVarUint(sink, v[i]);
+ }
+
+ void EncodePath(vector<m2::PointD> const & points, int64_t base, vector<uint64_t> & deltas);
+
+ typedef buffer_vector<m2::PointD, 32> OutPointsT;
+ void DecodePath(vector<uint64_t> const & deltas, int64_t base, OutPointsT & points);
+
+ template <class TSink>
+ void SaveInnerPath(vector<m2::PointD> const & points, int64_t base, TSink & sink)
+ {
+ vector<uint64_t> deltas;
+ EncodePath(points, base, deltas);
+ WriteVarUintArray(deltas, sink);
+ }
+
+ template <class TSink>
+ void SaveOuterPath(vector<m2::PointD> const & points, int64_t base, TSink & sink)
+ {
+ vector<uint64_t> deltas;
+ EncodePath(points, base, deltas);
+
+ vector<char> buffer;
+ MemWriter<vector<char> > writer(buffer);
+ WriteVarUintArray(deltas, writer);
+
+ uint32_t const count = buffer.size();
+ WriteVarUint(sink, count);
+ sink.Write(&buffer[0], count);
+ }
+
+ void const * LoadInnerPath(void const * pBeg, size_t count, int64_t base, OutPointsT & points);
+
+ template <class TSource>
+ void LoadOuterPath(TSource & src, int64_t base, OutPointsT & points)
+ {
+ uint32_t const count = ReadVarUint<uint32_t>(src);
+ vector<char> buffer(count);
+ char * p = &buffer[0];
+ src.Read(p, count);
+
+ vector<uint64_t> deltas;
+ deltas.reserve(count / 2);
+ ReadVarUint64Array(p, p + count, MakeBackInsertFunctor(deltas));
+
+ DecodePath(deltas, base, points);
+ }
+}