diff --git a/include/utils/command_line/arguments.hpp b/include/utils/command_line/arguments.hpp index fae36211a..d4e54c2ca 100644 --- a/include/utils/command_line/arguments.hpp +++ b/include/utils/command_line/arguments.hpp @@ -8,19 +8,32 @@ #include #include #include + +#include "utils/exceptions/basic_exception.hpp" #include "utils/option.hpp" +#define REGISTER_ARGS(argc, argv) \ + ProgramArguments::instance().register_args(argc, argv) +#define REGISTER_REQUIRED_ARGS(vector) \ + ProgramArguments::instance().register_required_args(vector) +#define GET_ARG(flag, default_value) \ + ProgramArguments::instance().get_arg(flag, default_value) +#define GET_ARGS(flag, default_value) \ + ProgramArguments::instance().get_arg_list(flag, default_value) +#define CONTAINS_FLAG(flag) ProgramArguments::instance().contains_flag(flag) +#define CLEAR_ARGS() ProgramArguments::instance().clear() + +// TODO namespace utils namespace { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-function" -class ProgramArgumentException : public std::exception { +class ProgramArgumentException : public BasicException { public: - virtual const char *what() const throw() { - return "Invalid Command Line Arguments"; - } -} arg_exception; + ProgramArgumentException(const std::string &mess) + : BasicException("ProgramArgumentException: " + mess + ".") {} +}; class ProgramArguments { private: @@ -48,10 +61,10 @@ class ProgramArguments { public: Argument(const std::string &arg) : arg_(arg) {} - std::string GetString() { return arg_; } - int GetInteger() { return std::atoi(arg_.c_str()); }; - float GetFloat() { return std::atof(arg_.c_str()); }; - long GetLong() { return std::atol(arg_.c_str()); } + std::string get_string() { return arg_; } + int get_int() { return std::atoi(arg_.c_str()); }; + float get_float() { return std::atof(arg_.c_str()); }; + long get_long() { return std::atol(arg_.c_str()); } }; static ProgramArguments &instance() { @@ -75,7 +88,7 @@ class ProgramArguments { i++; std::string arg(*(argv + i)); if (!is_flag(arg)) - arguments_[flag].push_back(arg); + arguments_[flag].emplace_back(arg); else { i--; break; @@ -86,7 +99,8 @@ class ProgramArguments { if (required_arguments_.empty()) return; - if (!is_valid()) throw arg_exception; + if (!is_valid()) + throw ProgramArgumentException("Required Args not satisfied."); } void register_required_args(std::vector args) { @@ -94,7 +108,8 @@ class ProgramArguments { if (arguments_.empty()) return; - if (!is_valid()) throw arg_exception; + if (!is_valid()) + throw ProgramArgumentException("Required Args not satisfied."); } bool contains_flag(const std::string &flag) { @@ -157,3 +172,4 @@ Option take_argument(std::vector &all, #pragma clang diagnostic pop } +// namespace utils diff --git a/tests/benchmark/data_structures/concurrent/concurrent_map.cpp b/tests/benchmark/data_structures/concurrent/concurrent_map.cpp index a62260817..b0c870941 100644 --- a/tests/benchmark/data_structures/concurrent/concurrent_map.cpp +++ b/tests/benchmark/data_structures/concurrent/concurrent_map.cpp @@ -30,7 +30,7 @@ using IntegerGenerator = NumberGenerator, std::default_random_engine, int>; // Global arguments -int MAX_ELEMENTS = 1 << 20, MULTIPLIER = 2; +int MAX_ELEMENTS = 1 << 18, MULTIPLIER = 2; int THREADS, RANGE_START, RANGE_END, STRING_LENGTH; /* @@ -107,20 +107,16 @@ auto BM_ContainsValue = [](benchmark::State& state, auto* map, auto elements) { -string-length number */ void parse_arguments(int argc, char** argv) { - ProgramArguments::instance().register_args(argc, argv); + REGISTER_ARGS(argc, argv); - RANGE_START = - ProgramArguments::instance().get_arg("-start", "0").GetInteger(); - RANGE_END = - ProgramArguments::instance().get_arg("-end", "1000000000").GetInteger(); + RANGE_START = GET_ARG("-start", "0").get_int(); + RANGE_END = GET_ARG("-end", "1000000000").get_int(); - THREADS = std::min( - ProgramArguments::instance().get_arg("-threads", "1").GetInteger(), - (int)std::thread::hardware_concurrency()); + THREADS = std::min(GET_ARG("-threads", "1").get_int(), + (int)std::thread::hardware_concurrency()); - STRING_LENGTH = ProgramArguments::instance() - .get_arg("-string-length", "128") - .GetInteger(); + STRING_LENGTH = + ProgramArguments::instance().get_arg("-string-length", "128").get_int(); } int main(int argc, char** argv) { diff --git a/tests/benchmark/data_structures/concurrent/concurrent_map_mix.cpp b/tests/benchmark/data_structures/concurrent/concurrent_map_mix.cpp index 85cd85192..7d481e42a 100644 --- a/tests/benchmark/data_structures/concurrent/concurrent_map_mix.cpp +++ b/tests/benchmark/data_structures/concurrent/concurrent_map_mix.cpp @@ -77,14 +77,11 @@ auto BM_Rape = [](benchmark::State& state, auto* map, auto& elements) { -threads number */ void parse_arguments(int argc, char** argv) { - ProgramArguments::instance().register_args(argc, argv); + REGISTER_ARGS(argc, argv); - INSERT_PERC = - ProgramArguments::instance().get_arg("-insert", "50").GetInteger(); - DELETE_PERC = - ProgramArguments::instance().get_arg("-delete", "20").GetInteger(); - CONTAINS_PERC = - ProgramArguments::instance().get_arg("-find", "30").GetInteger(); + INSERT_PERC = GET_ARG("-insert", "50").get_int(); + DELETE_PERC = GET_ARG("-delete", "20").get_int(); + CONTAINS_PERC = GET_ARG("-find", "30").get_int(); if (INSERT_PERC + DELETE_PERC + CONTAINS_PERC != 100) { std::cout << "Invalid percentage" << std::endl; @@ -92,15 +89,12 @@ void parse_arguments(int argc, char** argv) { exit(-1); } - RANGE_START = - ProgramArguments::instance().get_arg("-start", "0").GetInteger(); + RANGE_START = GET_ARG("-start", "0").get_int(); - RANGE_END = - ProgramArguments::instance().get_arg("-end", "1000000000").GetInteger(); + RANGE_END = GET_ARG("-end", "1000000000").get_int(); - THREADS = std::min( - ProgramArguments::instance().get_arg("-threads", "1").GetInteger(), - (int)std::thread::hardware_concurrency()); + THREADS = std::min(GET_ARG("-threads", "1").get_int(), + (int)std::thread::hardware_concurrency()); } int main(int argc, char** argv) { diff --git a/tests/unit/program_argument.cpp b/tests/unit/program_argument.cpp index 0e1a95f8a..a12ae190f 100644 --- a/tests/unit/program_argument.cpp +++ b/tests/unit/program_argument.cpp @@ -7,53 +7,47 @@ #pragma clang diagnostic ignored "-Wwritable-strings" TEST_CASE("ProgramArgument FlagOnly Test") { - ProgramArguments::instance().clear(); + CLEAR_ARGS(); int argc = 2; - char* argv[] = {"ProgramArgument FlagOnly Test", "-test"}; - ProgramArguments::instance().register_args(argc, argv); - ProgramArguments::instance().register_required_args({"-test"}); + REGISTER_ARGS(argc, argv); + REGISTER_REQUIRED_ARGS({"-test"}); - REQUIRE(ProgramArguments::instance().contains_flag("-test") == true); + REQUIRE(CONTAINS_FLAG("-test") == true); } TEST_CASE("ProgramArgument Single Entry Test") { - ProgramArguments::instance().clear(); + CLEAR_ARGS(); int argc = 3; - char* argv[] = {"ProgramArgument Single Entry Test", "-bananas", "99"}; - ProgramArguments::instance().register_required_args({"-bananas"}); - ProgramArguments::instance().register_args(argc, argv); + REGISTER_REQUIRED_ARGS({"-bananas"}); + REGISTER_ARGS(argc, argv); - REQUIRE( - ProgramArguments::instance().get_arg("-bananas", "100").GetInteger() == - 99); + REQUIRE(GET_ARG("-bananas", "100").get_int() == 99); } TEST_CASE("ProgramArgument Multiple Entries Test") { - ProgramArguments::instance().clear(); + CLEAR_ARGS(); int argc = 4; - char* argv[] = {"ProgramArgument Multiple Entries Test", "-files", "first_file.txt", "second_file.txt"}; - ProgramArguments::instance().register_args(argc, argv); + REGISTER_ARGS(argc, argv); - auto files = ProgramArguments::instance().get_arg_list("-files", {}); + auto files = GET_ARGS("-files", {}); - REQUIRE(files[0].GetString() == "first_file.txt"); + REQUIRE(files[0].get_string() == "first_file.txt"); } TEST_CASE("ProgramArgument Combination Test") { - ProgramArguments::instance().clear(); + CLEAR_ARGS(); int argc = 14; - char* argv[] = {"ProgramArgument Combination Test", "-run_tests", "-tests", @@ -69,27 +63,23 @@ TEST_CASE("ProgramArgument Combination Test") { "-import", "data.txt"}; - ProgramArguments::instance().register_args(argc, argv); + REGISTER_ARGS(argc, argv); - REQUIRE(ProgramArguments::instance().contains_flag("-run_tests") == true); + REQUIRE(CONTAINS_FLAG("-run_tests") == true); - auto tests = ProgramArguments::instance().get_arg_list("-tests", {}); - REQUIRE(tests[0].GetString() == "Test1"); - REQUIRE(tests[1].GetString() == "Test2"); - REQUIRE(tests[2].GetString() == "Test3"); + auto tests = GET_ARGS("-tests", {}); + REQUIRE(tests[0].get_string() == "Test1"); + REQUIRE(tests[1].get_string() == "Test2"); + REQUIRE(tests[2].get_string() == "Test3"); - REQUIRE( - ProgramArguments::instance().get_arg("-run_times", "0").GetInteger() == - 10); + REQUIRE(GET_ARG("-run_times", "0").get_int() == 10); - auto exports = ProgramArguments::instance().get_arg_list("-export", {}); - REQUIRE(exports[0].GetString() == "test1.txt"); - REQUIRE(exports[1].GetString() == "test2.txt"); - REQUIRE(exports[2].GetString() == "test3.txt"); + auto exports = GET_ARGS("-export", {}); + REQUIRE(exports[0].get_string() == "test1.txt"); + REQUIRE(exports[1].get_string() == "test2.txt"); + REQUIRE(exports[2].get_string() == "test3.txt"); - REQUIRE( - ProgramArguments::instance().get_arg("-import", "test.txt").GetString() == - "data.txt"); + REQUIRE(GET_ARG("-import", "test.txt").get_string() == "data.txt"); } #pragma clang diagnostic pop