TAP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
ArgumentConstraint.hpp
Go to the documentation of this file.
1 
25 #pragma once
26 
27 #include <algorithm> // find
28 #include <memory> // unique_ptr
29 
30 namespace TAP {
31 
36 enum class ConstraintType {
37  None,
38  One,
39  Any,
40  All,
41 };
42 
51 template<ConstraintType CType>
53 protected:
55  std::vector< std::unique_ptr<BaseArgument> > m_args;
56 
58  std::string m_usageString;
59 
60 public:
66  template<typename ... A>
67  ArgumentConstraint(A&& ... args);
68 
74  for(auto const & arg: other.m_args) {
75  m_args.emplace_back(std::move(arg->clone()));
76  }
77  }
78 
83 
87  virtual ~ArgumentConstraint() {
88  }
89 
94  std::swap(m_args, other.m_args);
95  std::swap(m_usageString, other.m_usageString);
96  return *this;
97  }
98 
103 
110  add(arg);
111  return *this;
112  }
113 
118  size_t size() const {
119  return m_args.size();
120  }
121 
125  void find_all_arguments(std::vector<const Argument*>& collector) const override {
126  for(const auto& arg: m_args) {
127  arg->find_all_arguments(collector);
128  }
129  }
130 
134  void check_valid() const override;
135 
139  std::string usage() const override {
140  return m_usageString;
141  }
142 
146  std::unique_ptr<BaseArgument> clone() const & override {
147  return std::unique_ptr<BaseArgument>(new ArgumentConstraint(*this));
148  }
149 
153  std::unique_ptr<BaseArgument> clone() && override {
154  return std::unique_ptr<BaseArgument>(new ArgumentConstraint(std::move(*this)));
155  }
156 
157 protected:
163  template<typename Arg>
164  ArgumentConstraint& add(Arg&& arg);
165 
169  unsigned int count() const override;
170 
174  void diagnose_args() const;
175 
180  std::string usageArgument(const Argument& arg) const;
181 
186  template<ConstraintType ACType>
187  std::string usageArgument(const ArgumentConstraint<ACType>& arg) const;
188 };
189 
194 class ArgumentSet : public ArgumentConstraint<ConstraintType::Any> {
195 protected:
197  std::string m_name;
198 
200  mutable std::vector<const Argument*> m_args;
201 
203  bool m_updateArgs = true;
204 public:
211  template<typename ... A>
212  ArgumentSet(const std::string& name, A&& ... args);
213 
217  ArgumentSet(const ArgumentSet&) = default;
218 
222  ArgumentSet(ArgumentSet&&) = default;
223 
227  virtual ~ArgumentSet() {
228  }
229 
233  ArgumentSet& operator=(const ArgumentSet&) = default;
234 
238  ArgumentSet& operator=(ArgumentSet&&) = default;
239 
244  const std::string& name() const {
245  return m_name;
246  }
247 
253  const std::vector<const Argument*>& args() const {
254  if (m_updateArgs) {
255  m_args.clear();
257  }
258  return m_args;
259  }
260 
266  template<typename Arg>
267  ArgumentSet& add(Arg&& arg) {
268  ArgumentConstraint<ConstraintType::Any>::add(std::forward<Arg>(arg));
269  m_updateArgs = true;
270  return *this;
271  }
272 
276  std::unique_ptr<BaseArgument> clone() const & override {
277  return std::unique_ptr<BaseArgument>(new ArgumentSet(*this));
278  }
279 
283  std::unique_ptr<BaseArgument> clone() && override {
284  return std::unique_ptr<BaseArgument>(new ArgumentSet(std::move(*this)));
285  }
286 };
287 
288 }
ArgumentConstraint & add(Arg &&arg)
Add an argument to the constraint.
1: Exactly one argument must be set
void check_valid() const override
See BaseArgument::set()
const std::vector< const Argument * > & args() const
Get the Arguments contained in this ArgumentSet.
Definition: ArgumentConstraint.hpp:253
ConstraintType
Enumeration of possible argument constraints.
Definition: ArgumentConstraint.hpp:36
const std::string & name() const
Get the name of this ArgumentSet.
Definition: ArgumentConstraint.hpp:244
n: All arguments must be set
void find_all_arguments(std::vector< const Argument * > &collector) const override
See BaseArgument::find_all_arguments()
Definition: ArgumentConstraint.hpp:125
virtual ~ArgumentConstraint()
ArgumentConstraint destructor.
Definition: ArgumentConstraint.hpp:87
std::vector< std::unique_ptr< BaseArgument > > m_args
Sub-arguments to check.
Definition: ArgumentConstraint.hpp:55
Base argument class, used both by actual Argument classes and constraints (ArgumentConstraint).
Definition: BaseArgument.hpp:40
Simple argument class.
Definition: Argument.hpp:48
void diagnose_args() const
Calls diagnose for all set child arguments.
std::unique_ptr< BaseArgument > clone()&&override
See BaseArgument::clone().
Definition: ArgumentConstraint.hpp:283
virtual ~ArgumentSet()
ArgumentSet destructor.
Definition: ArgumentConstraint.hpp:227
ArgumentConstraint & operator=(ArgumentConstraint other)
ArgumentConstraint assignment operator.
Definition: ArgumentConstraint.hpp:93
unsigned int count() const override
Returns the number of child arguments which are set.
ArgumentConstraint(const ArgumentConstraint &other)
ArgumentConstraint copy constructor.
Definition: ArgumentConstraint.hpp:72
std::vector< const Argument * > m_args
Cached arguments.
Definition: ArgumentConstraint.hpp:200
ArgumentConstraint(A &&...args)
Construct a ArgumentConstraint with the (possibly empty) given list of arguments. ...
std::string usage() const override
See BaseArgument::usage()
Definition: ArgumentConstraint.hpp:139
0: No arguments may be set
ArgumentSet & operator=(const ArgumentSet &)=default
ArgumentSet assignment.
std::string usageArgument(const Argument &arg) const
Returns a string for usage representation of sub-arguments.
[1,n]: At least one argument must be set
bool m_updateArgs
If true updates list of known arguments when retrieving them.
Definition: ArgumentConstraint.hpp:203
ArgumentSet & add(Arg &&arg)
Add an argument to the set.
Definition: ArgumentConstraint.hpp:267
Argument constraint class.
Definition: ArgumentConstraint.hpp:52
size_t size() const
Returns the number of contained sub-arguments.
Definition: ArgumentConstraint.hpp:118
ArgumentConstraint & operator+=(Argument &arg)
Appends the given argument to the constraint.
Definition: ArgumentConstraint.hpp:109
Simple set of arguments.
Definition: ArgumentConstraint.hpp:194
std::unique_ptr< BaseArgument > clone() const &override
See BaseArgument::clone().
Definition: ArgumentConstraint.hpp:146
std::string m_name
The name of this ArgumentSet.
Definition: ArgumentConstraint.hpp:197
std::unique_ptr< BaseArgument > clone()&&override
See BaseArgument::clone().
Definition: ArgumentConstraint.hpp:153
ArgumentSet(const std::string &name, A &&...args)
Create a new named ArgumentSet.
std::unique_ptr< BaseArgument > clone() const &override
See BaseArgument::clone().
Definition: ArgumentConstraint.hpp:276
std::string m_usageString
Stored usage string.
Definition: ArgumentConstraint.hpp:58