--- trunk/src/io/ParamConstraint.hpp 2005/10/17 19:24:02 678 +++ branches/development/src/io/ParamConstraint.hpp 2013/05/15 15:09:35 1874 @@ -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,6 +28,16 @@ * 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, 234107 (2008). + * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). + * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ #ifndef IO_PARAMCONSTRAINT_HPP @@ -44,348 +45,340 @@ #include #include "utils/CaseConversion.hpp" #include "utils/StringTokenizer.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 { +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_; -}; + protected: + std::string description_; + }; -struct NotEmptyConstraint : public ParamConstraintFacade{ - + struct NotEmptyConstraint : public ParamConstraintFacade{ + NotEmptyConstraint() { description_= "nonempty";} - bool operator()( const std::string data ) const { - return !data.empty(); + bool operator()( const std::string &data ) const { + return !data.empty(); } -}; + }; -struct ZeroConstraint : public ParamConstraintFacade{ + struct ZeroConstraint : public ParamConstraintFacade{ ZeroConstraint() {this->description_ = "zero";} template bool operator()( DataType data ) const { - return data == 0; + return data == 0; } -}; + }; -struct NonZeroConstraint : public ParamConstraintFacade{ + struct NonZeroConstraint : public ParamConstraintFacade{ NonZeroConstraint() {this->description_ = "nonzero";} template bool operator()( DataType data ) const { - return data != 0; + return data != 0; } -}; + }; -struct PositiveConstraint : public ParamConstraintFacade{ + struct PositiveConstraint : public ParamConstraintFacade{ PositiveConstraint() {this->description_ = "positive";} template bool operator()( DataType data ) const { - return data > 0; + return data > 0; } -}; + }; -struct NonPositiveConstraint : public ParamConstraintFacade{ + struct NonPositiveConstraint : public ParamConstraintFacade{ NonPositiveConstraint() {this->description_ = "nonpositive";} template bool operator()( DataType data ) const { - return data <= 0; + return data <= 0; } -}; + }; -struct NegativeConstraint : public ParamConstraintFacade{ + struct NegativeConstraint : public ParamConstraintFacade{ NegativeConstraint() {this->description_ = "negative";} template bool operator()( DataType data ) const { - return data < 0; + return data < 0; } -}; + }; -struct NonNegativeConstraint : public ParamConstraintFacade{ + struct NonNegativeConstraint : public ParamConstraintFacade{ NonNegativeConstraint() {this->description_ = "nonnegative";} template bool operator()( DataType data ) const { - return data >= 0; + return data >= 0; } -}; + }; -template -struct LessThanConstraint : public ParamConstraintFacade > { + + 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(); + std::stringstream iss; + iss << "less than " << rhs; + this->description_ = iss.str(); } template bool operator()( DataType data ) const { - return data < rhs_; + return data < rhs_; } - private: - T rhs_; -}; + private: + T rhs_; + }; -template -struct LessThanOrEqualToConstraint : public ParamConstraintFacade > { + template + struct LessThanOrEqualToConstraint : public ParamConstraintFacade > { LessThanOrEqualToConstraint(T rhs) : rhs_(rhs) { - std::stringstream iss; - iss << "less than or equal to" << rhs; - this->description_ = iss.str(); + std::stringstream iss; + iss << "less than or equal to" << rhs; + this->description_ = iss.str(); } template bool operator()( DataType data ) const { - return data <= rhs_; + return data <= rhs_; } - private: - T rhs_; -}; + private: + T rhs_; + }; -template -struct EqualConstraint : public ParamConstraintFacade > { + template + struct EqualConstraint : public ParamConstraintFacade > { EqualConstraint(T rhs) : rhs_(rhs){ - std::stringstream iss; - iss << "equal to" << rhs; - this->description_ = iss.str(); + std::stringstream iss; + iss << "equal to" << rhs; + this->description_ = iss.str(); } template bool operator()( DataType data ) const { - return data == rhs_; + return data == rhs_; } - private: - T rhs_; -}; + private: + T rhs_; + }; -struct EqualIgnoreCaseConstraint : public ParamConstraintFacade { + struct EqualIgnoreCaseConstraint : public ParamConstraintFacade { - EqualIgnoreCaseConstraint(std::string rhs) : rhs_(oopse::toUpperCopy(rhs)){ - std::stringstream iss; - iss << "equal to (case insensitive) " << rhs; - this->description_ = iss.str(); + 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 oopse::toUpperCopy(data) == rhs_; + return OpenMD::toUpperCopy(data) == rhs_; } - private: - std::string rhs_; -}; + private: + std::string rhs_; + }; -struct ContainsConstraint : public ParamConstraintFacade { - ContainsConstraint(std::string rhs) : rhs_(oopse::toUpperCopy(rhs)){ - std::stringstream iss; - iss << "contains " << rhs; - this->description_ = iss.str(); + 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 { - oopse::StringTokenizer tokenizer(oopse::toUpperCopy(data), " ,;|\t\n\r"); - while (tokenizer.hasMoreTokens()) { - if (tokenizer.nextToken() == rhs_) { - return true; - } + OpenMD::StringTokenizer tokenizer(OpenMD::toUpperCopy(data), " ,;|\t\n\r"); + while (tokenizer.hasMoreTokens()) { + if (tokenizer.nextToken() == rhs_) { + return true; } + } - return false; + return false; } - private: - std::string rhs_; + private: + std::string rhs_; -}; + }; -template -struct GreaterThanConstraint : public ParamConstraintFacade > { + template + struct GreaterThanConstraint : public ParamConstraintFacade > { GreaterThanConstraint(T rhs) : rhs_(rhs){ - std::stringstream iss; - iss << "greater than" << rhs; - this->description_ = iss.str(); + std::stringstream iss; + iss << "greater than" << rhs; + this->description_ = iss.str(); } template bool operator()( DataType data ) const { - return data > rhs_; + return data > rhs_; } - private: - T rhs_; -}; + private: + T rhs_; + }; -template -struct GreaterThanOrEqualTo : public ParamConstraintFacade > { + template + struct GreaterThanOrEqualTo : public ParamConstraintFacade > { GreaterThanOrEqualTo(T rhs) : rhs_(rhs){ - std::stringstream iss; - iss << "greater than or equal to" << rhs; - this->description_ = iss.str(); + std::stringstream iss; + iss << "greater than or equal to" << rhs; + this->description_ = iss.str(); } template bool operator()( DataType data ) const { - return data >= rhs_; + return data >= rhs_; } - private: - T rhs_; -}; + private: + T rhs_; + }; -// class_and composition predicate -template -struct AndParamConstraint: public ParamConstraintFacade< AndParamConstraint > { -public: + // 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(); + std::stringstream iss; + iss << "(" << cons1_.getConstraintDescription() << " and " << cons2_.getConstraintDescription() << ")"; + this->description_ = iss.str(); } template bool operator()( DataType data ) const { - return cons1_(data) && cons2_(data); + return cons1_(data) && cons2_(data); } -private: + private: Cons1T cons1_; Cons2T cons2_; -}; + }; -template -struct OrParamConstraint: public ParamConstraintFacade< OrParamConstraint > { -public: + 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(); - } + std::stringstream iss; + iss << cons1_.getConstraintDescription() << " or " << cons2_.getConstraintDescription() << ""; + this->description_ = iss.str(); + } template bool operator()( DataType data ) const { - return cons1_(data) || cons2_(data); + return cons1_(data) || cons2_(data); } -private: + private: Cons1T cons1_; Cons2T cons2_; -}; + }; -template -struct NotParamConstraint: public ParamConstraintFacade< NotParamConstraint > { -public: + template + struct NotParamConstraint: public ParamConstraintFacade< NotParamConstraint > { + public: NotParamConstraint( ConsT cons) : cons_(cons) { - std::stringstream iss; - iss << "(not" << cons_.getConstraintDescription() << ")"; - this->description_ = iss.str(); + std::stringstream iss; + iss << "(not" << cons_.getConstraintDescription() << ")"; + this->description_ = iss.str(); } template bool operator()( DataType data ) const { - return !cons_(data); + return !cons_(data); } -private: + private: ConsT cons_; -}; + }; -template -inline AndParamConstraint -operator &&(const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { + template + inline AndParamConstraint + operator &&(const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { return AndParamConstraint( - *static_cast(&cons1), - *static_cast(&cons2) ); -} + *static_cast(&cons1), + *static_cast(&cons2) ); + } -template -inline OrParamConstraint -operator ||( const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { + template + inline OrParamConstraint + operator ||( const ParamConstraintFacade& cons1, const ParamConstraintFacade& cons2 ) { return OrParamConstraint( - *static_cast(&cons1), - *static_cast(&cons2) ); -} + *static_cast(&cons1), + *static_cast(&cons2) ); + } -template -inline NotParamConstraint -operator !( const ParamConstraintFacade& cons ) { + template + inline NotParamConstraint + operator !( const ParamConstraintFacade& cons ) { return NotParamConstraint(*static_cast(&cons)); -} + } -NotEmptyConstraint isNotEmpty() { - return NotEmptyConstraint(); -} + NotEmptyConstraint isNotEmpty(); + ZeroConstraint isZero(); -ZeroConstraint isZero() { - return ZeroConstraint(); -} + ParamConstraintFacade isNonZero(); + PositiveConstraint isPositive(); + NonPositiveConstraint isNonPositive(); -ParamConstraintFacade isNonZero() { - return ParamConstraintFacade(); -} + NegativeConstraint isNegative(); -PositiveConstraint isPositive() { - return PositiveConstraint(); -} + NonNegativeConstraint isNonNegative(); + EvenConstraint isEven(); -NonPositiveConstraint isNonPositive() { - return NonPositiveConstraint(); -} - -NegativeConstraint isNegative() { - return NegativeConstraint(); -} - -NonNegativeConstraint isNonNegative() { - return NonNegativeConstraint(); -} - -template -LessThanConstraintisLessThan(T& v ) { + template + inline LessThanConstraintisLessThan(T& v ) { return LessThanConstraint(v); -} + } -template -LessThanOrEqualToConstraint isLessThanOrEqualTo(T& v ) { - return ParamConstraintFacade >(v); -} + template + inline LessThanOrEqualToConstraint isLessThanOrEqualTo(T& v ) { + return LessThanOrEqualToConstraint(v); + } -template -EqualConstraint isEqual(T& v ) { + template + inline EqualConstraint isEqual(T& v ) { return EqualConstraint(v); -} + } -template -GreaterThanConstraint isGreaterThan(T& v ) { + template + inline GreaterThanConstraint isGreaterThan(T& v ) { return GreaterThanConstraint(v); -} + } -template -GreaterThanOrEqualTo isGreaterThanOrEqualTo(T& v ) { + template + inline GreaterThanOrEqualTo isGreaterThanOrEqualTo(T& v ) { return GreaterThanOrEqualTo(v); -} + } -EqualIgnoreCaseConstraint isEqualIgnoreCase(std::string str) { - return EqualIgnoreCaseConstraint(str); + EqualIgnoreCaseConstraint isEqualIgnoreCase(std::string str); } - #endif