#include "..\invariants.hpp" using namespace boost::DBC; class my_class1 : INVARIANTS_BASE< my_class1 > { typedef my_class1 type; //required protected: int a, b; private: INVARIANTS() { assert( a + b == 5 ); } public: my_class1() : a(2), b(3) { FIRST_INVARIANTS_CHECK(); } ~my_class1() { LAST_INVARIANTS_CHECK(); } void f() { _INVARIANTS_CHECKED_ ++a; --b; } void g() { _INVARIANTS_CHECKED_ ++a; } }; class my_class2 : INVARIANTS_BASE< my_class2 > { typedef my_class2 type; //required protected: int c, d; private: INVARIANTS() { assert( c + d == 9 ); } public: my_class2() : c(5), d(4) { FIRST_INVARIANTS_CHECK(); } ~my_class2() { LAST_INVARIANTS_CHECK(); } void h() { _INVARIANTS_CHECKED_ ++d; } void i() { _INVARIANTS_CHECKED_ --c; ++d; } }; template< typename I, int J > class my_class3 : INVARIANTS_BASE< my_class3< I, J > > , public my_class1, public my_class2 { typedef my_class3<I,J> type; //required !!! I i_; INVARIANTS() { assert( a + c == 7 ); assert( b + d == 7 ); assert( !i_ ); } public: my_class3() : i_(J) { FIRST_INVARIANTS_CHECK(); } ~my_class3() { LAST_INVARIANTS_CHECK(); } void j() { _INVARIANTS_CHECKED_ f(); i(); } void k() { _INVARIANTS_CHECKED_ h(); g(); } void l() { _INVARIANTS_CHECKED_ ++a; } void m() { _INVARIANTS_CHECKED_ ++i_; } }; int main() { my_class1 my_obj1; my_obj1.f(); //my_obj1.g(); //BOOM! my_class2 my_obj2; my_obj2.h(); //BOOM! my_obj2.i(); my_class3<int,0> my_obj3; my_obj3.f(); my_obj3.g(); //BOOM! my_obj3.h(); //BOOM! my_obj3.i(); my_obj3.j(); my_obj3.k(); //BOOM! my_obj3.l(); //BOOM! my_obj3.m(); //BOOM! return 0; }
code/root/inc/test/invariant.cpp.txt · Last modified: 2006/10/09 23:40 by chuck_starchaser


