From bd6c90bf00dd75ec8ae2d662283cdd57287409c2 Mon Sep 17 00:00:00 2001 From: artemp Date: Thu, 19 Feb 2015 17:13:43 +0100 Subject: [PATCH] remove CoordArray and read points directly into line_string or linear_ring --- src/wkb.cpp | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/wkb.cpp b/src/wkb.cpp index c685e5b15..fe95b8b0e 100644 --- a/src/wkb.cpp +++ b/src/wkb.cpp @@ -25,15 +25,12 @@ #include #include #include -#include #include #include namespace mapnik { -using CoordinateArray = coord_array; - struct wkb_reader : util::noncopyable { private: @@ -221,15 +218,17 @@ private: return d; } - template - void read_coords(CoordinateArray& ar) + template + void read_coords(Ring & ring, std::size_t num_points) { - if (! needSwap_) + double x,y; + if (!needSwap_) { - for (auto & coord : ar) + for (std::size_t i = 0; i < num_points; ++i) { - read_double_ndr(wkb_ + pos_, coord.x); - read_double_ndr(wkb_ + pos_ + 8, coord.y); + read_double_ndr(wkb_ + pos_, x); + read_double_ndr(wkb_ + pos_ + 8, y); + ring.emplace_back(x,y); pos_ += 16; // skip XY if (Z) pos_ += 8; if (M) pos_ += 8; @@ -237,10 +236,11 @@ private: } else { - for (auto & coord : ar) + for (std::size_t i = 0; i < num_points; ++i) { - read_double_xdr(wkb_ + pos_, coord.x); - read_double_xdr(wkb_ + pos_ + 8, coord.y); + read_double_xdr(wkb_ + pos_, x); + read_double_xdr(wkb_ + pos_ + 8, y); + ring.emplace_back(x,y); pos_ += 16; // skip XY if (Z) pos_ += 8; if (M) pos_ += 8; @@ -279,14 +279,8 @@ private: int num_points = read_integer(); if (num_points > 0) { - CoordinateArray ar(num_points); - read_coords(ar); - line.reserve(num_points); - for (int i = 0; i < num_points; ++i) - { - line.add_coord(ar[i].x, ar[i].y); - } + read_coords(line, num_points); } return line; } @@ -322,12 +316,7 @@ private: if (num_points > 0) { ring.reserve(num_points); - CoordinateArray ar(num_points); - read_coords(ar); - for (int j = 0; j < num_points ; ++j) - { - ring.emplace_back(ar[j].x, ar[j].y); - } + read_coords(ring, num_points); } if ( i == 0) poly.set_exterior_ring(std::move(ring)); else poly.add_hole(std::move(ring));