#include <uC++.h>
#include <uIOStream.h>

uRaiseEvent R1 {
  public:
	int &i;
	R1( int &i ) : i(i) {}
};
uInitEvent( R1 );

uRaiseEvent R2 {
  public:
	int &i;
	R2( int &i ) : i(i) {}
};
uInitEvent( R2 );

void f( int &i );
void g( int &i );

void h1( R1 &r ) {
	r.i -= 1;
	uCout << "h1, i:" << r.i << endl;
	f( r.i );
}
void h2( R2 &r ) {
	r.i -= 2;
	uCout << "h2, i:" << r.i << endl;
	g( r.i );
}

void f( int &i ) {
	i -= 1;
	uCout << "f, i:" << i << endl;
	if ( i > 0 ) {
		try <R1,h1><R2,h2> {
			if ( i % 2 != 0 ) uRaise R2(i);
			g( i );
		}
	}
}
void g( int &i ) {
	i -= 1;
	uCout << "g, i:" << i << endl;
	if ( i > 0 ) {
		try <R1,h1><R2,h2> {
			f( i );
			uRaise R1(i);
		}
	}
}
void uMain::main() {
	int i = 20;
	f( i );
}

// Local Variables: //
// tab-width: 4 //
// End: //

