Skip to content

Commit 0996e8b

Browse files
committed
Call after_node/way/relation functions on osmdata in any case
Make sure we are calling the after_node/way/relation functions on osmdata_t even if some type of object is missing. This way we are sure any type of cleanup etc. is always done.
1 parent aa1813f commit 0996e8b

File tree

1 file changed

+36
-15
lines changed

1 file changed

+36
-15
lines changed

src/input.cpp

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -204,32 +204,37 @@ prepare_input_files(std::vector<std::string> const &input_files,
204204
return files;
205205
}
206206

207-
static void apply(osmium::OSMObject &object, osmdata_t &osmdata,
208-
progress_display_t &progress)
207+
static osmium::item_type apply(osmium::OSMObject &object, osmdata_t &osmdata,
208+
progress_display_t &progress)
209209
{
210210
static osmium::item_type last_type = osmium::item_type::node;
211211

212212
if (last_type != object.type()) {
213213
if (last_type == osmium::item_type::node) {
214214
osmdata.after_nodes();
215215
progress.start_way_counter();
216-
} else if (last_type == osmium::item_type::way) {
216+
}
217+
if (object.type() == osmium::item_type::relation) {
217218
osmdata.after_ways();
218219
progress.start_relation_counter();
219220
}
220221
last_type = object.type();
221222
}
222223

223224
osmium::apply_item(object, osmdata, progress);
225+
226+
return last_type;
224227
}
225228

226-
static void process_single_file(osmium::io::File const &file,
227-
osmdata_t &osmdata,
228-
progress_display_t &progress, bool append)
229+
static osmium::item_type process_single_file(osmium::io::File const &file,
230+
osmdata_t &osmdata,
231+
progress_display_t &progress,
232+
bool append)
229233
{
230234
osmium::io::Reader reader{file};
231235
type_id_version last{osmium::item_type::node, 0, 0};
232236

237+
osmium::item_type last_type = osmium::item_type::node;
233238
while (osmium::memory::Buffer buffer = reader.read()) {
234239
for (auto &object : buffer.select<osmium::OSMObject>()) {
235240
last = check_input(last, object);
@@ -238,16 +243,19 @@ static void process_single_file(osmium::io::File const &file,
238243
"Input file contains deleted objects but "
239244
"you are not in append mode."};
240245
}
241-
apply(object, osmdata, progress);
246+
last_type = apply(object, osmdata, progress);
242247
}
243248
}
244249

245250
reader.close();
251+
252+
return last_type;
246253
}
247254

248-
static void process_multiple_files(std::vector<osmium::io::File> const &files,
249-
osmdata_t &osmdata,
250-
progress_display_t &progress, bool append)
255+
static osmium::item_type
256+
process_multiple_files(std::vector<osmium::io::File> const &files,
257+
osmdata_t &osmdata, progress_display_t &progress,
258+
bool append)
251259
{
252260
std::vector<data_source_t> data_sources;
253261
data_sources.reserve(files.size());
@@ -262,6 +270,7 @@ static void process_multiple_files(std::vector<osmium::io::File> const &files,
262270
}
263271
}
264272

273+
osmium::item_type last_type = osmium::item_type::node;
265274
while (!queue.empty()) {
266275
auto element = queue.top();
267276
queue.pop();
@@ -271,7 +280,7 @@ static void process_multiple_files(std::vector<osmium::io::File> const &files,
271280
"Input file contains deleted objects but "
272281
"you are not in append mode."};
273282
}
274-
apply(element.object(), osmdata, progress);
283+
last_type = apply(element.object(), osmdata, progress);
275284
}
276285

277286
auto *source = element.data_source();
@@ -283,17 +292,29 @@ static void process_multiple_files(std::vector<osmium::io::File> const &files,
283292
for (auto &data_source : data_sources) {
284293
data_source.close();
285294
}
295+
296+
return last_type;
286297
}
287298

288299
void process_files(std::vector<osmium::io::File> const &files,
289300
osmdata_t &osmdata, bool append, bool show_progress)
290301
{
291302
progress_display_t progress{show_progress};
292303

293-
if (files.size() == 1) {
294-
process_single_file(files.front(), osmdata, progress, append);
295-
} else {
296-
process_multiple_files(files, osmdata, progress, append);
304+
auto const last_type =
305+
(files.size() == 1)
306+
? process_single_file(files.front(), osmdata, progress, append)
307+
: process_multiple_files(files, osmdata, progress, append);
308+
309+
switch (last_type) {
310+
case osmium::item_type::node:
311+
osmdata.after_nodes();
312+
// fallthrough
313+
case osmium::item_type::way:
314+
osmdata.after_ways();
315+
break;
316+
default:
317+
break;
297318
}
298319

299320
osmdata.after_relations();

0 commit comments

Comments
 (0)