--- trunk/src/io/ParamConstraint.hpp 2005/10/14 16:43:02 671 +++ trunk/src/io/ParamConstraint.hpp 2005/10/14 21:43:13 672 @@ -39,208 +39,329 @@ * such damages. */ -#ifndef IO_PARAMCONSTRAINT_HPP -#define IO_PARAMCONSTRAINT_HPP - -/** - * This class allows to recognize constraint predicates, so that they can be combined using - * composition operators. Every constraint predicate must be derived from this class - */ -template -struct ParamConstraintFacade { -}; - - -struct NonConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const { - return true; - } -}; - -struct NotEmptyConstraint : public ParamConstraintFacade{ - bool operator()( const std::string data ) const { - return !data.empty(); - } -}; - -struct ZeroConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const - { - return data == 0; - } -}; - -struct NotZeroConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const - { - return data != 0; - } -}; - -struct PositiveConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const - { - return data > 0; - } -}; - -struct NotPositiveConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const - { - return data <= 0; - } -}; -struct NotNegativeConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const - { - return data >= 0; - } -}; - -struct NegativeConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const - { - return data < 0; - } -}; - -struct NotNegativeConstraint : public ParamConstraintFacade{ - template - bool operator()( DataType data ) const - { - return true; - } -}; - -template -struct LessThanConstraint : public ParamConstraintFacade { - - LessThanConstraint(T rhs) : rhs_(rhs){} - template - bool operator()( DataType data ) const { - return data < rhs_; - } - private: - T rhs_; -}; - -template -struct LessEqualConstraint : public ParamConstraintFacade { - - LessEqualConstraint(T rhs) : rhs_(rhs){} - template - bool operator()( DataType data ) const { - return data <= rhs_; - } - private: - T rhs_; -}; - -template -struct EqualConstraint : public ParamConstraintFacade { - - EqualConstraint(T rhs) : rhs_(rhs){} - template - bool operator()( DataType data ) const { - return data == rhs_; - } - private: - T rhs_; -}; - -// class_and composition predicate -template -struct AndParamConstraint: - public ParamConstraintFacade< AndParamConstraint > { -public: - - AndParamConstraint( Cons1T cons1, Cons2T cons2 ) : - cons1_(cons1, cons2_(cons2) {} - - template - bool operator()( DataType data ) const { - return cons1_(data) && cons2_(data); - } - -private: - Cons1T cons1_; - Cons2T cons2_; -}; - - - -template -struct OrParamConstraint: - public ParamConstraintFacade< OrParamConstraint > { -public: - - - OrParamConstraint( Cons1T cons1, Cons2T cons2 ) : - cons1_(cons1, cons2_(cons2) {} - - template - bool operator()( DataType data ) const { - return cons1_(data) || cons2_(data); - } - -private: - Cons1T cons1_; - Cons2T cons2_; -}; - -template -struct NotParamConstraint: - public ParamConstraintFacade< NotParamConstraint > -{ -public: - - - NotParamConstraint( ConsT cons) : - cons_(cons) {} - - template - bool operator()( DataType data ) const { - return !cons_(data); - } - -private: - ConsT cons_; -}; +#ifndef IO_PARAMCONSTRAINT_HPP +#define IO_PARAMCONSTRAINT_HPP +#include - -template -inline AndParamConstraint -operator &&(const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { - - return AndParamConstraint( - *static_cast(&cons1), - *static_cast(&cons2) ); -} - -template -inline OrParamConstraint -operator ||( const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { - - return OrParamConstraint( - *static_cast(&cons1), - *static_cast(&cons2) ); -} - - -template -inline NotParamConstraint -operator !( const ParamConstraintFacade& cons ) { - - return NotParamConstraint(*static_cast(&cons)); -} - - - -#endif +/** + * This class allows to recognize constraint predicates, so that they can be combined using + * composition operators. Every constraint predicate must be derived from this class + */ +template +struct ParamConstraintFacade { + std::string getConstraintDescription() {return description_;} + protected: + std::string description_; +}; + +struct NotEmptyConstraint : public ParamConstraintFacade{ + + NotEmptyConstraint() { description_= "nonempty";} + bool operator()( const std::string data ) const { + return !data.empty(); + } +}; + +struct ZeroConstraint : public ParamConstraintFacade{ + + ZeroConstraint() {description_ = "zero";} + template + bool operator()( DataType data ) const { + return data == 0; + } +}; + +struct NonZeroConstraint : public ParamConstraintFacade{ + NonZeroConstraint() {description_ = "nonzero";} + + template + bool operator()( DataType data ) const { + return data != 0; + } +}; + +struct PositiveConstraint : public ParamConstraintFacade{ + PositiveConstraint() {description_ = "positive";} + template + bool operator()( DataType data ) const + { + return data > 0; + } +}; + +struct NonPositiveConstraint : public ParamConstraintFacade{ + NonPositiveConstraint() {description_ = "nonpositive";} + template + bool operator()( DataType data ) const + { + return data <= 0; + } +}; + +struct NegativeConstraint : public ParamConstraintFacade{ + NegativeConstraint() {description_ = "negative";} + template + bool operator()( DataType data ) const + { + return data < 0; + } +}; + +struct NonNegativeConstraint : public ParamConstraintFacade{ + NonNegativeConstraint() {description_ = "nonnegative";} + template + bool operator()( DataType data ) const + { + return data >= 0; + } +}; + +template +struct LessThanConstraint : public ParamConstraintFacade > { + + LessThanConstraint(T rhs) : rhs_(rhs){ + std::stringstream iss; + iss << "less than " << rhs; + description_ = iss.str(); + } + template + bool operator()( DataType data ) const { + return data < rhs_; + } + private: + T rhs_; +}; + +template +struct LessThanOrEqualToConstraint : public ParamConstraintFacade > { + + LessThanOrEqualToConstraint(T rhs) : rhs_(rhs) { + std::stringstream iss; + iss << "less than or equal to" << rhs; + description_ = iss.str(); + } + + template + bool operator()( DataType data ) const { + return data <= rhs_; + } + + private: + T rhs_; +}; + +template +struct EqualConstraint : public ParamConstraintFacade > { + + EqualConstraint(T rhs) : rhs_(rhs){ + std::stringstream iss; + iss << "equal to" << rhs; + description_ = iss.str(); + + } + template + bool operator()( DataType data ) const { + return data == rhs_; + } + private: + T rhs_; +}; + +struct EqualIgnoreCaseConstraint : public ParamConstraintFacade { + + EqualIgnoreCaseConstraint(std::string rhs) : rhs_(rhs){ + std::stringstream iss; + iss << "equal to (case insensitive) " << rhs; + description_ = iss.str(); + } + + bool operator()( std::string data ) const { + return data == rhs_; + } + + private: + std::string rhs_; +}; + +template +struct GreaterThanConstraint : public ParamConstraintFacade > { + + GreaterThanConstraint(T rhs) : rhs_(rhs){ + std::stringstream iss; + iss << "greater than" << rhs; + description_ = iss.str(); + } + template + bool operator()( DataType data ) const { + return data > rhs_; + } + private: + T rhs_; +}; + +template +struct GreaterThanOrEqualTo : public ParamConstraintFacade > { + + GreaterThanOrEqualTo(T rhs) : rhs_(rhs){ + std::stringstream iss; + iss << "greater than or equal to" << rhs; + description_ = iss.str(); + } + template + bool operator()( DataType data ) const { + return data >= rhs_; + } + private: + T rhs_; +}; + +// class_and composition predicate +template +struct AndParamConstraint: public ParamConstraintFacade< AndParamConstraint > { +public: + + AndParamConstraint( Cons1T cons1, Cons2T cons2 ) : cons1_(cons1), cons2_(cons2) { + std::stringstream iss; + iss << "(" << cons1_.getConstraintDescription() << " and " << cons2_.getConstraintDescription() << ")"; + description_ = iss.str(); + } + + template + bool operator()( DataType data ) const { + return cons1_(data) && cons2_(data); + } + +private: + Cons1T cons1_; + Cons2T cons2_; +}; + + + +template +struct OrParamConstraint: public ParamConstraintFacade< OrParamConstraint > { +public: + + + OrParamConstraint( Cons1T cons1, Cons2T cons2 ) : cons1_(cons1), cons2_(cons2) { + std::stringstream iss; + iss << cons1_.getConstraintDescription() << " or " << cons2_.getConstraintDescription() << ""; + description_ = iss.str(); + } + + template + bool operator()( DataType data ) const { + return cons1_(data) || cons2_(data); + } + +private: + Cons1T cons1_; + Cons2T cons2_; +}; + +template +struct NotParamConstraint: public ParamConstraintFacade< NotParamConstraint > { +public: + + + NotParamConstraint( ConsT cons) : cons_(cons) { + std::stringstream iss; + iss << "(not" << cons1_.getConstraintDescription() << ")"; + description_ = iss.str(); + } + + template + bool operator()( DataType data ) const { + return !cons_(data); + } + +private: + ConsT cons_; +}; + + +template +inline AndParamConstraint +operator &&(const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { + + return AndParamConstraint( + *static_cast(&cons1), + *static_cast(&cons2) ); +} + +template +inline OrParamConstraint +operator ||( const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { + + return OrParamConstraint( + *static_cast(&cons1), + *static_cast(&cons2) ); +} + + +template +inline NotParamConstraint +operator !( const ParamConstraintFacade& cons ) { + + return NotParamConstraint(*static_cast(&cons)); +} + + +NotEmptyConstraint isNotEmpty() { + return NotEmptyConstraint(); +} + +ZeroConstraint isZero() { + return ZeroConstraint(); +} + +ParamConstraintFacade isNonZero() { + return ParamConstraintFacade(); +} + +PositiveConstraint isPositive() { + return PositiveConstraint(); +} + +NonPositiveConstraint isNonPositive() { + return NonPositiveConstraint(); +} + +NegativeConstraint isNegative() { + return NegativeConstraint(); +} + +NonNegativeConstraint isNonNegative() { + return NonNegativeConstraint(); +} + +template +LessThanConstraintisLessThan(T& v ) { + return LessThanConstraint(v); +} + +template +LessThanOrEqualToConstraint isLessThanOrEqualTo(T& v ) { + return ParamConstraintFacade >(v); +} + +template +EqualConstraint isEqual(T& v ) { + return EqualConstraint(v); +} + +template +GreaterThanConstraint isGreaterThan(T& v ) { + return GreaterThanConstraint(v); +} + +template +GreaterThanOrEqualTo isGreaterThanOrEqualTo(T& v ) { + return GreaterThanOrEqualTo(v); +} + +EqualIgnoreCaseConstraint isEqualIgnoreCase(std::string str) { + return EqualIgnoreCaseConstraint(str); +} + +#endif