#include <string>
#include <vector>
-#include <iostream>
#include "parameter.h"
Command(unsigned int argc, char *argv[], std::initializer_list<Parameter *> params)
: parameters(params) {
- matchArguments(argc, argv);
+ try {
+ matchArguments(argc, argv);
+ }
+ catch(std::invalid_argument exception) {
+ releaseMemory();
+ throw;
+ }
}
/**
* Destructor. Releases allocated memory.
*/
~Command() {
- for (Parameter * parameter : parameters) {
- delete parameter;
- }
+ releaseMemory();
}
protected:
/**
}
}
}
+
+ /**
+ * Releases acquired memory
+ */
+ void releaseMemory() {
+ for (Parameter * parameter : parameters) {
+ if (parameter != NULL) {
+ delete parameter;
+ }
+ }
+ parameters.clear();
+ parameters.shrink_to_fit();
+ }
};
}
* Descriptive behaviour class.
*/
class Descriptive {
- std::string description;
+ const std::string description;
public:
/**
* Default constructor.
: description(description) {
}
+ virtual ~Descriptive() { }
+
/**
* Returns description of the current class.
*
* @return provided description for the class
*/
- std::string describe() {
+ const std::string & describe() {
return description;
}
};
/**
* Current Option name
*/
- OptionName name;
+ const OptionName name;
/**
* Current Option value
* @param description Description of current Option
* @param function Function used to handle current Option.
*/
- Option(std::string name, const std::string & description, void (*function)(OptionType))
+ Option(const std::string & name, const std::string & description, void (*function)(OptionType))
: Parameter(description), Callable<OptionType>(function), name(name) {
}
* @throw std::invalid_argument when OptionValue part failed conversion
* to OptionType
*/
- virtual bool understand(const std::string & argv) {
- if ((!used) &&
- (argv.find(name) == 0)) {
+ virtual bool understand(const std::string & argv)
+ throw(std::invalid_argument) {
+
+ if ((!used) && (argv.find(name) == 0)) {
std::size_t pos = argv.find("=");
+
if (pos != name.size()) {
throw std::invalid_argument("Option: " + name + " requires value but no one has been provided");
}
std::stringstream ss;
-
ss << argv.substr(pos + 1);
- ss >> value;
+ ss >> value;// memory leak? when is uncommented, and exception is
+ // thrown, valgrind shows e.g.:
+ // possibly lost: 380 bytes in 7 blocks
if (ss.fail()) {
throw std::invalid_argument("Value for option: " + name + " failed conversion to the required type");
/**
* Current Option name
*/
- OptionName name;
+ const OptionName name;
/** Variable indicating if current Option was already used or not */
bool used = false;
* @param description Description of current Option
* @param function Function used to handle current Option.
*/
- Option(std::string name, const std::string & description, void (*function)(void))
+ Option(const std::string & name, const std::string & description, void (*function)(void))
: Parameter(description), Callable<void>(function), name(name) {
}
- /**
- *
- */
- virtual ~Option() { }
-
/**
*
*/