{
/**
* Less than operator.
*
* \param first first object
* \param second second object
* \return true if first object is less than second object; else false
*/
friend bool operator<(const JClass_t& first,
const JClass_t& second)
{
return first.less(second);
}
/**
* Greater than operator.
*
* \param first first object
* \param second second object
* \return true if first object is greater than second object; else false
*/
friend bool operator>(const JClass_t& first,
const JClass_t& second)
{
return second.less(first);
}
/**
* Less than or equal operator.
*
* \param first first object
* \param second second object
* \return true if first object is less than or equal to second object; else false
*/
friend bool operator<=(const JClass_t& first,
const JClass_t& second)
{
return !second.less(first);
}
/**
* Greater than or equal operator.
*
* \param first first object
* \param second second object
* \return true if first object is greater than or equal to second object; else false
*/
friend bool operator>=(const JClass_t& first,
const JClass_t& second)
{
return !first.less(second);
}
/**
* Equal operator.
*
* \param first first object
* \param second second object
* \return true if two objects are equal; else false
*/
friend bool operator==(const JClass_t& first,
const JClass_t& second)
{
return !first.less(second) && !second.less(first);
}
/**
* Not equal operator.
*
* \param first first object
* \param second second object
* \return true if two objects are not equal; else false
*/
friend bool operator!=(const JClass_t& first,
const JClass_t& second)
{
return first.less(second) || second.less(first);
}
};
/**
* Specialisation of class JComparable for two data types.
*
* The first template parameter should have the corresponding member methods:
*
* bool less(const JSecond_t&) const;
* bool more(const JSecond_t&) const;
*
* where JFirst_t andd JSecond_t refers to the first and second template parameter, respectively.
* The second template parameter may be a primitive data type.
* This class uses in-class friend operators (see Barton-Nackman trick).
*/
template
struct JComparable
{
/**
* Less than operator.
*
* \param first first object
* \param second second object
* \return true if first object is less than second object; else false
*/
friend bool operator<(const JFirst_t& first,
typename JClass::argument_type second)
{
return first.less(second);
}
/**
* Less than operator.
*
* \param first first object
* \param second second object
* \return true if first object is less than second object; else false
*/
friend bool operator<(typename JClass::argument_type first,
const JFirst_t& second)
{
return second.more(first);
}
/**
* Greater than operator.
*
* \param first first object
* \param second second object
* \return true if first object is greater than second object; else false
*/
friend bool operator>(const JFirst_t& first,
typename JClass::argument_type second)
{
return first.more(second);
}
/**
* Greater than operator.
*
* \param first first object
* \param second second object
* \return true if first object is greater than second object; else false
*/
friend bool operator>(typename JClass::argument_type first,
const JFirst_t& second)
{
return second.less(first);
}
/**
* Less than or equal operator.
*
* \param first first object
* \param second second object
* \return true if first object is less than or equal to second object; else false
*/
friend bool operator<=(const JFirst_t& first,
typename JClass::argument_type second)
{
return !first.more(second);
}
/**
* Less than or equal operator.
*
* \param first first object
* \param second second object
* \return true if first object is less than or equal to second object; else false
*/
friend bool operator<=(typename JClass::argument_type first,
const JFirst_t& second)
{
return second.more(first);
}
/**
* Greater than or equal operator.
*
* \param first first object
* \param second second object
* \return true if first object is greater than or equal to second object; else false
*/
friend bool operator>=(const JFirst_t& first,
typename JClass::argument_type second)
{
return !first.less(second);
}
/**
* Greater than or equal operator.
*
* \param first first object
* \param second second object
* \return true if first object is greater than or equal to second object; else false
*/
friend bool operator>=(typename JClass::argument_type first,
const JFirst_t& second)
{
return second.less(first);
}
/**
* Equal operator.
*
* \param first first object
* \param second second object
* \return true if two objects are equal; else false
*/
friend bool operator==(const JFirst_t& first,
typename JClass::argument_type second)
{
return !first.less(second) && !first.more(second);
}
/**
* Equal operator.
*
* \param first first object
* \param second second object
* \return true if two objects are equal; else false
*/
friend bool operator==(typename JClass::argument_type first,
const JFirst_t& second)
{
return !second.less(first) && !second.more(first);
}
/**
* Not equal operator.
*
* \param first first object
* \param second second object
* \return true if two objects are not equal; else false
*/
friend bool operator!=(const JFirst_t& first,
typename JClass::argument_type second)
{
return first.less(second) || first.more(second);
}
/**
* Not equal operator.
*
* \param first first object
* \param second second object
* \return true if two objects are not equal; else false
*/
friend bool operator!=(typename JClass::argument_type first,
const JFirst_t& second)
{
return second.less(first) || second.more(first);
}
};
}
#endif