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-02-01 23:48:50 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:11:35 +0300
commit5b533632a61ffe61840de3e9fea9d21ed1409f41 (patch)
tree049fbdadfce6993eb64909c301312d31ac95dc68 /indexer/geometry_serialization.hpp
parent6e09c5a8b81a61d59e70a97ea20b57e02bd7202f (diff)
Add parallelogramm prediction for strips serialization.
Diffstat (limited to 'indexer/geometry_serialization.hpp')
-rw-r--r--indexer/geometry_serialization.hpp63
1 files changed, 54 insertions, 9 deletions
diff --git a/indexer/geometry_serialization.hpp b/indexer/geometry_serialization.hpp
index 974a3c1b9a..28608ddd89 100644
--- a/indexer/geometry_serialization.hpp
+++ b/indexer/geometry_serialization.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include "geometry_coding.hpp"
+
#include "../geometry/point2d.hpp"
#include "../coding/writer.hpp"
@@ -18,24 +20,27 @@ namespace serial
WriteVarUint(sink, v[i]);
}
- void EncodePath(vector<m2::PointD> const & points, int64_t base, vector<uint64_t> & deltas);
+ typedef void (*EncodeFunT)(vector<m2::PointU> const &, m2::PointU const &, m2::PointU const &, vector<uint64_t> &);
+ typedef void (*DecodeFunT)(vector<uint64_t> const &, m2::PointU const &, m2::PointU const &, vector<m2::PointU> &);
+
+ void Encode(EncodeFunT fn, 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);
+ void Decode(DecodeFunT fn, 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)
+ void SaveInner(EncodeFunT fn, vector<m2::PointD> const & points, int64_t base, TSink & sink)
{
vector<uint64_t> deltas;
- EncodePath(points, base, deltas);
+ Encode(fn, points, base, deltas);
WriteVarUintArray(deltas, sink);
}
template <class TSink>
- void SaveOuterPath(vector<m2::PointD> const & points, int64_t base, TSink & sink)
+ void SaveOuter(EncodeFunT fn, vector<m2::PointD> const & points, int64_t base, TSink & sink)
{
vector<uint64_t> deltas;
- EncodePath(points, base, deltas);
+ Encode(fn, points, base, deltas);
vector<char> buffer;
MemWriter<vector<char> > writer(buffer);
@@ -46,10 +51,10 @@ namespace serial
sink.Write(&buffer[0], count);
}
- void const * LoadInnerPath(void const * pBeg, size_t count, int64_t base, OutPointsT & points);
+ void const * LoadInner(DecodeFunT fn, void const * pBeg, size_t count, int64_t base, OutPointsT & points);
template <class TSource>
- void LoadOuterPath(TSource & src, int64_t base, OutPointsT & points)
+ void LoadOuter(DecodeFunT fn, TSource & src, int64_t base, OutPointsT & points)
{
uint32_t const count = ReadVarUint<uint32_t>(src);
vector<char> buffer(count);
@@ -60,6 +65,46 @@ namespace serial
deltas.reserve(count / 2);
ReadVarUint64Array(p, p + count, MakeBackInsertFunctor(deltas));
- DecodePath(deltas, base, points);
+ Decode(fn, deltas, base, points);
+ }
+
+
+ /// @name Pathes.
+ //@{
+ template <class TSink>
+ void SaveInnerPath(vector<m2::PointD> const & points, int64_t base, TSink & sink)
+ {
+ SaveInner(&geo_coding::EncodePolyline, points, base, sink);
+ }
+ template <class TSink>
+ void SaveOuterPath(vector<m2::PointD> const & points, int64_t base, TSink & sink)
+ {
+ SaveOuter(&geo_coding::EncodePolyline, points, base, sink);
+ }
+
+ inline void const * LoadInnerPath(void const * pBeg, size_t count, int64_t base, OutPointsT & points)
+ {
+ return LoadInner(&geo_coding::DecodePolyline, pBeg, count, base, points);
+ }
+
+ template <class TSource>
+ void LoadOuterPath(TSource & src, int64_t base, OutPointsT & points)
+ {
+ LoadOuter(&geo_coding::DecodePolyline, src, base, points);
+ }
+ //@}
+
+ /// @name Triangles.
+ //@{
+ template <class TSink>
+ void SaveInnerTriangles(vector<m2::PointD> const & points, int64_t base, TSink & sink)
+ {
+ SaveInner(&geo_coding::EncodeTriangleStrip, points, base, sink);
+ }
+
+ inline void const * LoadInnerTriangles(void const * pBeg, size_t count, int64_t base, OutPointsT & points)
+ {
+ return LoadInner(&geo_coding::DecodeTriangleStrip, pBeg, count, base, points);
}
+ //@}
}