#include <iostream>
using namespace std;
template < typename T>
struct bool_context {
friend T operator&& ( T const & lhs, bool rhs) {
return lhs && T( rhs) ;
}
friend T operator&& ( bool lhs, T const & rhs) {
return T( lhs) && rhs;
}
friend T operator|| ( T const & lhs, bool rhs) {
return lhs || T( rhs) ;
}
friend T operator|| ( bool lhs, T const & rhs) {
return T( lhs) || rhs;
}
} ;
struct my_bool : bool_context< my_bool> {
bool value;
my_bool( bool v) : value( v) { }
explicit operator bool ( ) { return value; } ;
friend my_bool operator&& ( my_bool const & lhs, my_bool const & rhs) {
cout << "my_bool::operator&&" << endl;
return lhs.value && rhs.value ;
}
friend my_bool operator|| ( my_bool const & lhs, my_bool const & rhs) {
cout << "my_bool::operator||" << endl;
return lhs.value || rhs.value ;
}
} ;
int main( int , char ** ) {
my_bool a = true ;
bool b = false ;
cout << "a && b => " ; a && b;
cout << "b && a => " ; b && a;
cout << "a && a => " ; a && a;
cout << "b && b => " ; b && b; cout << endl;
cout << "a || b => " ; a || b;
cout << "b || a => " ; b || a;
cout << "a || a => " ; a || a;
cout << "b || b => " ; b || b; cout << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGJvb2xfY29udGV4dCB7CglmcmllbmQgVCBvcGVyYXRvciYmKFQgY29uc3QgJiBsaHMsIGJvb2wgcmhzKSB7CgkJcmV0dXJuIGxocyAmJiBUKHJocyk7Cgl9CglmcmllbmQgVCBvcGVyYXRvciYmKGJvb2wgbGhzLCBUIGNvbnN0ICYgcmhzKSB7CgkJcmV0dXJuIFQobGhzKSAmJiByaHM7Cgl9CglmcmllbmQgVCBvcGVyYXRvcnx8KFQgY29uc3QgJiBsaHMsIGJvb2wgcmhzKSB7CgkJcmV0dXJuIGxocyB8fCBUKHJocyk7Cgl9CglmcmllbmQgVCBvcGVyYXRvcnx8KGJvb2wgbGhzLCBUIGNvbnN0ICYgcmhzKSB7CgkJcmV0dXJuIFQobGhzKSB8fCByaHM7Cgl9Cn07CgpzdHJ1Y3QgbXlfYm9vbCA6IGJvb2xfY29udGV4dDxteV9ib29sPiB7Cglib29sIHZhbHVlOwoJbXlfYm9vbChib29sIHYpIDogdmFsdWUodikge30KCWV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiB2YWx1ZTsgfTsKCWZyaWVuZCBteV9ib29sIG9wZXJhdG9yJiYobXlfYm9vbCBjb25zdCAmIGxocywgbXlfYm9vbCBjb25zdCAmIHJocykgewoJCWNvdXQgPDwgIm15X2Jvb2w6Om9wZXJhdG9yJiYiIDw8IGVuZGw7CgkJcmV0dXJuIGxocy52YWx1ZSAmJiByaHMudmFsdWU7Cgl9CglmcmllbmQgbXlfYm9vbCBvcGVyYXRvcnx8KG15X2Jvb2wgY29uc3QgJiBsaHMsIG15X2Jvb2wgY29uc3QgJiByaHMpIHsKCQljb3V0IDw8ICJteV9ib29sOjpvcGVyYXRvcnx8IiA8PCBlbmRsOwoJCXJldHVybiBsaHMudmFsdWUgfHwgcmhzLnZhbHVlOwoJfQp9OwoKCmludCBtYWluKGludCwgY2hhcioqKSB7CglteV9ib29sIGEgPSB0cnVlOwoJYm9vbCBiID0gZmFsc2U7Cgljb3V0IDw8ICJhICYmIGIgPT4gIjsgYSAmJiBiOwoJY291dCA8PCAiYiAmJiBhID0+ICI7IGIgJiYgYTsKCWNvdXQgPDwgImEgJiYgYSA9PiAiOyBhICYmIGE7Cgljb3V0IDw8ICJiICYmIGIgPT4gIjsgYiAmJiBiOyBjb3V0IDw8IGVuZGw7Cgljb3V0IDw8ICJhIHx8IGIgPT4gIjsgYSB8fCBiOwoJY291dCA8PCAiYiB8fCBhID0+ICI7IGIgfHwgYTsKCWNvdXQgPDwgImEgfHwgYSA9PiAiOyBhIHx8IGE7Cgljb3V0IDw8ICJiIHx8IGIgPT4gIjsgYiB8fCBiOyBjb3V0IDw8IGVuZGw7CglyZXR1cm4gMDsKfQ==