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-05 03:33:57 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:09:17 +0300
commit29fad748ac0872c398802e3d9e4ae467f2093713 (patch)
tree9da666da3511503d44bb1e1b200bd4db540a68c6 /indexer/feature_impl.hpp
parente44cfb91ab0fdc510912b18880dd9d04533594b5 (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.hpp58
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()
+}