Skip to content

Commit 0a3936a

Browse files
authored
Merge pull request #1732 from joto/geom-move-only
Fiddling with the geometry_t type
2 parents 42420b5 + c5f6b2f commit 0a3936a

File tree

3 files changed

+48
-21
lines changed

3 files changed

+48
-21
lines changed

src/geom.hpp

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class multigeometry_t
166166
{
167167
public:
168168
using const_iterator = typename std::vector<GEOM>::const_iterator;
169-
using iterator = typename std::vector<GEOM>::const_iterator;
169+
using iterator = typename std::vector<GEOM>::iterator;
170170
using value_type = GEOM;
171171

172172
[[nodiscard]] std::size_t num_geometries() const noexcept
@@ -176,7 +176,7 @@ class multigeometry_t
176176

177177
GEOM &add_geometry(GEOM &&geom)
178178
{
179-
m_geometry.push_back(std::move(geom));
179+
m_geometry.push_back(std::forward<GEOM>(geom));
180180
return m_geometry.back();
181181
}
182182

@@ -194,6 +194,8 @@ class multigeometry_t
194194
return a.m_geometry != b.m_geometry;
195195
}
196196

197+
iterator begin() noexcept { return m_geometry.begin(); }
198+
iterator end() noexcept { return m_geometry.end(); }
197199
const_iterator begin() const noexcept { return m_geometry.cbegin(); }
198200
const_iterator end() const noexcept { return m_geometry.cend(); }
199201
const_iterator cbegin() const noexcept { return m_geometry.cbegin(); }
@@ -234,8 +236,31 @@ class geometry_t
234236
public:
235237
constexpr geometry_t() = default;
236238

237-
template <typename T>
238-
constexpr explicit geometry_t(T geom, int srid = 4326)
239+
constexpr explicit geometry_t(point_t &&geom, int srid = 4326)
240+
: m_geom(std::move(geom)), m_srid(srid)
241+
{}
242+
243+
constexpr explicit geometry_t(linestring_t &&geom, int srid = 4326)
244+
: m_geom(std::move(geom)), m_srid(srid)
245+
{}
246+
247+
constexpr explicit geometry_t(polygon_t &&geom, int srid = 4326)
248+
: m_geom(std::move(geom)), m_srid(srid)
249+
{}
250+
251+
constexpr explicit geometry_t(multipoint_t &&geom, int srid = 4326)
252+
: m_geom(std::move(geom)), m_srid(srid)
253+
{}
254+
255+
constexpr explicit geometry_t(multilinestring_t &&geom, int srid = 4326)
256+
: m_geom(std::move(geom)), m_srid(srid)
257+
{}
258+
259+
constexpr explicit geometry_t(multipolygon_t &&geom, int srid = 4326)
260+
: m_geom(std::move(geom)), m_srid(srid)
261+
{}
262+
263+
constexpr explicit geometry_t(collection_t &&geom, int srid = 4326)
239264
: m_geom(std::move(geom)), m_srid(srid)
240265
{}
241266

tests/test-geom-linestrings.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,27 @@ TEST_CASE("create_linestring from invalid OSM data", "[NoDB]")
8989

9090
TEST_CASE("geom::segmentize w/o split", "[NoDB]")
9191
{
92-
geom::linestring_t const line{{0, 0}, {1, 2}, {2, 2}};
92+
geom::linestring_t const expected{{0, 0}, {1, 2}, {2, 2}};
93+
geom::linestring_t line = expected;
9394

94-
auto const geom = geom::segmentize(geom::geometry_t{line}, 10.0);
95+
auto const geom = geom::segmentize(geom::geometry_t{std::move(line)}, 10.0);
9596

9697
REQUIRE(geom.is_multilinestring());
9798
REQUIRE(num_geometries(geom) == 1);
9899
auto const &ml = geom.get<geom::multilinestring_t>();
99100
REQUIRE(ml.num_geometries() == 1);
100-
REQUIRE(ml[0] == line);
101+
REQUIRE(ml[0] == expected);
101102
}
102103

103104
TEST_CASE("geom::segmentize with split 0.5", "[NoDB]")
104105
{
105-
geom::linestring_t const line{{0, 0}, {1, 0}};
106+
geom::linestring_t line{{0, 0}, {1, 0}};
106107

107108
std::array<geom::linestring_t, 2> const expected{
108109
geom::linestring_t{{0, 0}, {0.5, 0}},
109110
geom::linestring_t{{0.5, 0}, {1, 0}}};
110111

111-
auto const geom = geom::segmentize(geom::geometry_t{line}, 0.5);
112+
auto const geom = geom::segmentize(geom::geometry_t{std::move(line)}, 0.5);
112113

113114
REQUIRE(geom.is_multilinestring());
114115
auto const &ml = geom.get<geom::multilinestring_t>();
@@ -119,14 +120,14 @@ TEST_CASE("geom::segmentize with split 0.5", "[NoDB]")
119120

120121
TEST_CASE("geom::segmentize with split 0.4", "[NoDB]")
121122
{
122-
geom::linestring_t const line{{0, 0}, {1, 0}};
123+
geom::linestring_t line{{0, 0}, {1, 0}};
123124

124125
std::array<geom::linestring_t, 3> const expected{
125126
geom::linestring_t{{0, 0}, {0.4, 0}},
126127
geom::linestring_t{{0.4, 0}, {0.8, 0}},
127128
geom::linestring_t{{0.8, 0}, {1, 0}}};
128129

129-
auto const geom = geom::segmentize(geom::geometry_t{line}, 0.4);
130+
auto const geom = geom::segmentize(geom::geometry_t{std::move(line)}, 0.4);
130131

131132
REQUIRE(geom.is_multilinestring());
132133
auto const &ml = geom.get<geom::multilinestring_t>();
@@ -138,13 +139,13 @@ TEST_CASE("geom::segmentize with split 0.4", "[NoDB]")
138139

139140
TEST_CASE("geom::segmentize with split 1.0 at start", "[NoDB]")
140141
{
141-
geom::linestring_t const line{{0, 0}, {2, 0}, {3, 0}, {4, 0}};
142+
geom::linestring_t line{{0, 0}, {2, 0}, {3, 0}, {4, 0}};
142143

143144
std::array<geom::linestring_t, 4> const expected{
144145
geom::linestring_t{{0, 0}, {1, 0}}, geom::linestring_t{{1, 0}, {2, 0}},
145146
geom::linestring_t{{2, 0}, {3, 0}}, geom::linestring_t{{3, 0}, {4, 0}}};
146147

147-
auto const geom = geom::segmentize(geom::geometry_t{line}, 1.0);
148+
auto const geom = geom::segmentize(geom::geometry_t{std::move(line)}, 1.0);
148149

149150
REQUIRE(geom.is_multilinestring());
150151
auto const &ml = geom.get<geom::multilinestring_t>();
@@ -157,13 +158,13 @@ TEST_CASE("geom::segmentize with split 1.0 at start", "[NoDB]")
157158

158159
TEST_CASE("geom::segmentize with split 1.0 in middle", "[NoDB]")
159160
{
160-
geom::linestring_t const line{{0, 0}, {1, 0}, {3, 0}, {4, 0}};
161+
geom::linestring_t line{{0, 0}, {1, 0}, {3, 0}, {4, 0}};
161162

162163
std::array<geom::linestring_t, 4> const expected{
163164
geom::linestring_t{{0, 0}, {1, 0}}, geom::linestring_t{{1, 0}, {2, 0}},
164165
geom::linestring_t{{2, 0}, {3, 0}}, geom::linestring_t{{3, 0}, {4, 0}}};
165166

166-
auto const geom = geom::segmentize(geom::geometry_t{line}, 1.0);
167+
auto const geom = geom::segmentize(geom::geometry_t{std::move(line)}, 1.0);
167168

168169
REQUIRE(geom.is_multilinestring());
169170
auto const &ml = geom.get<geom::multilinestring_t>();
@@ -176,13 +177,13 @@ TEST_CASE("geom::segmentize with split 1.0 in middle", "[NoDB]")
176177

177178
TEST_CASE("geom::segmentize with split 1.0 at end", "[NoDB]")
178179
{
179-
geom::linestring_t const line{{0, 0}, {1, 0}, {2, 0}, {4, 0}};
180+
geom::linestring_t line{{0, 0}, {1, 0}, {2, 0}, {4, 0}};
180181

181182
std::array<geom::linestring_t, 4> const expected{
182183
geom::linestring_t{{0, 0}, {1, 0}}, geom::linestring_t{{1, 0}, {2, 0}},
183184
geom::linestring_t{{2, 0}, {3, 0}}, geom::linestring_t{{3, 0}, {4, 0}}};
184185

185-
auto const geom = geom::segmentize(geom::geometry_t{line}, 1.0);
186+
auto const geom = geom::segmentize(geom::geometry_t{std::move(line)}, 1.0);
186187

187188
REQUIRE(geom.is_multilinestring());
188189
auto const &ml = geom.get<geom::multilinestring_t>();

tests/test-geom-multipoints.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919

2020
TEST_CASE("multipoint_t with a single point", "[NoDB]")
2121
{
22-
geom::point_t const point{1, 1};
22+
geom::point_t const expected{1, 1};
23+
geom::point_t point = expected;
2324

2425
geom::geometry_t geom{geom::multipoint_t{}};
2526
auto &mp = geom.get<geom::multipoint_t>();
@@ -29,9 +30,9 @@ TEST_CASE("multipoint_t with a single point", "[NoDB]")
2930
REQUIRE(geometry_type(geom) == "MULTIPOINT");
3031
REQUIRE(num_geometries(geom) == 1);
3132
REQUIRE(area(geom) == Approx(0.0));
32-
REQUIRE(centroid(geom) == geom::geometry_t{point});
33+
REQUIRE(centroid(geom) == geom::geometry_t{std::move(point)});
3334

34-
REQUIRE(mp[0] == point);
35+
REQUIRE(mp[0] == expected);
3536
}
3637

3738
TEST_CASE("multipoint_t with several points", "[NoDB]")
@@ -50,7 +51,7 @@ TEST_CASE("multipoint_t with several points", "[NoDB]")
5051
REQUIRE(geometry_type(geom) == "MULTIPOINT");
5152
REQUIRE(num_geometries(geom) == 3);
5253
REQUIRE(area(geom) == Approx(0.0));
53-
REQUIRE(centroid(geom) == geom::geometry_t{p1});
54+
REQUIRE(centroid(geom) == geom::geometry_t{geom::point_t{2, 1}});
5455

5556
REQUIRE(mp[0] == p0);
5657
REQUIRE(mp[1] == p1);

0 commit comments

Comments
 (0)