@@ -204,24 +204,59 @@ 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+ class input_context_t
209208{
210- static osmium::item_type last_type = osmium::item_type::node;
211-
212- if (last_type != object.type ()) {
213- if (last_type == osmium::item_type::node) {
214- osmdata.after_nodes ();
215- progress.start_way_counter ();
216- } else if (last_type == osmium::item_type::way) {
217- osmdata.after_ways ();
218- progress.start_relation_counter ();
209+ public:
210+ input_context_t (osmdata_t &osmdata, progress_display_t &progress,
211+ bool append)
212+ : m_osmdata(osmdata), m_progress(progress), m_append(append)
213+ {}
214+
215+ void apply (osmium::OSMObject &object)
216+ {
217+ if (!m_append && object.deleted ()) {
218+ throw std::runtime_error{" Input file contains deleted objects but "
219+ " you are not in append mode." };
219220 }
220- last_type = object.type ();
221+
222+ if (m_last_type != object.type ()) {
223+ if (m_last_type == osmium::item_type::node) {
224+ m_osmdata.after_nodes ();
225+ m_progress.start_way_counter ();
226+ }
227+ if (object.type () == osmium::item_type::relation) {
228+ m_osmdata.after_ways ();
229+ m_progress.start_relation_counter ();
230+ }
231+ m_last_type = object.type ();
232+ }
233+
234+ osmium::apply_item (object, m_osmdata, m_progress);
221235 }
222236
223- osmium::apply_item (object, osmdata, progress);
224- }
237+ void eof ()
238+ {
239+ switch (m_last_type) {
240+ case osmium::item_type::node:
241+ m_osmdata.after_nodes ();
242+ // fallthrough
243+ case osmium::item_type::way:
244+ m_osmdata.after_ways ();
245+ break ;
246+ default :
247+ break ;
248+ }
249+
250+ m_osmdata.after_relations ();
251+ m_progress.print_summary ();
252+ }
253+
254+ private:
255+ osmdata_t &m_osmdata;
256+ progress_display_t &m_progress;
257+ osmium::item_type m_last_type = osmium::item_type::node;
258+ bool m_append;
259+ }; // class input_context_t
225260
226261static void process_single_file (osmium::io::File const &file,
227262 osmdata_t &osmdata,
@@ -230,17 +265,14 @@ static void process_single_file(osmium::io::File const &file,
230265 osmium::io::Reader reader{file};
231266 type_id_version last{osmium::item_type::node, 0 , 0 };
232267
268+ input_context_t ctx{osmdata, progress, append};
233269 while (osmium::memory::Buffer buffer = reader.read ()) {
234270 for (auto &object : buffer.select <osmium::OSMObject>()) {
235271 last = check_input (last, object);
236- if (!append && object.deleted ()) {
237- throw std::runtime_error{
238- " Input file contains deleted objects but "
239- " you are not in append mode." };
240- }
241- apply (object, osmdata, progress);
272+ ctx.apply (object);
242273 }
243274 }
275+ ctx.eof ();
244276
245277 reader.close ();
246278}
@@ -262,23 +294,20 @@ static void process_multiple_files(std::vector<osmium::io::File> const &files,
262294 }
263295 }
264296
297+ input_context_t ctx{osmdata, progress, append};
265298 while (!queue.empty ()) {
266299 auto element = queue.top ();
267300 queue.pop ();
268301 if (queue.empty () || element != queue.top ()) {
269- if (!append && element.object ().deleted ()) {
270- throw std::runtime_error{
271- " Input file contains deleted objects but "
272- " you are not in append mode." };
273- }
274- apply (element.object (), osmdata, progress);
302+ ctx.apply (element.object ());
275303 }
276304
277305 auto *source = element.data_source ();
278306 if (source->next ()) {
279307 queue.emplace (source->get (), source);
280308 }
281309 }
310+ ctx.eof ();
282311
283312 for (auto &data_source : data_sources) {
284313 data_source.close ();
@@ -295,7 +324,4 @@ void process_files(std::vector<osmium::io::File> const &files,
295324 } else {
296325 process_multiple_files (files, osmdata, progress, append);
297326 }
298-
299- osmdata.after_relations ();
300- progress.print_summary ();
301327}
0 commit comments