This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to tag v1.1.0 in repository osmium-tool.
commit a4a8f3d5aa04d9622107a8425d8ed3c4c57ddd74 Author: Jochen Topf <joc...@topf.org> Date: Sun Jun 28 11:13:54 2015 +0200 Refactoring of command line parsing code for input/output files. There was a lot of duplicated code here (with some slight modifications here or there). This is now much cleaner. --- src/command_apply_changes.cpp | 33 +---------- src/command_apply_changes.hpp | 13 +--- src/command_cat.cpp | 46 +------------- src/command_cat.hpp | 11 +--- src/command_check_refs.cpp | 18 +----- src/command_check_refs.hpp | 8 +-- src/command_fileinfo.cpp | 14 +---- src/command_fileinfo.hpp | 5 +- src/command_merge_changes.cpp | 43 ++------------ src/command_merge_changes.hpp | 14 +---- src/command_time_filter.cpp | 32 +--------- src/command_time_filter.hpp | 15 +---- src/main.cpp | 2 - src/osmc.hpp | 135 +++++++++++++++++++++++++++++++++++++----- 14 files changed, 139 insertions(+), 250 deletions(-) diff --git a/src/command_apply_changes.cpp b/src/command_apply_changes.cpp index 036075e..f8f48b4 100644 --- a/src/command_apply_changes.cpp +++ b/src/command_apply_changes.cpp @@ -63,30 +63,10 @@ bool CommandApplyChanges::setup(const std::vector<std::string>& arguments) { po::store(po::command_line_parser(arguments).options(desc).positional(positional).run(), vm); po::notify(vm); - if (vm.count("input-filename")) { - m_input_filename = vm["input-filename"].as<std::string>(); - } - if (vm.count("change-filenames")) { m_change_filenames = vm["change-filenames"].as<std::vector<std::string>>(); } - if (vm.count("output")) { - m_output_filename = vm["output"].as<std::string>(); - } - - if (vm.count("input-format")) { - m_input_format = vm["input-format"].as<std::string>(); - } - - if (vm.count("output-format")) { - m_output_format = vm["output-format"].as<std::string>(); - } - - if (vm.count("overwrite")) { - m_output_overwrite = osmium::io::overwrite::allow; - } - if (vm.count("simplify")) { m_simplify_change = true; } @@ -103,15 +83,8 @@ bool CommandApplyChanges::setup(const std::vector<std::string>& arguments) { m_vout.verbose(true); } - if ((m_output_filename == "-" || m_output_filename == "") && m_output_format.empty()) { - throw argument_error("When writing to STDOUT you need to use the --output-format,f option to declare the file format."); - } - - if ((m_input_filename == "-" || m_input_filename == "") && m_input_format.empty()) { - throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); - } - - m_output_file = osmium::io::File(m_output_filename, m_output_format); + setup_input_file(vm); + setup_output_file(vm); m_vout << "Started osmium apply-changes\n"; @@ -178,7 +151,7 @@ bool CommandApplyChanges::run() { } m_vout << "Opening input file...\n"; - osmium::io::Reader reader(m_input_filename, osmium::osm_entity_bits::object); + osmium::io::Reader reader(m_input_file, osmium::osm_entity_bits::object); osmium::io::Header header = reader.header(); header.set("generator", m_generator); diff --git a/src/command_apply_changes.hpp b/src/command_apply_changes.hpp index 770bb71..1db7eae 100644 --- a/src/command_apply_changes.hpp +++ b/src/command_apply_changes.hpp @@ -26,26 +26,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <string> #include <vector> -#include <osmium/io/file.hpp> -#include <osmium/io/overwrite.hpp> - #include "osmc.hpp" -class CommandApplyChanges : public Command { +class CommandApplyChanges : public Command, with_single_osm_input, with_osm_output { - std::string m_input_filename = "-"; // default: stdin - std::string m_output_filename = "-"; // default: stdout std::vector<std::string> m_change_filenames; - std::string m_input_format; - std::string m_output_format; - - osmium::io::overwrite m_output_overwrite = osmium::io::overwrite::no; bool m_simplify_change = false; bool m_remove_deleted = false; - osmium::io::File m_output_file; - public: CommandApplyChanges() = default; diff --git a/src/command_cat.cpp b/src/command_cat.cpp index 3605f49..426d2b1 100644 --- a/src/command_cat.cpp +++ b/src/command_cat.cpp @@ -68,32 +68,10 @@ bool CommandCat::setup(const std::vector<std::string>& arguments) { m_generator = vm["generator"].as<std::string>(); } - if (vm.count("input-filenames")) { - m_input_filenames = vm["input-filenames"].as<std::vector<std::string>>(); - } else { - m_input_filenames.push_back("-"); // default is stdin - } - - if (vm.count("output")) { - m_output_filename = vm["output"].as<std::string>(); - } - - if (vm.count("input-format")) { - m_input_format = vm["input-format"].as<std::string>(); - } - - if (vm.count("output-format")) { - m_output_format = vm["output-format"].as<std::string>(); - } - if (vm.count("output-header")) { m_output_headers = vm["output-header"].as<std::vector<std::string>>(); } - if (vm.count("overwrite")) { - m_output_overwrite = osmium::io::overwrite::allow; - } - if (vm.count("object-type")) { m_osm_entity_bits = osmium::osm_entity_bits::nothing; for (const auto& t : vm["object-type"].as<std::vector<std::string>>()) { @@ -141,28 +119,8 @@ bool CommandCat::setup(const std::vector<std::string>& arguments) { } m_vout << "\n"; - if ((m_output_filename == "-" || m_output_filename == "") && m_output_format.empty()) { - throw argument_error("When writing to STDOUT you need to use the --output-format,f option to declare the file format."); - } - - if (m_input_format.empty()) { - bool uses_stdin = false; - for (auto& filename : m_input_filenames) { - if (filename.empty() || filename == "-") { - uses_stdin = true; - } - } - if (uses_stdin) { - throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); - } - } - - m_output_file = osmium::io::File(m_output_filename, m_output_format); - - for (const std::string& input_filename : m_input_filenames) { - osmium::io::File input_file(input_filename, m_input_format); - m_input_files.push_back(input_file); - } + setup_input_files(vm); + setup_output_file(vm); return true; } diff --git a/src/command_cat.hpp b/src/command_cat.hpp index b09f0b2..9673c56 100644 --- a/src/command_cat.hpp +++ b/src/command_cat.hpp @@ -26,22 +26,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <string> #include <vector> -#include <osmium/io/file.hpp> -#include <osmium/io/overwrite.hpp> #include <osmium/osm/entity_bits.hpp> #include "osmc.hpp" -class CommandCat : public Command { +class CommandCat : public Command, with_multiple_osm_inputs, with_osm_output { - std::vector<std::string> m_input_filenames; - std::string m_output_filename = "-"; // default: stdout - std::string m_input_format; - std::string m_output_format; std::vector<std::string> m_output_headers; - osmium::io::File m_output_file; - std::vector<osmium::io::File> m_input_files; - osmium::io::overwrite m_output_overwrite = osmium::io::overwrite::no; osmium::osm_entity_bits::type m_osm_entity_bits = osmium::osm_entity_bits::all; public: diff --git a/src/command_check_refs.cpp b/src/command_check_refs.cpp index 579279c..cacc32b 100644 --- a/src/command_check_refs.cpp +++ b/src/command_check_refs.cpp @@ -68,14 +68,6 @@ bool CommandCheckRefs::setup(const std::vector<std::string>& arguments) { m_show_ids = true; } - if (vm.count("input-filename")) { - m_input_filename = vm["input-filename"].as<std::string>(); - } - - if (vm.count("input-format")) { - m_input_format = vm["input-format"].as<std::string>(); - } - if (vm.count("check-relations")) { m_check_relations = true; } @@ -88,15 +80,7 @@ bool CommandCheckRefs::setup(const std::vector<std::string>& arguments) { m_vout << " show ids: " << (m_show_ids ? "yes\n" : "no\n"); m_vout << " check relations: " << (m_check_relations ? "yes\n" : "no\n"); - if ((m_input_filename == "-" || m_input_filename == "") && m_input_format.empty()) { - throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); - } - - if (m_input_format.empty()) { - m_input_file = osmium::io::File(m_input_filename); - } else { - m_input_file = osmium::io::File(m_input_filename, m_input_format); - } + setup_input_file(vm); return true; } diff --git a/src/command_check_refs.hpp b/src/command_check_refs.hpp index ccfddc9..d8bfbea 100644 --- a/src/command_check_refs.hpp +++ b/src/command_check_refs.hpp @@ -25,15 +25,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <string> -#include <osmium/io/file.hpp> - #include "osmc.hpp" -class CommandCheckRefs : public Command { - - std::string m_input_filename = "-"; // default: stdin - std::string m_input_format; - osmium::io::File m_input_file; +class CommandCheckRefs : public Command, with_single_osm_input { bool m_show_ids = false; bool m_check_relations = false; diff --git a/src/command_fileinfo.cpp b/src/command_fileinfo.cpp index f27bfab..2f8ba06 100644 --- a/src/command_fileinfo.cpp +++ b/src/command_fileinfo.cpp @@ -515,14 +515,6 @@ bool CommandFileinfo::setup(const std::vector<std::string>& arguments) { m_json_output = true; } - if (vm.count("input-format")) { - m_input_format = vm["input-format"].as<std::string>(); - } - - if (vm.count("input-filename")) { - m_input_filename = vm["input-filename"].as<std::string>(); - } - std::vector<std::string> known_values = { "file.name", "file.format", @@ -571,11 +563,7 @@ bool CommandFileinfo::setup(const std::vector<std::string>& arguments) { throw argument_error("You can not use --get/-g and --json/-j together."); } - if ((m_input_filename == "-" || m_input_filename == "") && m_input_format.empty()) { - throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); - } - - m_input_file = osmium::io::File(m_input_filename, m_input_format); + setup_input_file(vm); return true; } diff --git a/src/command_fileinfo.hpp b/src/command_fileinfo.hpp index 26bfcef..497954f 100644 --- a/src/command_fileinfo.hpp +++ b/src/command_fileinfo.hpp @@ -29,13 +29,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "osmc.hpp" -class CommandFileinfo : public Command { +class CommandFileinfo : public Command, with_single_osm_input { - std::string m_input_filename = "-"; // default: stdin bool m_extended = false; bool m_json_output = false; - std::string m_input_format; - osmium::io::File m_input_file; std::string m_get_value; public: diff --git a/src/command_merge_changes.cpp b/src/command_merge_changes.cpp index b9d1417..331b08d 100644 --- a/src/command_merge_changes.cpp +++ b/src/command_merge_changes.cpp @@ -61,26 +61,6 @@ bool CommandMergeChanges::setup(const std::vector<std::string>& arguments) { po::store(po::command_line_parser(arguments).options(desc).positional(positional).run(), vm); po::notify(vm); - if (vm.count("input-filenames")) { - m_input_filenames = vm["input-filenames"].as<std::vector<std::string>>(); - } - - if (vm.count("output")) { - m_output_filename = vm["output"].as<std::string>(); - } - - if (vm.count("input-format")) { - m_input_format = vm["input-format"].as<std::string>(); - } - - if (vm.count("output-format")) { - m_output_format = vm["output-format"].as<std::string>(); - } - - if (vm.count("overwrite")) { - m_output_overwrite = osmium::io::overwrite::allow; - } - if (vm.count("simplify")) { m_simplify_change = true; } @@ -93,23 +73,8 @@ bool CommandMergeChanges::setup(const std::vector<std::string>& arguments) { m_vout.verbose(true); } - if ((m_output_filename == "-" || m_output_filename == "") && m_output_format.empty()) { - throw argument_error("When writing to STDOUT you need to use the --output-format,f option to declare the file format."); - } - - if (m_input_format.empty()) { - bool uses_stdin = false; - for (auto& filename : m_input_filenames) { - if (filename.empty() || filename == "-") { - uses_stdin = true; - } - } - if (uses_stdin) { - throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); - } - } - - m_output_file = osmium::io::File(m_output_filename, m_output_format); + setup_input_files(vm); + setup_output_file(vm); m_vout << "Started osmium merge-changes\n"; @@ -135,8 +100,8 @@ bool CommandMergeChanges::run() { // read all input files, keep the buffers around and add pointer // to each object to objects collection. m_vout << "Reading change file contents...\n"; - for (const std::string& change_file_name : m_input_filenames) { - osmium::io::Reader reader(change_file_name, osmium::osm_entity_bits::object); + for (osmium::io::File& change_file : m_input_files) { + osmium::io::Reader reader(change_file, osmium::osm_entity_bits::object); while (osmium::memory::Buffer buffer = reader.read()) { osmium::apply(buffer, objects); changes.push_back(std::move(buffer)); diff --git a/src/command_merge_changes.hpp b/src/command_merge_changes.hpp index 1708b66..42c2312 100644 --- a/src/command_merge_changes.hpp +++ b/src/command_merge_changes.hpp @@ -26,24 +26,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <string> #include <vector> -#include <osmium/io/file.hpp> -#include <osmium/io/overwrite.hpp> - #include "osmc.hpp" -class CommandMergeChanges : public Command { - - std::vector<std::string> m_input_filenames; - std::string m_output_filename = "-"; // default: stdout +class CommandMergeChanges : public Command, with_multiple_osm_inputs, with_osm_output { - std::string m_input_format; - std::string m_output_format; - - osmium::io::overwrite m_output_overwrite = osmium::io::overwrite::no; bool m_simplify_change = false; - osmium::io::File m_output_file; - public: CommandMergeChanges() = default; diff --git a/src/command_time_filter.cpp b/src/command_time_filter.cpp index cb7324c..59ec4cb 100644 --- a/src/command_time_filter.cpp +++ b/src/command_time_filter.cpp @@ -62,26 +62,6 @@ bool CommandTimeFilter::setup(const std::vector<std::string>& arguments) { po::store(po::command_line_parser(arguments).options(desc).positional(positional).run(), vm); po::notify(vm); - if (vm.count("input-filename")) { - m_input_filename = vm["input-filename"].as<std::string>(); - } - - if (vm.count("output")) { - m_output_filename = vm["output"].as<std::string>(); - } - - if (vm.count("input-format")) { - m_input_format = vm["input-format"].as<std::string>(); - } - - if (vm.count("output-format")) { - m_output_format = vm["output-format"].as<std::string>(); - } - - if (vm.count("overwrite")) { - m_output_overwrite = osmium::io::overwrite::allow; - } - if (vm.count("verbose")) { m_vout.verbose(true); } @@ -105,16 +85,8 @@ bool CommandTimeFilter::setup(const std::vector<std::string>& arguments) { } } - if ((m_output_filename == "-" || m_output_filename == "") && m_output_format.empty()) { - throw argument_error("When writing to STDOUT you need to use the --output-format,f option to declare the file format."); - } - - if ((m_input_filename == "-" || m_input_filename == "") && m_input_format.empty()) { - throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); - } - - m_input_file = osmium::io::File(m_input_filename, m_input_format); - m_output_file = osmium::io::File(m_output_filename, m_output_format); + setup_input_file(vm); + setup_output_file(vm); if (m_from == m_to) { // point in time if (m_output_file.has_multiple_object_versions()) { diff --git a/src/command_time_filter.hpp b/src/command_time_filter.hpp index e4e0b71..1ec4382 100644 --- a/src/command_time_filter.hpp +++ b/src/command_time_filter.hpp @@ -26,24 +26,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <string> #include <vector> -#include <osmium/io/file.hpp> -#include <osmium/io/overwrite.hpp> #include <osmium/osm/timestamp.hpp> #include "osmc.hpp" -class CommandTimeFilter : public Command { - - std::string m_input_filename = "-"; // default: stdin - std::string m_output_filename = "-"; // default: stdout - - std::string m_input_format; - std::string m_output_format; - - osmium::io::overwrite m_output_overwrite = osmium::io::overwrite::no; - - osmium::io::File m_input_file; - osmium::io::File m_output_file; +class CommandTimeFilter : public Command, with_single_osm_input, with_osm_output { osmium::Timestamp m_from; osmium::Timestamp m_to; diff --git a/src/main.cpp b/src/main.cpp index 4795e5c..a39295a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,8 +24,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <string> #include <vector> -#include <boost/program_options.hpp> - #include <osmpbf/osmpbf.h> #include "osmc.hpp" diff --git a/src/osmc.hpp b/src/osmc.hpp index 014731e..0b5ec2a 100644 --- a/src/osmc.hpp +++ b/src/osmc.hpp @@ -29,9 +29,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <string> #include <vector> +#include <boost/program_options.hpp> + +#include <osmium/io/file.hpp> +#include <osmium/io/overwrite.hpp> #include <osmium/util/verbose_output.hpp> /** + * Thrown when there is a problem with the command line arguments. + */ +struct argument_error : std::runtime_error { + + argument_error(const char* message) : + std::runtime_error(message) { + } + + argument_error(const std::string& message) : + std::runtime_error(message) { + } + +}; + +/** * Virtual base class for commands that can be called from the command line. */ class Command { @@ -72,6 +91,107 @@ public: }; // class Command +class with_single_osm_input { + +protected: + + std::string m_input_filename = "-"; // default: stdin + std::string m_input_format; + osmium::io::File m_input_file; + +public: + + void setup_input_file(const boost::program_options::variables_map& vm) { + if (vm.count("input-filename")) { + m_input_filename = vm["input-filename"].as<std::string>(); + } + + if (vm.count("input-format")) { + m_input_format = vm["input-format"].as<std::string>(); + } + + if ((m_input_filename == "-" || m_input_filename == "") && m_input_format.empty()) { + throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); + } + + m_input_file = osmium::io::File(m_input_filename, m_input_format); + } + +}; // class with_single_osm_input + +class with_multiple_osm_inputs { + +protected: + + std::vector<std::string> m_input_filenames; + std::string m_input_format; + std::vector<osmium::io::File> m_input_files; + +public: + + void setup_input_files(const boost::program_options::variables_map& vm) { + if (vm.count("input-filenames")) { + m_input_filenames = vm["input-filenames"].as<std::vector<std::string>>(); + } else { + m_input_filenames.push_back("-"); // default is stdin + } + + if (vm.count("input-format")) { + m_input_format = vm["input-format"].as<std::string>(); + } + + if (m_input_format.empty()) { + bool uses_stdin = false; + for (auto& filename : m_input_filenames) { + if (filename.empty() || filename == "-") { + uses_stdin = true; + } + } + if (uses_stdin) { + throw argument_error("When reading from STDIN you need to use the --input-format,F option to declare the file format."); + } + } + + for (const std::string& input_filename : m_input_filenames) { + osmium::io::File input_file(input_filename, m_input_format); + m_input_files.push_back(input_file); + } + } + +}; // class with_multiple_osm_inputs + +class with_osm_output { + +protected: + + std::string m_output_filename = "-"; // default: stdout + std::string m_output_format; + osmium::io::File m_output_file; + osmium::io::overwrite m_output_overwrite = osmium::io::overwrite::no; + +public: + + void setup_output_file(const boost::program_options::variables_map& vm) { + if (vm.count("output")) { + m_output_filename = vm["output"].as<std::string>(); + } + + if (vm.count("output-format")) { + m_output_format = vm["output-format"].as<std::string>(); + } + + if (vm.count("overwrite")) { + m_output_overwrite = osmium::io::overwrite::allow; + } + + if ((m_output_filename == "-" || m_output_filename == "") && m_output_format.empty()) { + throw argument_error("When writing to STDOUT you need to use the --output-format,f option to declare the file format."); + } + + m_output_file = osmium::io::File(m_output_filename, m_output_format); + } + +}; // class with_osm_output /** * All commands than can be called from the command line are registered @@ -143,19 +263,4 @@ public: }; // class CommandFactory -/** - * Thrown when there is a problem with the command line arguments. - */ -struct argument_error : std::runtime_error { - - argument_error(const char* message) : - std::runtime_error(message) { - } - - argument_error(const std::string& message) : - std::runtime_error(message) { - } - -}; - #endif // OSMC_HPP -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osmium-tool.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel