From ff93a0a580416f73bc86c7a12c5637819ca146e6 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Wed, 22 Jul 2026 21:32:59 +0200 Subject: rewrite: sort out and modernize Boost.Program_Options usage --- aesxx/utils/helpers/cmd_parser.hpp | 15 +++++-------- aesxx/utils/helpers/cmd_parser_block.hpp | 22 +++++------------- aesxx/utils/helpers/cmd_parser_file.hpp | 30 +++++++------------------ aesxx/utils/helpers/data_parsers.hpp | 38 +++++++++++++++----------------- 4 files changed, 38 insertions(+), 67 deletions(-) diff --git a/aesxx/utils/helpers/cmd_parser.hpp b/aesxx/utils/helpers/cmd_parser.hpp index 11146e8..cc8d00c 100644 --- a/aesxx/utils/helpers/cmd_parser.hpp +++ b/aesxx/utils/helpers/cmd_parser.hpp @@ -28,20 +28,17 @@ public: } virtual void parse(int argc, char* argv[]) { - boost::program_options::options_description all; + namespace po = boost::program_options; + po::options_description all; all.add(hidden).add(visible); - boost::program_options::variables_map vm; - boost::program_options::store( - boost::program_options::command_line_parser{argc, argv} - .options(all) - .positional(positional) - .run(), - vm + po::variables_map vm; + po::store( + po::command_line_parser{argc, argv}.options(all).positional(positional).run(), vm ); if (vm.count("help")) _exit_with_usage = true; else - boost::program_options::notify(vm); + po::notify(vm); } bool exit_with_usage() const { diff --git a/aesxx/utils/helpers/cmd_parser_block.hpp b/aesxx/utils/helpers/cmd_parser_block.hpp index 7e24874..b3412d0 100644 --- a/aesxx/utils/helpers/cmd_parser_block.hpp +++ b/aesxx/utils/helpers/cmd_parser_block.hpp @@ -50,20 +50,14 @@ public: }; explicit BlockSettings(std::string_view argv0) : SettingsParser{argv0} { + namespace po = boost::program_options; + + visible.add_options()("verbose,v", po::bool_switch(&_verbose), "enable verbose output"); visible.add_options()( - "verbose,v", boost::program_options::bool_switch(&_verbose), "enable verbose output" - ); - visible.add_options()( - "algorithm,a", - boost::program_options::value(&algorithm) - ->required() - ->value_name("NAME"), - "set algorithm" + "algorithm,a", po::value(&algorithm)->required()->value_name("NAME"), "set algorithm" ); visible.add_options()( - "mode,m", - boost::program_options::value(&mode)->required()->value_name("MODE"), - "set mode of operation" + "mode,m", po::value(&mode)->required()->value_name("MODE"), "set mode of operation" ); } @@ -74,11 +68,7 @@ public: void parse(int argc, char* argv[]) override { std::vector args; - hidden.add_options()( - "args", - boost::program_options::value>(&args), - "shouldn't be visible" - ); + hidden.add_options()("args", boost::program_options::value(&args), "shouldn't be visible"); positional.add("args", -1); SettingsParser::parse(argc, argv); diff --git a/aesxx/utils/helpers/cmd_parser_file.hpp b/aesxx/utils/helpers/cmd_parser_file.hpp index 8adfb1d..d66c139 100644 --- a/aesxx/utils/helpers/cmd_parser_file.hpp +++ b/aesxx/utils/helpers/cmd_parser_file.hpp @@ -14,46 +14,32 @@ #include #include -#include #include #include -#include class FileSettings : public SettingsParser { public: explicit FileSettings(std::string_view argv0) : SettingsParser{argv0} { + namespace po = boost::program_options; + visible.add_options()( - "algorithm,a", - boost::program_options::value(&algorithm) - ->required() - ->value_name("NAME"), - "set algorithm" + "algorithm,a", po::value(&algorithm)->required()->value_name("NAME"), "set algorithm" ); visible.add_options()( - "mode,m", - boost::program_options::value(&mode)->required()->value_name("MODE"), - "set mode of operation" + "mode,m", po::value(&mode)->required()->value_name("MODE"), "set mode of operation" ); visible.add_options()( - "key,k", - boost::program_options::value(&key)->required()->value_name("KEY"), - "set encryption key" + "key,k", po::value(&key)->required()->value_name("KEY"), "set encryption key" ); visible.add_options()( - "iv,v", - boost::program_options::value(&iv)->value_name("BLOCK"), - "set initialization vector" + "iv,v", po::value(&iv)->value_name("BLOCK"), "set initialization vector" ); visible.add_options()( - "input,i", - boost::program_options::value(&input_path)->required()->value_name("PATH"), - "set input file path" + "input,i", po::value(&input_path)->required()->value_name("PATH"), "set input file path" ); visible.add_options()( "output,o", - boost::program_options::value(&output_path) - ->required() - ->value_name("PATH"), + po::value(&output_path)->required()->value_name("PATH"), "set output file path" ); } diff --git a/aesxx/utils/helpers/data_parsers.hpp b/aesxx/utils/helpers/data_parsers.hpp index a66a433..fc44f80 100644 --- a/aesxx/utils/helpers/data_parsers.hpp +++ b/aesxx/utils/helpers/data_parsers.hpp @@ -8,16 +8,20 @@ #include #include -#include +#include #include -#include #include #include +#include -inline std::istream& operator>>(std::istream& is, aes::Mode& dest) { - std::string src; - is >> src; +namespace boost { + +inline void validate(any& dest, const std::vector& values, aes::Mode*, int) { + using namespace program_options; + + validators::check_first_occurrence(dest); + const auto& src = validators::get_single_string(values); static const std::unordered_map lookup_table = { {"ecb", AES_ECB}, @@ -27,18 +31,17 @@ inline std::istream& operator>>(std::istream& is, aes::Mode& dest) { {"ctr", AES_CTR}, }; - const auto it = lookup_table.find(boost::algorithm::to_lower_copy(src)); - + const auto it = lookup_table.find(algorithm::to_lower_copy(src)); if (it == lookup_table.cend()) - throw boost::program_options::invalid_option_value(src); - + throw invalid_option_value(src); dest = it->second; - return is; } -inline std::istream& operator>>(std::istream& is, aes::Algorithm& dest) { - std::string src; - is >> src; +inline void validate(any& dest, const std::vector& values, aes::Algorithm*, int) { + using namespace program_options; + + validators::check_first_occurrence(dest); + const auto& src = validators::get_single_string(values); static const std::unordered_map lookup_table = { {"aes128", AES_AES128}, @@ -46,17 +49,12 @@ inline std::istream& operator>>(std::istream& is, aes::Algorithm& dest) { {"aes256", AES_AES256}, }; - const auto it = lookup_table.find(boost::algorithm::to_lower_copy(src)); - + const auto it = lookup_table.find(algorithm::to_lower_copy(src)); if (it == lookup_table.cend()) - throw boost::program_options::invalid_option_value(src); - + throw invalid_option_value(src); dest = it->second; - return is; } -namespace boost { - inline void validate(any& dest, const std::vector& values, aes::Block*, int) { const std::string& src = program_options::validators::get_single_string(values); dest = aes::Block{src}; -- cgit v1.3