#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