diff options
author | vng <viktor.govako@gmail.com> | 2011-01-05 03:33:57 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:09:17 +0300 |
commit | 29fad748ac0872c398802e3d9e4ae467f2093713 (patch) | |
tree | 9da666da3511503d44bb1e1b200bd4db540a68c6 /indexer/feature_impl.hpp | |
parent | e44cfb91ab0fdc510912b18880dd9d04533594b5 (diff) |
Better geometry sorting.
Divide geometry in separate files in files-container.
Diffstat (limited to 'indexer/feature_impl.hpp')
-rw-r--r-- | indexer/feature_impl.hpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/indexer/feature_impl.hpp b/indexer/feature_impl.hpp new file mode 100644 index 0000000000..8f7a914ec1 --- /dev/null +++ b/indexer/feature_impl.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include "cell_id.hpp" + +#include "../coding/write_to_sink.hpp" +#include "../coding/varint.hpp" + +#include "../geometry/point2d.hpp" + +namespace feature +{ + namespace detail + { + struct pt_2_id + { + int64_t operator() (m2::PointD const & p) const + { + return PointToInt64(p.x, p.y); + } + }; + } + + template <class TSink> + void SerializePoints(vector<m2::PointD> const & points, TSink & sink) + { + uint32_t const ptsCount = points.size(); + ASSERT_GREATER_OR_EQUAL(ptsCount, 1, ()); + + vector<int64_t> geom; + geom.reserve(ptsCount); + transform(points.begin(), points.end(), back_inserter(geom), detail::pt_2_id()); + + if (ptsCount == 1) + { + WriteVarInt(sink, geom[0]); + } + else + { + WriteVarUint(sink, ptsCount - 1); + for (size_t i = 0; i < ptsCount; ++i) + WriteVarInt(sink, i == 0 ? geom[0] : geom[i] - geom[i-1]); + } + } + + template <class TSink> + void SerializeTriangles(vector<int64_t> triangles, TSink & sink) + { + if (!triangles.empty()) + { + ASSERT_EQUAL(triangles.size() % 3, 0, (triangles.size())); + WriteVarUint(sink, triangles.size() / 3 - 1); + for (size_t i = 0; i < triangles.size(); ++i) + WriteVarInt(sink, i == 0 ? triangles[i] : (triangles[i] - triangles[i-1])); + } + } + + static int g_arrScales[] = { 5, 10, 14, 17 }; // 17 = scales::GetUpperScale() +} |