diff options
author | vng <viktor.govako@gmail.com> | 2011-01-30 20:38:30 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:11:21 +0300 |
commit | 8371e69d15eaeecb270dcbdfa448598d436bb196 (patch) | |
tree | b556c2352c13d370a3a2bad67c9a445f0b58513c /indexer/geometry_serialization.hpp | |
parent | 3551c4143e840e52b7ffb247e7a1c8ebde861965 (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.hpp | 65 |
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); + } +} |