#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;
struct A
{
bool bValid;
mutable bool singleTimeInvert;
int value;
bool isValid( ) { return bValid; }
A( bool b = false ) : bValid( b) , singleTimeInvert( false ) { }
A( int v) : bValid( true ) , singleTimeInvert( false ) , value( v) { }
A( const A & a) : bValid( a.bValid ) , singleTimeInvert( a.singleTimeInvert ) , value( a.value ) { }
A( const A & a, bool i) : bValid( a.bValid ) , singleTimeInvert( i) , value( a.value ) { }
explicit operator bool ( ) const
{
bool tmp = singleTimeInvert;
singleTimeInvert = false ;
return tmp ? ! bValid : bValid;
}
A operator! ( ) const
{
return A( * this , true ) ;
}
A& operator! = ( const A & a)
{
* this = a;
singleTimeInvert = true ;
return * this ;
}
} ;
A foo( )
{
return 5 ;
}
A bar( )
{
return false ;
}
int main( ) {
if ( auto a ! = foo( ) )
{
cout << "a is not valid\n " ;
}
else
{
cout << "a = " << a.value << "\n " ;
}
if ( auto b ! = bar( ) )
{
cout << "b is not valid\n " ;
}
else
{
cout << "b = " << b.value << "\n " ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPiAKI2luY2x1ZGUgPHV0aWxpdHk+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKc3RydWN0IEEKewoJYm9vbCBiVmFsaWQ7CgltdXRhYmxlIGJvb2wgc2luZ2xlVGltZUludmVydDsKCWludCAgdmFsdWU7Cglib29sIGlzVmFsaWQoKSB7IHJldHVybiBiVmFsaWQ7IH0KCQoJQShib29sIGIgPSBmYWxzZSkgOiBiVmFsaWQoYiksIHNpbmdsZVRpbWVJbnZlcnQoZmFsc2UpIHt9CglBKGludCB2KSA6IGJWYWxpZCh0cnVlKSwgc2luZ2xlVGltZUludmVydChmYWxzZSksIHZhbHVlKHYpICB7fSAKCUEoY29uc3QgQSAmIGEpIDogYlZhbGlkKGEuYlZhbGlkKSwgc2luZ2xlVGltZUludmVydChhLnNpbmdsZVRpbWVJbnZlcnQpLCB2YWx1ZShhLnZhbHVlKSB7fQoJQShjb25zdCBBICYgYSwgYm9vbCBpKSA6IGJWYWxpZChhLmJWYWxpZCksIHNpbmdsZVRpbWVJbnZlcnQoaSksIHZhbHVlKGEudmFsdWUpIHt9CgkKCWV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdAoJewoJCWJvb2wgdG1wID0gc2luZ2xlVGltZUludmVydDsKCQlzaW5nbGVUaW1lSW52ZXJ0ID0gZmFsc2U7CgkJcmV0dXJuIHRtcCA/ICFiVmFsaWQgOiBiVmFsaWQ7Cgl9CgkKCUEgb3BlcmF0b3IhKCkgY29uc3QKCXsKCQlyZXR1cm4gQSgqdGhpcywgdHJ1ZSk7Cgl9CgkKCUEmIG9wZXJhdG9yIT0oY29uc3QgQSAmIGEpCgl7CgkJKnRoaXMgPSBhOwoJCXNpbmdsZVRpbWVJbnZlcnQgPSB0cnVlOwoJCXJldHVybiAqdGhpczsKCX0KCn07CgpBIGZvbygpCnsKICAgIHJldHVybiA1OwkKfQoKQSBiYXIoKQp7CglyZXR1cm4gZmFsc2U7Cn0KCmludCBtYWluKCkgewoKCWlmIChhdXRvIGEgIT0gZm9vKCkpCgl7CgkJY291dDw8ImEgaXMgbm90IHZhbGlkXG4iOwoJfQoJZWxzZQoJewoJCWNvdXQ8PCJhID0gIjw8YS52YWx1ZTw8IlxuIjsKCX0KCglpZiAoYXV0byBiICE9IGJhcigpKQoJewoJCWNvdXQ8PCJiIGlzIG5vdCB2YWxpZFxuIjsKCX0KCWVsc2UKCXsKCQljb3V0PDwiYiA9ICI8PGIudmFsdWU8PCJcbiI7Cgl9CgkKCXJldHVybiAwOwp9