1 #ifndef __COMMAND_GROUPED_H
2 #define __COMMAND_GROUPED_H
9 #include "exception/missingRequiredParameter.h"
13 * Grouped Parameters decorator. Allows Parameters to understand be grouped
17 * - ./myprog [ARGUMENT OPTION] [ARGUMENT OPTION] ...
19 class Grouped : public Parameter {
22 * Parameters which will be treated as grouped together
24 std::vector<Parameter *> parameters;
26 std::vector<std::string> values;
28 std::vector<bool> understood;
29 std::vector<bool> all_used;
33 * Default constructor.
35 * @param params Parameters which will be treated as grouped together
37 Grouped(std::initializer_list<Parameter *> params, std::string description = "Grouped")
38 : Parameter(description), parameters(params) {
39 for (unsigned int i = 0; i < parameters.size(); i++) {
40 understood.push_back(false);
46 * Default destructor. Releases allocated memory
53 * Wrapper method around passed Parameter::handle().
57 virtual void handle() {
58 // std::cout << this->describe() << " handles" << "\n";
60 for (unsigned int i = 0; i < parameters.size(); i++) {
61 Parameter *param = parameters[i];
62 if (understood[i] || param->hungryForValue()) {
63 // std::cout << param->describe() << "=" << values[i] << "\n";
68 // @TODO: Nested required
69 for(Parameter *param : parameters) {
70 if (param->isRequired() && !param->isUsed()) {
71 throw MissingRequiredParameter(param->describe() + " is required");
77 * Wrapper method around passed Parameter::understand()
79 * @param argv command line value against which test will be made
83 virtual bool understand(const std::string & value) {
84 // std::cout << "[+] Grouped [" << this->describe() << "]\n";
86 bool _understand = false;
88 // std::cout << "GMD\n" ;
89 for (unsigned int i = 0; i < parameters.size(); i++) {
90 Parameter *param = parameters[i];
92 // std::cout << " > Grouped:Param [" << param->describe() << ", " << value << "]\n";
94 _understand = param->understand(value);
96 // std::cout << " > Understood [" << param->describe() << ", " << value << "]\n";
97 understood[i] = _understand;
104 bool all_understood = (understood.size() == parameters.size());
105 for (bool u : understood) {
109 // std::cout << this->describe() << " understand: " << std::boolalpha << all_understood << "\n";
111 return all_understood;
115 * Indicates if current Parameter has been already used
117 * @return true if current Parameter has been already used. False otherwise.
119 // virtual bool isUsed() {
122 // for(Parameter *param : parameters) {
131 virtual bool hungryForValue() {
136 * Wrapper method around passed Parameter::valuePosition().
140 virtual unsigned int valuePosition(const std::string &) {
141 throw std::logic_error("Group does not have value part");
145 * Releases acquired memory
147 void releaseMemory() {
148 for (Parameter * parameter : parameters) {
149 if (parameter != NULL) {
154 parameters.shrink_to_fit();
159 #endif /* __COMMAND_GROUPED_H */