From 86bba8d0915823f402e3d827ada088ca788bd616 Mon Sep 17 00:00:00 2001 From: "Taylor C. Richberger" Date: Sun, 1 May 2016 11:05:34 -0600 Subject: Remove variadic arguments because initializer lists don't forward --- args.hxx | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/args.hxx b/args.hxx index a82bbfa..269d9af 100644 --- a/args.hxx +++ b/args.hxx @@ -23,8 +23,8 @@ namespace args class Matcher { private: - std::vector shortOpts; - std::vector longOpts; + const std::vector shortOpts; + const std::vector longOpts; public: // Specify short and long opts separately as iterators @@ -37,9 +37,23 @@ namespace args // Specify short and long opts separately as iterables template Matcher(Short &&shortIn, Long &&longIn) : - Matcher(std::begin(shortIn), std::end(shortIn), std::begin(longIn), std::end(longIn)) + shortOpts(std::begin(shortIn), std::end(shortIn)), longOpts(std::begin(longIn), std::end(longIn)) {} + // Specify short and long opts as initializer lists + template + Matcher(const std::initializer_list &shortIn, const std::initializer_list &longIn) : + shortOpts(std::begin(shortIn), std::end(shortIn)), longOpts(std::begin(longIn), std::end(longIn)) + {} + + Matcher(const Matcher &other) : shortOpts(other.shortOpts), longOpts(other.longOpts) + {} + + Matcher(Matcher &&other) : shortOpts(std::move(other.shortOpts)), longOpts(std::move(other.longOpts)) + {} + + ~Matcher() {} + bool Match(const char opt) const { return std::find(shortOpts.begin(), shortOpts.end(), opt) != shortOpts.end(); @@ -64,12 +78,12 @@ namespace args virtual Base *Match(const std::string &arg) = 0; virtual Base *Match(const char arg) = 0; - virtual bool Matched() const + virtual bool Matched() const noexcept { return matched; } - operator bool() const + operator bool() const noexcept { return matched; } @@ -137,7 +151,7 @@ namespace args return sum; } - virtual bool Matched() const override + virtual bool Matched() const noexcept override { return validator(children.size(), MatchedChildren()); } @@ -274,20 +288,15 @@ namespace args class Flag : public Base { private: - Matcher matcher; + const Matcher matcher; public: - //template - //Flag(std::string help, Types ...args): matcher(args...) {} - - template - Flag(ArgumentParser &parser, std::string help, Types&& ...args): matcher(args...) + Flag(ArgumentParser &parser, std::string help, const Matcher &matcher): matcher(matcher) { parser.Add(*this); } - template - Flag(ArgumentParser &parser, std::string help, const std::initializer_list &shortIn, const std::initializer_list &longIn): matcher(shortIn, longIn) + Flag(ArgumentParser &parser, std::string help, Matcher &&matcher): matcher(std::move(matcher)) { parser.Add(*this); } -- cgit v1.2.1