//chaining comparison object
template<class T>
class comparison {
const bool result;
const T& last;
public:
comparison(const T& l, bool r=true) :result(r), last(l) {}
operator bool() const {return result;}
comparison operator<(const T& rhs) const {return comparison(rhs, (result && last<rhs));}
comparison operator<=(const T& rhs) const {return comparison(rhs, (result && last<=rhs));}
comparison operator>(const T& rhs) const {return comparison(rhs, (result && last>rhs));}
comparison operator>=(const T& rhs) const {return comparison(rhs, (result && last>=rhs));}
};
//random object that has operator chaining built in
struct a {
int val;
comparison<a> operator<(const a& rhs) const {return comparison<a>(rhs, val<rhs.val);}
comparison<a> operator<=(const a& rhs) const {return comparison<a>(rhs, val<=rhs.val);}
comparison<a> operator>(const a& rhs) const {return comparison<a>(rhs, val>rhs.val);}
comparison<a> operator>=(const a& rhs) const {return comparison<a>(rhs, val>=rhs.val);}
};
#include <iostream>
int main() {
a v0 = {0};
a v1 = {1};
a v2 = {2};
//testing of chained comparisons with builtin
std::cout << (v0<v1<v2) << '\n';
std::cout << (v0<v1>v2) << '\n';
std::cout << (v0>v1<v2) << '\n';
std::cout << (v0>v1>v2) << '\n';
//testing of chained comparisons with int
std::cout << (comparison<int>(0)<1<2) << '\n';
std::cout << (comparison<int>(0)<1>2) << '\n';
std::cout << (comparison<int>(0)>1<2) << '\n';
std::cout << (comparison<int>(0)>1>2) << '\n';
}
Ly9jaGFpbmluZyBjb21wYXJpc29uIG9iamVjdAp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBjb21wYXJpc29uIHsKICAgIGNvbnN0IGJvb2wgcmVzdWx0OwogICAgY29uc3QgVCYgbGFzdDsKcHVibGljOgogICAgY29tcGFyaXNvbihjb25zdCBUJiBsLCBib29sIHI9dHJ1ZSkgOnJlc3VsdChyKSwgbGFzdChsKSB7fQogICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHtyZXR1cm4gcmVzdWx0O30KICAgIGNvbXBhcmlzb24gb3BlcmF0b3I8KGNvbnN0IFQmIHJocykgY29uc3Qge3JldHVybiBjb21wYXJpc29uKHJocywgKHJlc3VsdCAmJiBsYXN0PHJocykpO30KICAgIGNvbXBhcmlzb24gb3BlcmF0b3I8PShjb25zdCBUJiByaHMpIGNvbnN0IHtyZXR1cm4gY29tcGFyaXNvbihyaHMsIChyZXN1bHQgJiYgbGFzdDw9cmhzKSk7fQogICAgY29tcGFyaXNvbiBvcGVyYXRvcj4oY29uc3QgVCYgcmhzKSBjb25zdCB7cmV0dXJuIGNvbXBhcmlzb24ocmhzLCAocmVzdWx0ICYmIGxhc3Q+cmhzKSk7fQogICAgY29tcGFyaXNvbiBvcGVyYXRvcj49KGNvbnN0IFQmIHJocykgY29uc3Qge3JldHVybiBjb21wYXJpc29uKHJocywgKHJlc3VsdCAmJiBsYXN0Pj1yaHMpKTt9Cn07CgovL3JhbmRvbSBvYmplY3QgdGhhdCBoYXMgb3BlcmF0b3IgY2hhaW5pbmcgYnVpbHQgaW4Kc3RydWN0IGEgewogICAgaW50IHZhbDsKICAgIGNvbXBhcmlzb248YT4gb3BlcmF0b3I8KGNvbnN0IGEmIHJocykgY29uc3Qge3JldHVybiBjb21wYXJpc29uPGE+KHJocywgdmFsPHJocy52YWwpO30KICAgIGNvbXBhcmlzb248YT4gb3BlcmF0b3I8PShjb25zdCBhJiByaHMpIGNvbnN0IHtyZXR1cm4gY29tcGFyaXNvbjxhPihyaHMsIHZhbDw9cmhzLnZhbCk7fQogICAgY29tcGFyaXNvbjxhPiBvcGVyYXRvcj4oY29uc3QgYSYgcmhzKSBjb25zdCB7cmV0dXJuIGNvbXBhcmlzb248YT4ocmhzLCB2YWw+cmhzLnZhbCk7fQogICAgY29tcGFyaXNvbjxhPiBvcGVyYXRvcj49KGNvbnN0IGEmIHJocykgY29uc3Qge3JldHVybiBjb21wYXJpc29uPGE+KHJocywgdmFsPj1yaHMudmFsKTt9Cn07CgojaW5jbHVkZSA8aW9zdHJlYW0+CmludCBtYWluKCkgewogICAgYSB2MCA9IHswfTsKICAgIGEgdjEgPSB7MX07CiAgICBhIHYyID0gezJ9OwogICAgLy90ZXN0aW5nIG9mIGNoYWluZWQgY29tcGFyaXNvbnMgd2l0aCBidWlsdGluCiAgICBzdGQ6OmNvdXQgPDwgKHYwPHYxPHYyKSA8PCAnXG4nOwogICAgc3RkOjpjb3V0IDw8ICh2MDx2MT52MikgPDwgJ1xuJzsKICAgIHN0ZDo6Y291dCA8PCAodjA+djE8djIpIDw8ICdcbic7CiAgICBzdGQ6OmNvdXQgPDwgKHYwPnYxPnYyKSA8PCAnXG4nOwogICAgLy90ZXN0aW5nIG9mIGNoYWluZWQgY29tcGFyaXNvbnMgd2l0aCBpbnQKICAgIHN0ZDo6Y291dCA8PCAoY29tcGFyaXNvbjxpbnQ+KDApPDE8MikgPDwgJ1xuJzsKICAgIHN0ZDo6Y291dCA8PCAoY29tcGFyaXNvbjxpbnQ+KDApPDE+MikgPDwgJ1xuJzsKICAgIHN0ZDo6Y291dCA8PCAoY29tcGFyaXNvbjxpbnQ+KDApPjE8MikgPDwgJ1xuJzsKICAgIHN0ZDo6Y291dCA8PCAoY29tcGFyaXNvbjxpbnQ+KDApPjE+MikgPDwgJ1xuJzsKfQogICAg