diff --git a/README.md b/README.md index 24c7464..327950b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Download the latest [`argparse.hpp`](https://raw.githubusercontent.com/cwpearson int main(int argc, char **argv) { // A parser object - Parser p; + argparse::Parser p; // Program data corresponding to flags, options, and positional arguments bool verbose = false; @@ -70,7 +70,7 @@ They are invoked like `--long-opt value` (not `--long-opt=value`). ```c++ -Parser p; +argparse::Parser p; p.add_option(var1, "--long-opt") ``` @@ -81,7 +81,7 @@ The boolean variable is ALWAYS set to `true` if the flag is found. They are invoked like `--long-flag` (not `--long-flag=true` or `--long-flag true`). ```c++ -Parser p; +argparse::Parser p; p.add_option(flag1, "--long-flag") p.add_option(flag2, "--antother-flag", "-s"); ``` @@ -94,7 +94,7 @@ Use `required()` to require them. `add_positional()` returns a `PosnlBase *` that may be queried with `found()` to see if an optional positional argument was found. ```c++ -Parser p; +argparse::Parser p; p.add_positional(var1)->required(); auto something = p.add_positional(var2); if (something->found()) { @@ -107,7 +107,7 @@ Here, the first `--` is the value for `--option` and will be in `s1`. The second `--` marks the beginning of positional arguments. and the string `aa` will be in `s2`. ```c++ -Parser p; +argparse::Parser p; std::string s1, s2; p.add_option(s1, "--option"); p.add_positional(s2); @@ -123,7 +123,7 @@ $ ./myexe --option -- -- aa ## Parsing ```c++ -Parser p; +argparse::Parser p; // set up flags, arguments, and options p.parse(argc, argv); ``` diff --git a/examples/example1.cpp b/examples/example1.cpp index b4d3001..b2e7c42 100644 --- a/examples/example1.cpp +++ b/examples/example1.cpp @@ -3,7 +3,7 @@ int main(int argc, char **argv) { // A parser object - Parser p; + argparse::Parser p; // Program data corresponding to flags, options, and positional arguments bool verbose = false; diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 8dbb13b..2e46431 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -1,12 +1,11 @@ #pragma once -#include -#include #include #include +#include +#include - - +namespace argparse { class OptionBase { public: @@ -21,9 +20,7 @@ template class Option : public OptionBase { public: Option(T &val, const std::string &l) : long_(l), val_(&val) {} void set_val(const std::string &val) override { set_val((T *)nullptr, val); } - const std::string &long_str() override { - return long_; - } + const std::string &long_str() override { return long_; } private: void set_val(size_t *, const std::string &val) { // convert to size_t @@ -50,20 +47,17 @@ class Flag { bool *val_; public: - Flag(bool &val, const std::string &l, const std::string &s) : long_(l), short_(s), val_(&val) {} + Flag(bool &val, const std::string &l, const std::string &s) + : long_(l), short_(s), val_(&val) {} const std::string &long_str() const noexcept { return long_; } const std::string &short_str() const noexcept { return short_; } void set() const noexcept { *val_ = true; } - void help(const std::string &s) { - help_ = s; - } + void help(const std::string &s) { help_ = s; } - const std::string &help_str() const noexcept { - return help_; - } + const std::string &help_str() const noexcept { return help_; } }; class PosnlBase { @@ -91,12 +85,12 @@ public: // use nullpointer type to disambiguate call // https://stackoverflow.com/questions/5512910/explicit-specialization-of-template-class-member-function - void set_val(const std::string &val) { + void set_val(const std::string &val) { found_ = true; - set_val((T *)nullptr, val); + set_val((T *)nullptr, val); } - bool found() override {return found_; } + bool found() override { return found_; } private: // https://stackoverflow.com/questions/5512910/explicit-specialization-of-template-class-member-function @@ -124,8 +118,8 @@ class Parser { std::string description_; bool noUnrecognized_; // error on unrecognized flags / opts - bool help_; // help has been requested - bool consume_; // remove consumed values from argc, argv + bool help_; // help has been requested + bool consume_; // remove consumed values from argc, argv std::vector opts_; std::vector flags_; @@ -159,26 +153,26 @@ class Parser { } public: - Parser() : noUnrecognized_(false), help_(false), consume_(true) { add_flag(help_, "--help", "-h")->help("Print help message"); - } - Parser(const std::string &description) : description_(description), noUnrecognized_(false), help_(false), consume_(true) { + } + Parser(const std::string &description) + : description_(description), noUnrecognized_(false), help_(false), + consume_(true) { add_flag(help_, "--help", "-h")->help("Print help message"); - } + } - bool parse(int &argc, char ** argv) { + bool parse(int &argc, char **argv) { - std::vector newArgv; + std::vector newArgv; if (argc > 0) { newArgv.push_back(argv[0]); } - size_t pi = 0; // positional argument position + size_t pi = 0; // positional argument position bool optsOkay = true; // okay to interpret as opt/flag for (int i = 1; i < argc; ++i) { - // try interpreting as a flag or option if it looks like one if (optsOkay && starts_with(argv[i], "-")) { // '--' indicates only positional arguments follow @@ -208,8 +202,8 @@ public: ++pi; } else { newArgv.push_back(argv[i]); - std::cerr << "encountered unexpected positional argument " << pi << ": " << argv[i] - << "\n"; + std::cerr << "encountered unexpected positional argument " << pi + << ": " << argv[i] << "\n"; } } } @@ -228,7 +222,6 @@ public: } } - return true; }; @@ -265,18 +258,14 @@ public: } /*! \brief error on unrecognized flags and options - */ - void no_unrecognized() { - noUnrecognized_ = true; - } + */ + void no_unrecognized() { noUnrecognized_ = true; } /*! \brief don't modify argc/argv - */ - void no_consume() { - consume_ = false; - } + */ + void no_consume() { consume_ = false; } - bool need_help() const noexcept { - return help_; - } + bool need_help() const noexcept { return help_; } }; + +} // namespace argparse \ No newline at end of file diff --git a/test/test_argparse.cpp b/test/test_argparse.cpp index 8732e89..4b42663 100644 --- a/test/test_argparse.cpp +++ b/test/test_argparse.cpp @@ -15,7 +15,7 @@ TEST_CASE("argparse") { }; int argc = sizeof(argv) / sizeof(argv[0]); - Parser p; + argparse::Parser p; bool campi = false; size_t x; @@ -45,7 +45,7 @@ TEST_CASE("argparse") { SECTION("no args") { char *argv[] = {nullptr}; int argc = sizeof(argv) / sizeof(argv[0]); - Parser p; + argparse::Parser p; REQUIRE(p.parse(argc, argv)); } @@ -56,7 +56,7 @@ TEST_CASE("argparse") { }; int argc = sizeof(argv) / sizeof(argv[0]); - Parser p("a test program"); + argparse::Parser p("a test program"); REQUIRE(p.parse(argc, argv)); } @@ -64,7 +64,7 @@ TEST_CASE("argparse") { char *argv[] = {"some-exe"}; int argc = sizeof(argv) / sizeof(argv[0]); - Parser p; + argparse::Parser p; p.no_unrecognized(); REQUIRE(p.parse(argc, argv)); } @@ -73,7 +73,7 @@ TEST_CASE("argparse") { char *argv[] = {"some-exe", "-f"}; int argc = sizeof(argv) / sizeof(argv[0]); - Parser p; + argparse::Parser p; p.no_unrecognized(); REQUIRE(false == p.parse(argc, argv)); } @@ -85,7 +85,7 @@ TEST_CASE("argparse") { std::string a; std::string b; - Parser p; + argparse::Parser p; p.add_positional(a)->required(); p.add_positional(b)->required(); REQUIRE(false == p.parse(argc, argv)); @@ -98,7 +98,7 @@ TEST_CASE("argparse") { std::string a; std::string b; - Parser p; + argparse::Parser p; REQUIRE(true == p.parse(argc, argv)); REQUIRE(p.need_help()); @@ -112,7 +112,7 @@ TEST_CASE("argparse") { std::string a; std::string b; - Parser p; + argparse::Parser p; REQUIRE(true == p.parse(argc, argv)); REQUIRE(p.need_help()); } @@ -124,7 +124,7 @@ TEST_CASE("argparse") { std::string a; std::string b; - Parser p; + argparse::Parser p; REQUIRE(true == p.parse(argc, argv)); REQUIRE(p.need_help()); }