From b4d6df902253637f24647d3db2bc3781d69eec1c Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Thu, 20 Feb 2025 22:54:56 +0100 Subject: Initial commit --- src/args.cc | 293 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 src/args.cc (limited to 'src/args.cc') diff --git a/src/args.cc b/src/args.cc new file mode 100644 index 0000000..a89c418 --- /dev/null +++ b/src/args.cc @@ -0,0 +1,293 @@ +#include "args.hh" + +#include +#include +#include +#include + +namespace { + +class OptionImpl : public OptionWithArg { +public: + OptionImpl(char short_name, std::string long_name, std::string description, + bool require_arg, std::string arg_description) + : short_name_(short_name), + long_name_(std::move(long_name)), + description_(std::move(description)), + require_arg_(require_arg), + arg_description_(std::move(arg_description)) { + } + + bool is_set() const override { return set_; } + + std::string const& arg() const override { return arg_; } + + char short_name() const { return short_name_; } + + std::string const& long_name() const { return long_name_; } + + std::string const& description() const { return description_; } + + bool require_arg() const { return require_arg_; } + + std::string const& arg_description() const { return arg_description_; } + + void reset() { + set_ = false; + arg_.clear(); + } + + void set() { + set_ = true; + } + + void set_arg(std::string arg) { + arg_ = std::move(arg); + } + +private: + char const short_name_; + std::string const long_name_; + std::string const description_; + bool const require_arg_; + std::string const arg_description_; + bool set_ = false; + std::string arg_; +}; + +class ArgsImpl : public Args { +public: + ArgsImpl() = default; + + std::shared_ptr