#ifndef GHOST_ABSTRACT_H #define GHOST_ABSTRACT_H #include template class Func { public: Link > in; Link > out; enum { empty, full } state; Func(I& i, O& o) : in(i, this, &Func::signal_in), out(o, this, &Func::signal_out), state(empty) {} virtual void operate() {} void signal_in() { assert(state == empty); operate(); state = full; out.signal(); } void signal_out() { assert(state == full); state = empty; in.signal(); } }; template class Yee { public: Link > in0, in1; Link > out; enum { empty, one, full } state; Yee(T& i0, T& i1, T& o) : in0(i0, this, &Yee::signal_in), in1(i1, this, &Yee::signal_in), out(o, this, &Yee::signal_out), state(empty) {} virtual void operate() = 0; void signal_in() { assert(state == empty || state == one); if (state == empty) { state = one; } else { operate(); state = full; out.signal(); } } void signal_out() { assert(state == full); state = empty; in0.signal(); in1.signal(); } }; #endif