Skip to content

Commit a656aa8

Browse files
committed
Make multigeometry_t not derive from std::vector
Cleans up the API of that class.
1 parent f91eb31 commit a656aa8

File tree

4 files changed

+47
-20
lines changed

4 files changed

+47
-20
lines changed

src/geom-functions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ static void split_linestring(linestring_t const &line, double split_at,
237237
}
238238

239239
if (out->size() <= 1) {
240-
output->resize(output->num_geometries() - 1);
240+
output->remove_last();
241241
}
242242
}
243243

src/geom.hpp

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,32 +168,59 @@ class polygon_t
168168
}; // class polygon_t
169169

170170
template <typename GEOM>
171-
class multigeometry_t : public std::vector<GEOM>
171+
class multigeometry_t
172172
{
173173
public:
174174
using const_iterator = typename std::vector<GEOM>::const_iterator;
175+
using iterator = typename std::vector<GEOM>::const_iterator;
176+
using value_type = GEOM;
175177

176178
[[nodiscard]] std::size_t num_geometries() const noexcept
177179
{
178-
return this->size();
180+
return m_geometry.size();
179181
}
180182

181-
void add_geometry(GEOM &&geom) { this->push_back(std::move(geom)); }
183+
GEOM &add_geometry(GEOM &&geom)
184+
{
185+
m_geometry.push_back(std::move(geom));
186+
return m_geometry.back();
187+
}
182188

183-
[[nodiscard]] GEOM &add_geometry() { return this->emplace_back(); }
189+
[[nodiscard]] GEOM &add_geometry() { return m_geometry.emplace_back(); }
184190

185191
[[nodiscard]] friend bool operator==(multigeometry_t const &a,
186192
multigeometry_t const &b) noexcept
187193
{
188-
return std::equal(a.cbegin(), a.cend(), b.cbegin(), b.cend());
194+
return a.m_geometry == b.m_geometry;
189195
}
190196

191197
[[nodiscard]] friend bool operator!=(multigeometry_t const &a,
192198
multigeometry_t const &b) noexcept
193199
{
194-
return !(a == b);
200+
return a.m_geometry != b.m_geometry;
201+
}
202+
203+
const_iterator begin() const noexcept { return m_geometry.cbegin(); }
204+
const_iterator end() const noexcept { return m_geometry.cend(); }
205+
const_iterator cbegin() const noexcept { return m_geometry.cbegin(); }
206+
const_iterator cend() const noexcept { return m_geometry.cend(); }
207+
208+
GEOM const &operator[](std::size_t i) const noexcept
209+
{
210+
return m_geometry[i];
195211
}
196212

213+
void remove_last()
214+
{
215+
assert(!m_geometry.empty());
216+
m_geometry.pop_back();
217+
}
218+
219+
void reserve(std::size_t size) { m_geometry.reserve(size); }
220+
221+
private:
222+
std::vector<GEOM> m_geometry;
223+
197224
}; // class multigeometry_t
198225

199226
using multipoint_t = multigeometry_t<point_t>;

src/wkb.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ class ewkb_parser_t
476476

477477
multipoint.reserve(num_geoms);
478478
for (uint32_t i = 0; i < num_geoms; ++i) {
479-
auto &point = multipoint.emplace_back();
479+
auto &point = multipoint.add_geometry();
480480
uint32_t const type = parse_header();
481481
if (type != geometry_type::wkb_point) {
482482
throw std::runtime_error{
@@ -498,7 +498,7 @@ class ewkb_parser_t
498498

499499
multilinestring.reserve(num_geoms);
500500
for (uint32_t i = 0; i < num_geoms; ++i) {
501-
auto &linestring = multilinestring.emplace_back();
501+
auto &linestring = multilinestring.add_geometry();
502502
uint32_t const type = parse_header();
503503
if (type != geometry_type::wkb_line) {
504504
throw std::runtime_error{
@@ -520,7 +520,7 @@ class ewkb_parser_t
520520

521521
multipolygon.reserve(num_geoms);
522522
for (uint32_t i = 0; i < num_geoms; ++i) {
523-
auto &polygon = multipolygon.emplace_back();
523+
auto &polygon = multipolygon.add_geometry();
524524
uint32_t const type = parse_header();
525525
if (type != geometry_type::wkb_polygon) {
526526
throw std::runtime_error{

tests/test-wkb.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ TEST_CASE("wkb: multipoint", "[NoDB]")
9292
geom::geometry_t geom{geom::multipoint_t{}, 46};
9393

9494
auto &mp = geom.get<geom::multipoint_t>();
95-
mp.emplace_back(geom::point_t{{1.2, 2.3}});
96-
mp.emplace_back(geom::point_t{{7.0, 7.0}});
95+
mp.add_geometry(geom::point_t{{1.2, 2.3}});
96+
mp.add_geometry(geom::point_t{{7.0, 7.0}});
9797

9898
auto const result = ewkb_to_geom(geom_to_ewkb(geom));
9999
REQUIRE(result.is_multipoint());
@@ -120,8 +120,8 @@ TEST_CASE("wkb: multilinestring", "[NoDB]")
120120
geom::geometry_t geom{geom::multilinestring_t{}, 46};
121121

122122
auto &ml = geom.get<geom::multilinestring_t>();
123-
ml.emplace_back(geom::linestring_t{{1.2, 2.3}, {3.4, 4.5}, {5.6, 6.7}});
124-
ml.emplace_back(geom::linestring_t{{7.0, 7.0}, {8.0, 7.0}, {8.0, 8.0}});
123+
ml.add_geometry(geom::linestring_t{{1.2, 2.3}, {3.4, 4.5}, {5.6, 6.7}});
124+
ml.add_geometry(geom::linestring_t{{7.0, 7.0}, {8.0, 7.0}, {8.0, 8.0}});
125125

126126
auto const result = ewkb_to_geom(geom_to_ewkb(geom));
127127
REQUIRE(result.is_multilinestring());
@@ -151,14 +151,14 @@ TEST_CASE("wkb: multipolygon", "[NoDB]")
151151

152152
auto &mp = geom.get<geom::multipolygon_t>();
153153
{
154-
auto &p0 = mp.emplace_back(geom::ring_t{
155-
{0.0, 0.0}, {3.0, 0.0}, {3.0, 3.0}, {0.0, 3.0}, {0.0, 0.0}});
154+
auto &p0 = mp.add_geometry(geom::polygon_t{geom::ring_t{
155+
{0.0, 0.0}, {3.0, 0.0}, {3.0, 3.0}, {0.0, 3.0}, {0.0, 0.0}}});
156156
p0.add_inner_ring(geom::ring_t{
157157
{1.0, 1.0}, {2.0, 1.0}, {2.0, 2.0}, {1.0, 2.0}, {1.0, 1.0}});
158158
}
159159

160-
mp.emplace_back(geom::ring_t{
161-
{4.0, 4.0}, {5.0, 4.0}, {5.0, 5.0}, {4.0, 5.0}, {4.0, 4.0}});
160+
mp.add_geometry(geom::polygon_t{geom::ring_t{
161+
{4.0, 4.0}, {5.0, 4.0}, {5.0, 5.0}, {4.0, 5.0}, {4.0, 4.0}}});
162162

163163
auto const result = ewkb_to_geom(geom_to_ewkb(geom));
164164
REQUIRE(result.is_multipolygon());
@@ -172,8 +172,8 @@ TEST_CASE("wkb: geometrycollection", "[NoDB]")
172172
geom::geometry_t geom2{geom::linestring_t{{1.2, 2.3}, {3.4, 4.5}}};
173173
geom::geometry_t geom3{geom::multipolygon_t{}};
174174

175-
geom3.get<geom::multipolygon_t>().emplace_back(geom::ring_t{
176-
{4.0, 4.0}, {5.0, 4.0}, {5.0, 5.0}, {4.0, 5.0}, {4.0, 4.0}});
175+
geom3.get<geom::multipolygon_t>().add_geometry(geom::polygon_t{geom::ring_t{
176+
{4.0, 4.0}, {5.0, 4.0}, {5.0, 5.0}, {4.0, 5.0}, {4.0, 4.0}}});
177177

178178
geom::geometry_t geom{geom::collection_t{}, 49};
179179
auto &c = geom.get<geom::collection_t>();

0 commit comments

Comments
 (0)