#include <iostream>
using namespace std;
namespace test
{
struct StructTest
{
int i;
int compare( const StructTest s )
{
if (i<s.i) return -1;
else if (i>s.i) return 1;
else return 0;
}
};
bool operator<( StructTest t1, StructTest t2 )
{
return t1.compare(t2) < 0;
}
enum class EnumTest
{
e1, e2, e3
};
namespace utils {
inline int compare( EnumTest e1, EnumTest e2 )
{
unsigned u1 = (unsigned)e1;
unsigned u2 = (unsigned)e2;
if (u1<u2) return -1;
else if (u1>u2) return 1;
else return 0;
}
} // namespace utils
inline bool operator< ( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) < 0; }
inline bool operator<=( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) <= 0; }
inline bool operator> ( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) > 0; }
inline bool operator>=( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) >= 0; }
inline bool operator==( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) == 0; }
inline bool operator!=( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) != 0; }
struct SomeOther
{
EnumTest e;
};
} // namespace test
int main( int argc, char * argv[])
{
test::SomeOther so1 = { test::EnumTest::e1 };
test::SomeOther so2 = { test::EnumTest::e2 };
if (so1.e<so2.e)
cout<<"so1.e<so2.e\n";
else
cout<<"so1.e<so2.e\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCgpuYW1lc3BhY2UgdGVzdAp7CgpzdHJ1Y3QgU3RydWN0VGVzdAp7CiAgICBpbnQgaTsKCiAgICBpbnQgY29tcGFyZSggY29uc3QgU3RydWN0VGVzdCBzICkKICAgIHsKICAgICAgICBpZiAoaTxzLmkpICAgICAgcmV0dXJuIC0xOwogICAgICAgIGVsc2UgaWYgKGk+cy5pKSByZXR1cm4gIDE7CiAgICAgICAgZWxzZSAgICAgICAgICAgIHJldHVybiAgMDsKICAgIH0KCn07IAoKYm9vbCBvcGVyYXRvcjwoIFN0cnVjdFRlc3QgdDEsIFN0cnVjdFRlc3QgdDIgKQp7CiAgICByZXR1cm4gdDEuY29tcGFyZSh0MikgPCAwOwp9CgoKZW51bSBjbGFzcyBFbnVtVGVzdAp7CiAgICBlMSwgZTIsIGUzCn07CgpuYW1lc3BhY2UgdXRpbHMgewoKaW5saW5lIGludCBjb21wYXJlKCBFbnVtVGVzdCBlMSwgRW51bVRlc3QgZTIgKQp7CiAgICB1bnNpZ25lZCB1MSA9ICh1bnNpZ25lZCllMTsKICAgIHVuc2lnbmVkIHUyID0gKHVuc2lnbmVkKWUyOwoKICAgIGlmICh1MTx1MikgICAgICByZXR1cm4gLTE7CiAgICBlbHNlIGlmICh1MT51MikgcmV0dXJuICAxOwogICAgZWxzZSAgICAgICAgICAgIHJldHVybiAgMDsKfQoKfSAvLyBuYW1lc3BhY2UgdXRpbHMKCmlubGluZSBib29sIG9wZXJhdG9yPCAoIEVudW1UZXN0IGUxLCBFbnVtVGVzdCBlMiApIHsgcmV0dXJuIHV0aWxzOjpjb21wYXJlKCBlMSwgZTIgKSA8ICAwOyB9CmlubGluZSBib29sIG9wZXJhdG9yPD0oIEVudW1UZXN0IGUxLCBFbnVtVGVzdCBlMiApIHsgcmV0dXJuIHV0aWxzOjpjb21wYXJlKCBlMSwgZTIgKSA8PSAwOyB9CmlubGluZSBib29sIG9wZXJhdG9yPiAoIEVudW1UZXN0IGUxLCBFbnVtVGVzdCBlMiApIHsgcmV0dXJuIHV0aWxzOjpjb21wYXJlKCBlMSwgZTIgKSA+ICAwOyB9CmlubGluZSBib29sIG9wZXJhdG9yPj0oIEVudW1UZXN0IGUxLCBFbnVtVGVzdCBlMiApIHsgcmV0dXJuIHV0aWxzOjpjb21wYXJlKCBlMSwgZTIgKSA+PSAwOyB9CmlubGluZSBib29sIG9wZXJhdG9yPT0oIEVudW1UZXN0IGUxLCBFbnVtVGVzdCBlMiApIHsgcmV0dXJuIHV0aWxzOjpjb21wYXJlKCBlMSwgZTIgKSA9PSAwOyB9CmlubGluZSBib29sIG9wZXJhdG9yIT0oIEVudW1UZXN0IGUxLCBFbnVtVGVzdCBlMiApIHsgcmV0dXJuIHV0aWxzOjpjb21wYXJlKCBlMSwgZTIgKSAhPSAwOyB9CgpzdHJ1Y3QgU29tZU90aGVyCnsKCUVudW1UZXN0IGU7Cn07Cgp9IC8vIG5hbWVzcGFjZSB0ZXN0CgoKaW50IG1haW4oIGludCBhcmdjLCBjaGFyICogYXJndltdKQp7CiAgICB0ZXN0OjpTb21lT3RoZXIgc28xID0geyB0ZXN0OjpFbnVtVGVzdDo6ZTEgfTsKICAgIHRlc3Q6OlNvbWVPdGhlciBzbzIgPSB7IHRlc3Q6OkVudW1UZXN0OjplMiB9OwoKICAgIGlmIChzbzEuZTxzbzIuZSkKICAgICAgICBjb3V0PDwic28xLmU8c28yLmVcbiI7CiAgICBlbHNlCiAgICAgICAgY291dDw8InNvMS5lPHNvMi5lXG4iOwoKICAgIHJldHVybiAwOwoKfQoK