#include #include #include "JLang/JComparable.hh" #include "JLang/JEquals.hh" #include "JLang/JMultiEquals.hh" #include "JLang/JComparisonAvailable.hh" #include "Jeep/JParser.hh" #include "Jeep/JMessage.hh" namespace { using namespace JPP; struct __A__ {}; struct __B__ {}; struct __C__ : public __B__ {}; struct __D__ : public JComparable<__D__> { bool less(const __D__& object) const { return true; } }; inline bool operator!=(const __A__& first, const __A__& second) { return false; } inline bool operator< (const __B__& first, const __B__& second) { return false; } inline bool operator> (const __B__& first, const __B__& second) { return false; } struct __E__ : public __A__, public __D__, // adddition of this base class solves the ambiguity problem. public JMultiEquals<__E__, JTYPELIST<__A__, __D__>::typelist> {}; } /** * Print availabilty of comparison operators. * * \param OUT output stream * \param CLASS class name */ #define PRINT(OUT, CLASS) \ OUT << std::setw(6) << std::left << #CLASS << ' ' ; \ OUT << ' ' << JComparisonAvailable::has_eq << ' '; \ OUT << ' ' << JComparisonAvailable::has_ne << ' '; \ OUT << ' ' << JComparisonAvailable::has_lt << ' '; \ OUT << ' ' << JComparisonAvailable::has_gt << ' '; \ OUT << ' ' << JComparisonAvailable::has_le << ' '; \ OUT << ' ' << JComparisonAvailable::has_ge << std::endl; /** * \file * * Example program to test JLANG::JComparisonAvailable and JLANG::JComparable classes. * \author mdejong */ int main(int argc, char **argv) { using namespace std; using namespace JPP; int debug; try { JParser<> zap("Example program to test availability of object comparisons."); zap['d'] = make_field(debug) = 3; zap(argc, argv); } catch(const exception &error) { FATAL(error.what() << endl); } if (debug >= debug_t) { cout << setw(6) << left << "class" << ' ' << "eq ne lt gt le ge" << endl; PRINT(cout, __A__); PRINT(cout, __B__); PRINT(cout, __C__); PRINT(cout, __D__); PRINT(cout, __E__); } ASSERT(JComparisonAvailable<__A__>::has_eq == false); ASSERT(JComparisonAvailable<__A__>::has_ne == true); ASSERT(JComparisonAvailable<__A__>::has_lt == false); ASSERT(JComparisonAvailable<__A__>::has_le == false); ASSERT(JComparisonAvailable<__A__>::has_gt == false); ASSERT(JComparisonAvailable<__A__>::has_ge == false); ASSERT(JComparisonAvailable<__C__>::has_eq == false); ASSERT(JComparisonAvailable<__C__>::has_ne == false); ASSERT(JComparisonAvailable<__C__>::has_lt == true); ASSERT(JComparisonAvailable<__C__>::has_le == false); ASSERT(JComparisonAvailable<__C__>::has_gt == true); ASSERT(JComparisonAvailable<__C__>::has_ge == false); ASSERT(JComparisonAvailable<__D__>::has_eq == true); ASSERT(JComparisonAvailable<__D__>::has_ne == true); ASSERT(JComparisonAvailable<__D__>::has_lt == true); ASSERT(JComparisonAvailable<__D__>::has_le == true); ASSERT(JComparisonAvailable<__D__>::has_gt == true); ASSERT(JComparisonAvailable<__D__>::has_ge == true); ASSERT(JComparisonAvailable<__E__>::has_eq == true); ASSERT(JComparisonAvailable<__E__>::has_ne == true); ASSERT(JComparisonAvailable<__E__>::has_lt == true); ASSERT(JComparisonAvailable<__E__>::has_le == true); ASSERT(JComparisonAvailable<__E__>::has_gt == true); ASSERT(JComparisonAvailable<__E__>::has_ge == true); return 0; }