class counter { \fbox{counter}
public:
counter(int n = 0) : _n(n) {
require( n >= 0 );
promise( invariant() ); \c{// check initial state}
}
virtual void operator++() {
require( true ); \c{// empty pre-condition}
hold(); \c{// save the previous state}
_n += 1;
promise( _n == old_n + 1 && invariant() );
}
int value() const { return _n; } \c{// no side effects}
virtual bool invariant() { return value() >= 0; }
protected:
int _n;
int old_n;
virtual void hold() { old_n = n; }
};
slide: The counter contract