Skip to content

Commit c4ad5eb

Browse files
committed
Use constants instead of magic numbers in WKB encoding
Also fixes the size for multilinestrings!
1 parent b0734d6 commit c4ad5eb

1 file changed

Lines changed: 21 additions & 8 deletions

File tree

src/wkb.cpp

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -209,37 +209,48 @@ class make_ewkb_visitor_t
209209

210210
std::string operator()(geom::point_t const &geom) const
211211
{
212+
constexpr std::size_t SIZE_POINT_HEADER_WITH_SRID = 1UL + 4UL + 4UL;
213+
constexpr std::size_t SIZE_POINT =
214+
SIZE_POINT_HEADER_WITH_SRID + SIZE_COORDINATE_PAIR;
215+
212216
std::string data;
213217

214218
if (m_ensure_multi) {
215219
write_header(&data, wkb_multi_point, m_srid);
216220
write_length(&data, 1);
217221
write_point(&data, geom);
218222
} else {
219-
// 9 byte header plus one set of coordinates
220-
constexpr std::size_t SIZE = 9 + 2 * 8;
221-
data.reserve(SIZE);
223+
data.reserve(SIZE_POINT);
222224
write_point(&data, geom, m_srid);
223-
assert(data.size() == SIZE);
225+
assert(data.size() == SIZE_POINT);
224226
}
225227

226228
return data;
227229
}
228230

229231
std::string operator()(geom::linestring_t const &geom) const
230232
{
233+
constexpr std::size_t SIZE_HEADER_WITH_COUNT = 1UL + 4UL + 4UL;
234+
constexpr std::size_t SIZE_HEADER_WITH_COUNT_AND_SRID =
235+
SIZE_HEADER_WITH_COUNT + 4UL;
236+
231237
std::string data;
232238

239+
std::size_t const coords_size = geom.size() * SIZE_COORDINATE_PAIR;
240+
233241
if (m_ensure_multi) {
234-
// Two 13 bytes headers plus n sets of coordinates
235-
data.reserve(2UL * 13UL + geom.size() * (2UL * 8UL));
242+
data.reserve(SIZE_HEADER_WITH_COUNT_AND_SRID +
243+
SIZE_HEADER_WITH_COUNT + coords_size);
236244
write_header(&data, wkb_multi_line, m_srid);
237245
write_length(&data, 1);
238246
write_linestring(&data, geom);
247+
assert(data.size() == SIZE_HEADER_WITH_COUNT_AND_SRID +
248+
SIZE_HEADER_WITH_COUNT + coords_size);
239249
} else {
240-
// 13 byte header plus n sets of coordinates
241-
data.reserve(13UL + geom.size() * (2UL * 8UL));
250+
data.reserve(SIZE_HEADER_WITH_COUNT_AND_SRID + coords_size);
242251
write_linestring(&data, geom, m_srid);
252+
assert(data.size() ==
253+
SIZE_HEADER_WITH_COUNT_AND_SRID + coords_size);
243254
}
244255

245256
return data;
@@ -289,6 +300,8 @@ class make_ewkb_visitor_t
289300
}
290301

291302
private:
303+
static constexpr std::size_t SIZE_COORDINATE_PAIR = 2UL * sizeof(double);
304+
292305
uint32_t m_srid;
293306
bool m_ensure_multi;
294307

0 commit comments

Comments
 (0)