#include <string>
#include <sstream>
#include <iostream>
+#include <functional>
#include "parameter.h"
#include "callable.h"
namespace command {
/**
* Class responsible for handling commandline arguments.
- * Arguments are required, non-named parameters of program.
- * Accepts
+ * Arguments are non-named parameters of program.
*
* Example:
- * ./myprog ARGUMENT
+ * - ./myprog ARGUMENT
+ * - ./myprog /path/to/file
+ * - ./myprog "some argument"
*/
- template<typename ArgumentType>
- class Argument : public Parameter, public Callable<ArgumentType> {
+ template<typename ParameterType>
+ class Argument : public Parameter, public Callable<ParameterType> {
protected:
- /** Variable indicating if current Argument was already used or not */
- bool used = false;
-
- ArgumentType argument;
+ ParameterType value;
public:
typedef class Argument Type;
* @param description Description of current Argument
* @param function Function used to handle current Argument.
*/
- Argument(const std::string & description, void (*function)(ArgumentType))
- : Parameter(description), Callable<ArgumentType>(function) {
+ Argument(const std::string & description, void (*function)(ParameterType))
+ : Parameter(description), Callable<ParameterType>(function) {
+ }
+
+ Argument(const std::string & description, std::function<void(ParameterType)> function)
+ : Parameter(description), Callable<ParameterType>(function) {
}
/**
virtual ~Argument() { }
/**
- *
+ * \inheritdoc
*/
virtual void handle() {
- this->call(argument);
+ this->call(value);
+ this->used = true;
}
/**
* If so current Argument is flagged as used and no more checks against
* it will be done in future.
*
- * \attention If conversion from passed value to ArgumentType is
+ * \attention If conversion from passed value to ParameterType is
* impossible, it is ignored. It means that it is not understanded by
* Argument.
*
* @param argv command line value against which test will be made.
*
- * @return If passed argv is succesfully converted to ArgumentType,
+ * @return If passed argv is succesfully converted to ParameterType,
* returns true and Argument is set as used one. If there was an error
* during conversion, method returns false and can be used to check
* against next value.
*/
virtual bool understand(const std::string & argv) {
- if (!used) {
- std::stringstream ss;
+ std::stringstream ss;
- ss << argv;
- ss >> argument;
+ ss << std::fixed << argv;
+ ss >> value;
- if (!ss.fail()) {
- used = true;
- return true;
- }
+ if (!ss.fail()) {
+ return true;
}
return false;
}
+
+ /**
+ * \inheritdoc
+ */
+ virtual unsigned int valuePosition(const std::string & ) {
+ return 0;
+ }
};
}