/// \file comparable.h /// \brief Declares the Comparable mixin /*********************************************************************** Copyright (c) 1998 by Kevin Atkinson, (c) 1999-2001 by MySQL AB, and (c) 2004-2008 by Educational Technology Resources, Inc. Others may also hold copyrights on code in this file. See the CREDITS.txt file in the top directory of the distribution for details. This file is part of MySQL++. MySQL++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. MySQL++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with MySQL++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ***********************************************************************/ #if !defined(MYSQLPP_COMPARABLE_H) #define MYSQLPP_COMPARABLE_H namespace mysqlpp { /// \brief Mix-in that gives its subclass a full set of comparison /// operators. /// /// Simply by inheriting publically from this and implementing /// compare(), the subclass gains a full set of comparison operators, /// because all of the operators are implemented in terms of compare(). template class Comparable { public: /// \brief Returns true if "other" is equal to this object bool operator ==(const T& other) const { return !compare(other); } /// \brief Returns true if "other" is not equal to this object bool operator !=(const T& other) const { return compare(other); } /// \brief Returns true if "other" is less than this object bool operator <(const T& other) const { return compare(other) < 0; } /// \brief Returns true if "other" is less than or equal to this object bool operator <=(const T& other) const { return compare(other) <= 0; } /// \brief Returns true if "other" is greater than this object bool operator >(const T& other) const { return compare(other) > 0; } /// \brief Returns true if "other" is greater than or equal to this object bool operator >=(const T& other) const { return compare(other) >= 0; } protected: /// \brief Destroy object /// /// This class has nothing to destroy, but declaring the dtor /// virtual placates some compilers set to high warning levels. /// Protecting it ensures you can't delete subclasses through base /// class pointers, which makes no sense because this class isn't /// made for polymorphism. It's just a mixin. virtual ~Comparable() { } /// \brief Compare this object to another of the same type /// /// Returns < 0 if this object is "before" the other, 0 of they are /// equal, and > 0 if this object is "after" the other. virtual int compare(const T& other) const = 0; }; } #endif // !defined(MYSQLPP_COMPARABLE_H)