--- trunk/src/io/ParamConstraint.hpp 2005/10/14 14:48:10 667 +++ branches/development/src/io/ParamConstraint.hpp 2010/07/09 23:08:25 1465 @@ -6,19 +6,10 @@ * redistribute this software in source and binary code form, provided * that the following conditions are met: * - * 1. Acknowledgement of the program authors must be made in any - * publication of scientific results based in part on use of the - * program. An acceptable form of acknowledgement is citation of - * the article in which the program was described (Matthew - * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher - * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented - * Parallel Simulation Engine for Molecular Dynamics," - * J. Comput. Chem. 26, pp. 252-271 (2005)) - * - * 2. Redistributions of source code must retain the above copyright + * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - * 3. Redistributions in binary form must reproduce the above copyright + * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. @@ -37,210 +28,356 @@ * arising out of the use of or inability to use software, even if the * University of Notre Dame has been advised of the possibility of * such damages. + * + * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your + * research, please cite the appropriate papers when you publish your + * work. Good starting points are: + * + * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). + * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). + * [4] Vardeman & Gezelter, in progress (2009). */ -#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 +#include "utils/CaseConversion.hpp" +#include "utils/StringTokenizer.hpp" +namespace OpenMD { + /** + * 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_; + }; - -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 + struct NotEmptyConstraint : public ParamConstraintFacade{ + + NotEmptyConstraint() { description_= "nonempty";} + bool operator()( const std::string data ) const { + return !data.empty(); + } + }; + + struct ZeroConstraint : public ParamConstraintFacade{ + + ZeroConstraint() {this->description_ = "zero";} + template + bool operator()( DataType data ) const { + return data == 0; + } + }; + + struct NonZeroConstraint : public ParamConstraintFacade{ + NonZeroConstraint() {this->description_ = "nonzero";} + + template + bool operator()( DataType data ) const { + return data != 0; + } + }; + + struct PositiveConstraint : public ParamConstraintFacade{ + PositiveConstraint() {this->description_ = "positive";} + template + bool operator()( DataType data ) const + { + return data > 0; + } + }; + + struct NonPositiveConstraint : public ParamConstraintFacade{ + NonPositiveConstraint() {this->description_ = "nonpositive";} + template + bool operator()( DataType data ) const + { + return data <= 0; + } + }; + + struct NegativeConstraint : public ParamConstraintFacade{ + NegativeConstraint() {this->description_ = "negative";} + template + bool operator()( DataType data ) const + { + return data < 0; + } + }; + + struct NonNegativeConstraint : public ParamConstraintFacade{ + NonNegativeConstraint() {this->description_ = "nonnegative";} + template + bool operator()( DataType data ) const + { + return data >= 0; + } + }; + + + struct EvenConstraint : public ParamConstraintFacade{ + EvenConstraint() {this->description_ = "even";} + template + bool operator()( DataType data ) const + { + return data % 2 == 0; + } + }; + + template + struct LessThanConstraint : public ParamConstraintFacade > { + + LessThanConstraint(T rhs) : rhs_(rhs){ + std::stringstream iss; + iss << "less than " << rhs; + this->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; + this->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; + this->description_ = iss.str(); + + } + template + bool operator()( DataType data ) const { + return data == rhs_; + } + private: + T rhs_; + }; + + struct EqualIgnoreCaseConstraint : public ParamConstraintFacade { + + EqualIgnoreCaseConstraint(std::string rhs) : rhs_(OpenMD::toUpperCopy(rhs)){ + std::stringstream iss; + iss << "equal to (case insensitive) " << rhs; + this->description_ = iss.str(); + } + + bool operator()( std::string data ) const { + return OpenMD::toUpperCopy(data) == rhs_; + } + + private: + std::string rhs_; + }; + + struct ContainsConstraint : public ParamConstraintFacade { + ContainsConstraint(std::string rhs) : rhs_(OpenMD::toUpperCopy(rhs)){ + std::stringstream iss; + iss << "contains " << rhs; + this->description_ = iss.str(); + } + + bool operator()( std::string data ) const { + OpenMD::StringTokenizer tokenizer(OpenMD::toUpperCopy(data), " ,;|\t\n\r"); + while (tokenizer.hasMoreTokens()) { + if (tokenizer.nextToken() == rhs_) { + return true; + } + } + + return false; + } + + private: + std::string rhs_; + + }; + + template + struct GreaterThanConstraint : public ParamConstraintFacade > { + + GreaterThanConstraint(T rhs) : rhs_(rhs){ + std::stringstream iss; + iss << "greater than" << rhs; + this->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; + this->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() << ")"; + this->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() << ""; + this->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" << cons_.getConstraintDescription() << ")"; + this->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(); + ZeroConstraint isZero(); + + ParamConstraintFacade isNonZero(); + PositiveConstraint isPositive(); + NonPositiveConstraint isNonPositive(); + + NegativeConstraint isNegative(); + + NonNegativeConstraint isNonNegative(); + EvenConstraint isEven(); + + template + inline LessThanConstraintisLessThan(T& v ) { + return LessThanConstraint(v); + } + + template + inline LessThanOrEqualToConstraint isLessThanOrEqualTo(T& v ) { + return ParamConstraintFacade >(v); + } + + template + inline EqualConstraint isEqual(T& v ) { + return EqualConstraint(v); + } + + template + inline GreaterThanConstraint isGreaterThan(T& v ) { + return GreaterThanConstraint(v); + } + + template + inline GreaterThanOrEqualTo isGreaterThanOrEqualTo(T& v ) { + return GreaterThanOrEqualTo(v); + } + + EqualIgnoreCaseConstraint isEqualIgnoreCase(std::string str); +} +#endif