You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
12 KiB
255 lines
12 KiB
#ifndef STORM_SETTINGS_ARGUMENTVALIDATORS_H_
|
|
#define STORM_SETTINGS_ARGUMENTVALIDATORS_H_
|
|
|
|
#include <iostream>
|
|
#include <ostream>
|
|
#include <fstream>
|
|
#include <list>
|
|
#include <utility>
|
|
#include <functional>
|
|
#include <vector>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "src/settings/Argument.h"
|
|
#include "src/utility/macros.h"
|
|
#include "src/exceptions/InvalidArgumentException.h"
|
|
#include "src/exceptions/IllegalArgumentException.h"
|
|
#include "src/exceptions/IllegalArgumentValueException.h"
|
|
#include "src/exceptions/IllegalFunctionCallException.h"
|
|
|
|
#include <sys/stat.h>
|
|
|
|
namespace storm {
|
|
namespace settings {
|
|
class ArgumentValidators {
|
|
public:
|
|
/*!
|
|
* Creates a validation function that checks whether an integer is in the given range (including the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (int_fast64_t const&)> integerRangeValidatorIncluding(int_fast64_t lowerBound, int_fast64_t upperBound) {
|
|
return rangeValidatorIncluding<int_fast64_t>(lowerBound, upperBound);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether an integer is in the given range (excluding the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (int_fast64_t const&)> integerRangeValidatorExcluding(int_fast64_t lowerBound, int_fast64_t upperBound) {
|
|
return rangeValidatorExcluding<int_fast64_t>(lowerBound, upperBound);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether an integer is greater than or equal to the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (int_fast64_t const&)> integerGreaterValidatorIncluding(int_fast64_t threshold) {
|
|
return greaterValidatorIncluding<int_fast64_t>(threshold);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether an integer is greater than the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (int_fast64_t const&)> integerGreaterValidatorExcluding(int_fast64_t threshold) {
|
|
return greaterValidatorExcluding<int_fast64_t>(threshold);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether an unsigned integer is in the given range (including the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (uint_fast64_t const&)> unsignedIntegerRangeValidatorIncluding(uint_fast64_t lowerBound, uint_fast64_t upperBound) {
|
|
return rangeValidatorIncluding<uint_fast64_t>(lowerBound, upperBound);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether an unsigned integer is in the given range (excluding the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (uint_fast64_t const&)> unsignedIntegerRangeValidatorExcluding(uint_fast64_t lowerBound, uint_fast64_t upperBound) {
|
|
return rangeValidatorExcluding<uint_fast64_t>(lowerBound, upperBound);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether an unsigned integer is greater than or equal to the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (uint_fast64_t const&)> unsignedIntegerGreaterValidatorIncluding(uint_fast64_t threshold) {
|
|
return greaterValidatorIncluding<uint_fast64_t>(threshold);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether an unsigned integer is greater than the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (uint_fast64_t const&)> unsignedIntegerGreaterValidatorExcluding(uint_fast64_t threshold) {
|
|
return greaterValidatorExcluding<uint_fast64_t>(threshold);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether a double is in the given range (including the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (double const&)> doubleRangeValidatorIncluding(double lowerBound, double upperBound) {
|
|
return rangeValidatorIncluding<double>(lowerBound, upperBound);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether a double is in the given range (excluding the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (double const&)> doubleRangeValidatorExcluding(double lowerBound, double upperBound) {
|
|
return rangeValidatorExcluding<double>(lowerBound, upperBound);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether a double is greater than or equal to the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (double const&)> doubleGreaterValidatorIncluding(double threshold) {
|
|
return greaterValidatorIncluding<double>(threshold);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether a double is greater than the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (double const&)> doubleGreaterValidatorExcluding(double threshold) {
|
|
return greaterValidatorExcluding<double>(threshold);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether a given string corresponds to an existing and readable
|
|
* file.
|
|
*
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (std::string const&)> existingReadableFileValidator() {
|
|
return [] (std::string const fileName) -> bool {
|
|
// First check existence as ifstream::good apparently als returns true for directories.
|
|
struct stat info;
|
|
stat(fileName.c_str(), &info);
|
|
STORM_LOG_THROW(info.st_mode & S_IFREG, storm::exceptions::IllegalArgumentValueException, "Unable to read from non-existing file '" << fileName << "'.");
|
|
|
|
// Now that we know it's a file, we can check its readability.
|
|
std::ifstream istream(fileName);
|
|
STORM_LOG_THROW(istream.good(), storm::exceptions::IllegalArgumentValueException, "Unable to read from file '" << fileName << "'.");
|
|
|
|
return true;
|
|
};
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether a given string is in a provided list of strings.
|
|
*
|
|
* @param list The list of valid strings.
|
|
* @return The resulting validation function.
|
|
*/
|
|
static std::function<bool (std::string const&)> stringInListValidator(std::vector<std::string> const& list) {
|
|
return [list] (std::string const& inputString) -> bool {
|
|
for (auto const& validString : list) {
|
|
if (inputString == validString) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentValueException, "Value '" << inputString << "' does not match any entry in the list of valid items.");
|
|
return false;
|
|
};
|
|
}
|
|
|
|
private:
|
|
/*!
|
|
* Creates a validation function that checks whether its argument is in a given range (including the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
template<typename T>
|
|
static std::function<bool (T const&)> rangeValidatorIncluding(T lowerBound, T upperBound) {
|
|
return std::bind([](T lowerBound, T upperBound, T value) -> bool {
|
|
STORM_LOG_THROW(lowerBound <= value && value <= upperBound, storm::exceptions::InvalidArgumentException, "Value " << value << " is out of range.");
|
|
return true;
|
|
}, lowerBound, upperBound, std::placeholders::_1);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether its argument is in a given range (excluding the bounds).
|
|
*
|
|
* @param lowerBound The lower bound of the valid range.
|
|
* @param upperBound The upper bound of the valid range.
|
|
* @return The resulting validation function.
|
|
*/
|
|
template<typename T>
|
|
static std::function<bool (T const&)> rangeValidatorExcluding(T lowerBound, T upperBound) {
|
|
return std::bind([](T lowerBound, T upperBound, T value) -> bool {
|
|
STORM_LOG_THROW(lowerBound < value && value < upperBound, storm::exceptions::InvalidArgumentException, "Value " << value << " is out of range.");
|
|
return true;
|
|
}, lowerBound, upperBound, std::placeholders::_1);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether its argument is greater than the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
template<typename T>
|
|
static std::function<bool (T const&)> greaterValidatorExcluding(T threshold) {
|
|
return std::bind([](T threshold, T value) -> bool {
|
|
STORM_LOG_THROW(threshold < value, storm::exceptions::InvalidArgumentException, "Value " << value << " is out of range.");
|
|
return true;
|
|
}, threshold, std::placeholders::_1);
|
|
}
|
|
|
|
/*!
|
|
* Creates a validation function that checks whether its argument is greater than or equal to the given threshold.
|
|
*
|
|
* @param threshold The threshold.
|
|
* @return The resulting validation function.
|
|
*/
|
|
template<typename T>
|
|
static std::function<bool (T const&)> greaterValidatorIncluding(T threshold) {
|
|
return std::bind([](T threshold, T value) -> bool {
|
|
STORM_LOG_THROW(threshold <= value, storm::exceptions::InvalidArgumentException, "Value " << value << " is out of range.");
|
|
return true;
|
|
}, threshold, std::placeholders::_1);
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
#endif // STORM_SETTINGS_ARGUMENTVALIDATORS_H_
|