From 2eb0f5f3f0cf2652f81ff5357c41528f56ae2668 Mon Sep 17 00:00:00 2001 From: "Taylor C. Richberger" Date: Fri, 11 Jan 2019 10:48:17 -0700 Subject: fix default args for extra types Many types were not storing their default arguments, and reset was simply clearing them. This was obviously not the right behavior. --- args.hxx | 56 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/args.hxx b/args.hxx index 548162b..1eb8da8 100644 --- a/args.hxx +++ b/args.hxx @@ -3414,6 +3414,7 @@ namespace args protected: List values; + const List defaultValues; Nargs nargs; Reader reader; @@ -3434,7 +3435,7 @@ namespace args typedef std::reverse_iterator const_reverse_iterator; NargsValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Nargs nargs_, const List &defaultValues_ = {}, Options options_ = {}) - : FlagBase(name_, help_, std::move(matcher_), options_), values(defaultValues_), nargs(nargs_) + : FlagBase(name_, help_, std::move(matcher_), options_), values(defaultValues_), defaultValues(defaultValues_),nargs(nargs_) { group_.Add(*this); } @@ -3499,6 +3500,12 @@ namespace args { return values.cend(); } + + virtual void Reset() noexcept override + { + FlagBase::Reset(); + values = defaultValues; + } }; /** An argument-accepting flag class that pushes the found values into a list @@ -3516,6 +3523,7 @@ namespace args private: using Container = List; Container values; + const Container defaultValues; Reader reader; public: @@ -3534,7 +3542,7 @@ namespace args typedef std::reverse_iterator const_reverse_iterator; ValueFlagList(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Container &defaultValues_ = Container(), Options options_ = {}): - ValueFlagBase(name_, help_, std::move(matcher_), options_), values(defaultValues_) + ValueFlagBase(name_, help_, std::move(matcher_), options_), values(defaultValues_), defaultValues(defaultValues_) { group_.Add(*this); } @@ -3572,7 +3580,7 @@ namespace args virtual void Reset() noexcept override { ValueFlagBase::Reset(); - values.clear(); + values = defaultValues; } iterator begin() noexcept @@ -3623,6 +3631,7 @@ namespace args private: const Map map; T value; + const T defaultValue; Reader reader; protected: @@ -3633,7 +3642,7 @@ namespace args public: - MapFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), map(map_), value(defaultValue_) + MapFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), map(map_), value(defaultValue_), defaultValue(defaultValue_) { group_.Add(*this); } @@ -3684,6 +3693,12 @@ namespace args { return value; } + + virtual void Reset() noexcept override + { + ValueFlagBase::Reset(); + value = defaultValue; + } }; /** A mapping value flag list class @@ -3706,6 +3721,7 @@ namespace args using Container = List; const Map map; Container values; + const Container defaultValues; Reader reader; protected: @@ -3728,7 +3744,7 @@ namespace args typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; - MapFlagList(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, const Container &defaultValues_ = Container()): ValueFlagBase(name_, help_, std::move(matcher_)), map(map_), values(defaultValues_) + MapFlagList(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, const Container &defaultValues_ = Container()): ValueFlagBase(name_, help_, std::move(matcher_)), map(map_), values(defaultValues_), defaultValues(defaultValues_) { group_.Add(*this); } @@ -3780,7 +3796,7 @@ namespace args virtual void Reset() noexcept override { ValueFlagBase::Reset(); - values.clear(); + values = defaultValues; } iterator begin() noexcept @@ -3826,9 +3842,10 @@ namespace args { private: T value; + const T defaultValue; Reader reader; public: - Positional(Group &group_, const std::string &name_, const std::string &help_, const T &defaultValue_ = T(), Options options_ = {}): PositionalBase(name_, help_, options_), value(defaultValue_) + Positional(Group &group_, const std::string &name_, const std::string &help_, const T &defaultValue_ = T(), Options options_ = {}): PositionalBase(name_, help_, options_), value(defaultValue_), defaultValue(defaultValue_) { group_.Add(*this); } @@ -3859,6 +3876,12 @@ namespace args { return value; } + + virtual void Reset() noexcept override + { + PositionalBase::Reset(); + value = defaultValue; + } }; /** A positional argument class that pushes the found values into a list @@ -3876,6 +3899,7 @@ namespace args private: using Container = List; Container values; + const Container defaultValues; Reader reader; public: @@ -3892,7 +3916,7 @@ namespace args typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; - PositionalList(Group &group_, const std::string &name_, const std::string &help_, const Container &defaultValues_ = Container(), Options options_ = {}): PositionalBase(name_, help_, options_), values(defaultValues_) + PositionalList(Group &group_, const std::string &name_, const std::string &help_, const Container &defaultValues_ = Container(), Options options_ = {}): PositionalBase(name_, help_, options_), values(defaultValues_), defaultValues(defaultValues_) { group_.Add(*this); } @@ -3933,7 +3957,7 @@ namespace args virtual void Reset() noexcept override { PositionalBase::Reset(); - values.clear(); + values = defaultValues; } iterator begin() noexcept @@ -3984,6 +4008,7 @@ namespace args private: const Map map; T value; + const T defaultValue; Reader reader; protected: @@ -3995,7 +4020,7 @@ namespace args public: MapPositional(Group &group_, const std::string &name_, const std::string &help_, const Map &map_, const T &defaultValue_ = T(), Options options_ = {}): - PositionalBase(name_, help_, options_), map(map_), value(defaultValue_) + PositionalBase(name_, help_, options_), map(map_), value(defaultValue_), defaultValue(defaultValue_) { group_.Add(*this); } @@ -4038,6 +4063,12 @@ namespace args { return value; } + + virtual void Reset() noexcept override + { + PositionalBase::Reset(); + value = defaultValue; + } }; /** A positional argument mapping list class @@ -4061,6 +4092,7 @@ namespace args const Map map; Container values; + const Container defaultValues; Reader reader; protected: @@ -4084,7 +4116,7 @@ namespace args typedef std::reverse_iterator const_reverse_iterator; MapPositionalList(Group &group_, const std::string &name_, const std::string &help_, const Map &map_, const Container &defaultValues_ = Container(), Options options_ = {}): - PositionalBase(name_, help_, options_), map(map_), values(defaultValues_) + PositionalBase(name_, help_, options_), map(map_), values(defaultValues_), defaultValues(defaultValues_) { group_.Add(*this); } @@ -4135,7 +4167,7 @@ namespace args virtual void Reset() noexcept override { PositionalBase::Reset(); - values.clear(); + values = defaultValues; } iterator begin() noexcept -- cgit v1.2.1