/* * STLVectorValidator.hpp * * Created on: May 9, 2012 * Author: heber */ #ifndef STLVECTORVALIDATOR_HPP_ #define STLVECTORVALIDATOR_HPP_ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "DummyValidator.hpp" #include "RangeValidator.hpp" #include "Validator.hpp" #include #include "CodePatterns/Range.hpp" /** This class is a combination of \ref Validator on the number of entries in * the vector while each element is checked with a given Validator. */ template class STLVectorValidator : public Validator< T > { //!> this should throw an error at compile time if T is not a container typedef typename T::value_type value_type; public: /** Constructor for class STLVectorValidator, number of elements given by a range. * * @param validator validator for the single element * @param range range of valid number of elements */ STLVectorValidator(const range &range, const Validator &validator) : ElementwiseValidator(validator.clone()), NumberOfElementsValidator(new RangeValidator(range)) {} /** Constructor for class STLVectorValidator, number of elements given by a range. * * @param range range of valid number of elements */ STLVectorValidator(const range &range) : ElementwiseValidator(new DummyValidator()), NumberOfElementsValidator(new RangeValidator(range)) {} /** Constructor for class STLVectorValidator, number of elements given by interval [\a min,\a max). * * @param validator validator for the single element * @param min lower bound of interval for valid number of elements * @param max upper bound of interval for valid number of elements */ STLVectorValidator(const size_t min, const size_t max, const Validator &validator) : ElementwiseValidator(validator.clone()), NumberOfElementsValidator(new RangeValidator(min,max)) {} /** Constructor for class STLVectorValidator, number of elements given by interval [\a min,\a max). * * @param min lower bound of interval for valid number of elements * @param max upper bound of interval for valid number of elements */ STLVectorValidator(const size_t min, const size_t max) : ElementwiseValidator(new DummyValidator()), NumberOfElementsValidator(new RangeValidator(min,max)) {} /** Constructor for class STLVectorValidator, any number of elements is allowed. * * @param validator validator for the single element */ STLVectorValidator(const Validator &validator) : ElementwiseValidator(validator.clone()), NumberOfElementsValidator(new DummyValidator()) {} /** Constructor for class STLVectorValidator, any number of unrestricted elements is allowed. * */ STLVectorValidator() : ElementwiseValidator(new DummyValidator()), NumberOfElementsValidator(new DummyValidator()) {} /** Destructor for class STLVectorValidator * */ ~STLVectorValidator() { delete ElementwiseValidator; delete NumberOfElementsValidator; } bool isValid(const T & _value) const { bool status = NumberOfElementsValidator->isValid(_value.size()); for (typename std::vector::const_iterator iter = _value.begin(); iter != _value.end(); ++iter) { status = status && ElementwiseValidator->isValid(*iter); } return status; } bool operator==(const Validator &_instance) const { const STLVectorValidator *inst = dynamic_cast *>(&_instance); bool status = *NumberOfElementsValidator == *inst->NumberOfElementsValidator; status = status && *ElementwiseValidator == *inst->ElementwiseValidator; return status; } Validator* clone() const { Validator *inst = new STLVectorValidator(*NumberOfElementsValidator, *ElementwiseValidator); return inst; } Validator *getElementwiseValidator(){ return ElementwiseValidator; } Validator *getNumberOfElementsValidator(){ return NumberOfElementsValidator; } private: /** Constructor for class STLVectorValidator, number of elements given by \ref RangeValidator. * * \note Is only used in STLVectorValidator::clone() as it may lead to ambiguities * with a signature of two validators in case value_type equals size_t. * * @param validator validator for the single element * @param rangevalidator validator for the valid number of elements */ STLVectorValidator(const Validator &rangevalidator, const Validator &validator) : ElementwiseValidator(validator.clone()), NumberOfElementsValidator(dynamic_cast< Validator *>(rangevalidator.clone())) {} private: Validator *ElementwiseValidator; Validator *NumberOfElementsValidator; }; #endif /* STLVECTORVALIDATOR_HPP_ */