29 #ifndef __INVARIANT__H__ 30 #define __INVARIANT__H__ 36 class InvariantCount {
38 InvariantCount() {fNesting = 0;}
39 void Enter()
const {++fNesting; ASSERT(fNesting >= 1);}
40 void Exit()
const {--fNesting; ASSERT(fNesting >= 0);}
41 bool16 Check()
const {
return fNesting == 1;}
43 mutable int32 fNesting;
46 template<
typename T>
class AutoInvariantChecker {
48 explicit AutoInvariantChecker(InvariantCount& invariant, T& t) :
49 fInvariant(invariant),
53 if (fInvariant.Check())
56 ~AutoInvariantChecker()
58 if (fInvariant.Check())
63 InvariantCount& fInvariant;
67 #define PRECONDITION(p) ASSERT(p); fInvariant.Enter(); if (fInvariant.Check()) this->Invariant() 68 #define POSTCONDITION(p) ASSERT(p); if (fInvariant.Check()) this->Invariant(); fInvariant.Exit() 70 #define CHECK_INVARIANT this->Invariant 71 #define AUTO_INVARIANT_CHECKER(TYPE) AutoInvariantChecker<TYPE> autoInvariantChecker(fInvariant, *this) 74 #define PRECONDITION(p) ((void) 0) 75 #define POSTCONDITION(p) ((void) 0) 76 #define CHECK_INVARIANT() ((void) 0) 77 #define AUTO_INVARIANT_CHECKER(TYPE) ((void) 0) 80 #endif // __INVARIANT__H__