/*!
* @class ArgParseArgument
*
* @implements AssignableConcept
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Information for a specific command line argument.
*
* @signature class ArgParseArgument
*
* @fn ArgParseArgument::ArgParseArgument
*
* @brief Constructor
*
* @signature ArgParseArgument::ArgParseArgument(argumentType[, argumentLabel[,
* isListArgument[, numberOfArgument]]]);
*
* @param[in] argumentType Type of the argument
* (<tt>ArgParseArgument::ArgumentType</tt>).
* @param[in] argumentLabel Label for the argument (<tt>char const *</tt>).
* @param[in] isListArgument Whether or not this argument can be given multiple
* times (<tt>bool</tt>).
* @param[in] numberOfArguments Number of times the argument must be given. E.g.
* set to 2 for the parser to always expect two
* values (<tt>int</tt>, default is 1).
*
* @fn ArgParseArgument#isListArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument can be given more than one time.
*
* @signature bool isListArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it can be given multiple times, <tt>false</tt>
* otherwise.
*
* @fn ArgParseArgument#isBooleanArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is a bool.
*
* @signature bool isBooleanArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is a bool, <tt>false</tt> otherwise.
*
* @fn ArgParseArgument#isStringArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is a string.
*
* @signature bool isStringArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is a string, <tt>false</tt> otherwise.
*
* @fn ArgParseArgument#isIntegerArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is an integer.
*
* @signature bool isIntegerArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is an integer, <tt>false</tt> otherwise.
*
* @fn ArgParseArgument#isInt64Argument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is a 64 bit integer.
*
* @signature bool isInt64Argument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is a 64 bit integer, <tt>false</tt>
* otherwise.
*
* @fn ArgParseArgument#isDoubleArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is a double integer.
*
* @signature bool isDoubleArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is a double argument, <tt>false</tt>
* otherwise.
*
* @fn ArgParseArgument#isInputFileArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is a input file.
*
* @signature bool isInputFileArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is a input file argument, <tt>false</tt>
* otherwise.
*
* @fn ArgParseArgument#isOutputFileArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is a output file.
*
* @signature bool isOutputFileArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is a output file argument, <tt>false</tt>
* otherwise.
*
* @fn ArgParseArgument#isOutputPrefixArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is an output prefix.
*
* @signature bool isOutputPrefixArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is an output prefix argument, <tt>false</tt>
* otherwise.
*
* @fn ArgParseArgument#isInputPrefixArgument
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument is an input prefix argument.
*
* @signature bool isInputPrefixArgument(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if it is an input prefix argument, <tt>false</tt>
* otherwise.
*
* @fn ArgParseArgument#getArgumentType
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Return the <tt>ArgParseArgument::ArgumentType</tt>.
*
* @signature std::string getArgumentType(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return ArgumentType The argument type.
*
* @fn ArgParseArgument#getArgumentTypeAsString
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Return argument type As a string.
*
* @signature std::string getArgumentTypeAsString(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return std::string The argument type as a STL string.
*
* @fn ArgParseArgument#getArgumentLabel
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Return argument label.
*
* @signature std::string getArgumentLabel(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return std::string The argument label as a STL string.
*
* @fn ArgParseArgument#setMinValue
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Set smallest allowed value for the argument.
*
* @signature void setMinValue(arg, minValue);
*
* @param[in,out] arg The ArgParseArgument to set the smallest value of.
* @param[in] minValue The smallest value to set (<tt>std::string</tt>).
*
* @fn ArgParseArgument#setMaxValue
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Set smallest allowed value for the argument.
*
* @signature void setMaxValue(arg, maxValue);
*
* @param[in,out] arg The ArgParseArgument to set the smallest value of.
* @param[in] maxValue The largest value to set (<tt>std::string</tt>).
*
* @fn ArgParseArgument#setValidValues
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Set list of valid values.
*
* @signature void setValidValues(arg, values);
*
* @param[in,out] arg The ArgParseArgument to set the valid values for.
* @param[in] values Either a <tt>std::string</tt> containing all valid entries,
* separated by spaces or a
* <tt>std::vector<std::string></tt> with the valid
* entries.
*
* If the argument is of type string then the list of valid values is the case-
* sensitive list of string values allowed for this argument. If it is an input
* or output file then the list of valid values is a list of case-insentive file
* extensions identifying the allowed types.
*
* @section Examples
*
* An example of setting allowed values for a string option.
*
* @code{.cpp}
* seqan::ArgParseArgument stringArg(seqan::ArgParseArgument::STRING);
* setValidValues(stringArg, "one two three"); // one of {"one", "two", "three"}
*
* std::vector<std::string> values;
* values.push_back("four");
* values.push_back("five");
* setValidValues(stringArg, values); // one of {"four", "five"}
* @endcode
*
*
* An example for an input file option. Note that by changing
* <tt>INPUT_FILE</tt> to <tt>OUTPUT_FILE</tt> below, the example would be the
* same for output files.
*
* @code{.cpp}
* seqan::ArgParseArgument fileArg(seqan::ArgParseArgument::INPUT_FILE);
* setValidValues(fileArg, "fq fastq"); // file must end in ".fq" or ".fastq"
*
* std::vector<std::string> values;
* values.push_back("sam");
* values.push_back("bam");
* setValidValues(fileArg, values); // file must end in ".sam" or ".bam"
* @endcode
*
*
* @fn ArgParseArgument#setHelpText
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Set the help text for an ArgParseArgument.
*
* @signature void setHelpText(arg, text);
*
* @param[in,out] arg The ArgParseArgument to set the help text for.
* @param[in] text The text to display as the description of the argument
* (<tt>std::string</tt>).
*
* @fn ArgParseArgument#getArgumentValue
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Return the value of the argument.
*
* @signature std::string getArgumentValue(arg[, argNo]);
*
* @param[in,out] arg The ArgParseArgument to query.
* @param[in] argNo In case that the ArgParseArgument allowed multiple values,
* give the index of the argument that you want to retrieve
* (<tt>unsigned</tt>, starts at 0).
*
* @return std::string Const-reference to the argument value.
*
* @fn ArgParseArgument#getArgumentValues
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Return all values of the argument.
*
* @signature std::vector<std::string> getArgumentValue(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return std::vector<std::string> Const-reference to the argument values.
*
* @fn ArgParseArgument#hasArgumentValue
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Return whether a value is available.
*
* @signature bool hasValue(arg[, pos]);
*
* @param[in] arg The ArgParseArgument to query.
* @param[in] pos The position of the argument in case of being a list
* (<tt>unsigned</tt>, 0-based, default is 0).
*
* @return bool <tt>true</tt> if <tt>pos</tt> is less than the size and the
* argument is non-empty.
*
* @fn ArgParseArgument#isSet
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns true if a value was assigned to the argument.
*
* @signature bool isSet(arg):
*
* @param[in] arg The ArgParseArgument to query.
*
* @return bool <tt>true</tt> if a value was assigned, <tt>false</tt> otherwise.
*
* @fn ArgParseArgument#hasDefault
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns whether the argument has a default value.
*
* @signature bool hasDefault(arg);
*
* @param[in] arg The argument to query.
*
* @return bool <tt>true</tt> if the argument has a default value and
* <tt>false</tt> if not.
*
* @fn ArgParseArgument#numberOfAllowedValues
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns the number of allowed values for this ArgParseArgument.
*
* @signature unsigned numberOfAllowedValues(arg);
*
* @param[in] arg The ArgParseArgument to query.
*
* @return unsigned The number of allowed values.
*
* @fn ArgParseArgument#getFileExtension
*
* @headerfile <seqan/arg_parse.h>
*
* @brief Returns the file extension for the given file argument.
*
* @signature std::string getFileExtension(arg[, pos]);
*
* @param[in] arg The ArgParseArgument to query.
* @param[in] pos The position of the value to retrieve if multiple values
* (<tt>unsigned</tt>).
*
* @return std::string The file extension, empty if no extension or not set.
*
* Only valid when argument is an INPUT_FILE or OUTPUT_FILE.
*
* Halts the program if not an input or output file argument.
*
* Can be overridden with special hidden options. For arguments, you can pass
* <tt>--arg-<num>-file-ext</tt> for argument <tt>num</tt>. For
* parameters, you can pass <tt>--<param-name>-file-ext</tt> for the
* option named <tt>param-name</tt>.
*/