*
* Example:
* ./myprog ARGUMENT
+ * ./myprog /path/to/file
+ * ./myprog "some argument"
*/
template<typename ArgumentType>
class Argument : public Parameter, public Callable<ArgumentType> {
this->func(value);
}
};
+
+ /**
+ * Template specialization of Callable behaviour class.
+ * Allows passing functions with void argument
+ */
+ template<>
+ class Callable<void> {
+ protected:
+ /**
+ * Function handling user Arguments
+ */
+ void (*func)(void);
+
+ public:
+ /**
+ * Default constructor.
+ *
+ * @param function Function that will be invoked
+ */
+ Callable(void (*function)(void))
+ : func(function) {
+ }
+ virtual ~Callable() { }
+
+ protected:
+ /**
+ * Executes command
+ */
+ void call() {
+ this->func();
+ }
+ };
}
#endif /* __COMMAND_DESCRIPTIVE_H */
*
* Example:
* ./myprog OptionName=OptionValue
+ * ./myprog -f=/some/file
+ * ./myprog --level=15
*/
template<typename OptionType>
class Option
return false;
}
};
+
+ /**
+ * Template class responsible for handling commandline options.
+ * Options are non-required, named parameters of program.
+ * This template specialization allows Options to work like switches.
+ * It means that just named parameter is needed to invoke command. No value
+ * is used.
+ *
+ * Example:
+ * ./myprog OptionName
+ * ./myprog -h
+ * ./myprog --help
+ */
+ template<>
+ class Option<void>
+ : public Parameter, public Callable<void> {
+ public:
+ typedef std::string OptionName;
+ protected:
+ /**
+ * Current Option name
+ */
+ OptionName name;
+
+ /** Variable indicating if current Option was already used or not */
+ bool used = false;
+
+ public:
+ /**
+ * Default constructor.
+ *
+ * @param name Name of the current Option
+ * @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))
+ : Parameter(description), Callable<void>(function), name(name) {
+ }
+
+ /**
+ *
+ */
+ virtual ~Option() { }
+
+ /**
+ *
+ */
+ virtual void handle() {
+ this->call();
+ }
+
+ /**
+ * Method used for checking if Option understands given user value.
+ * If so, current Option is flagged as used and no more checks against
+ * it will be done in future.
+ *
+ * Passed value should be in form of:
+ * OptionName
+ *
+ * @param argv command line value against which test will be made.
+ * User value should be in format: OptionName.
+ *
+ * @return If passed argv succesfully detected OptionName returns true
+ * and Option is set as used one. Otherwise returns false and can be
+ * used to check against next value.
+ */
+ virtual bool understand(const std::string & argv) {
+ if ((!used) &&
+ (argv == name)) {
+ used = true;
+ return true;
+ }
+ return false;
+ }
+ };
}
#endif /* __COMMAND_OPTION_H */
#include "argument.h"
#include "command.h"
-void some_function(bool a) {
- std::cout << "Some function " << a << std::endl;
+void argument_function(bool a) {
+ std::cout << "Argument: " << a << std::endl;
}
-void help_function(std::string a) {
- std::cout << "Some function " << a << std::endl;
+void option_function(std::string a) {
+ std::cout << "Help function " << a << std::endl;
+}
+
+void void_function(void) {
+ std::cout << "Void function " << std::endl;
}
int main(int argc, char *argv[]) {
command::Command command(argc, argv, {
// new command::Argument<std::string>("File path", [](std::string value)->void { std::cout << "Hello from lambda " << value << std::endl; }),
- new command::Argument<bool>("File path", some_function),
- new command::Option<std::string>("h", "Help", help_function)
+ new command::Argument<bool>("File path", argument_function),
+ new command::Option<std::string>("f", "Optional file", option_function),
+ new command::Option<void>("h", "Help", void_function)
});
return 0;