@@ -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
288299void 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