#include #include #include #include template class SignalCallable { public: SignalCallable() { } virtual ~SignalCallable() { } virtual ret call()=0; }; template class SignalCall0 : public SignalCallable { public: SignalCall0( const Bu::Signal0 &sRef ) : sRef( sRef ) { } virtual ~SignalCall0() { } virtual ret call() { return sRef(); } private: Bu::Signal0 sRef; }; template class SignalCall1 : public SignalCallable { public: SignalCall1( const Bu::Signal1 &sRef, const p1t &p1 ) : sRef( sRef ), p1( p1 ) { } virtual ~SignalCall1() { } virtual ret call() { return sRef( p1 ); } private: Bu::Signal1 sRef; p1t p1; }; template class SignalCall2 : public SignalCallable { public: SignalCall2( const Bu::Signal2 &sRef, const p1t &p1, const p2t &p2 ) : sRef( sRef ), p1( p1 ), p2( p2 ) { } virtual ~SignalCall2() { } virtual ret call() { return sRef( p1, p2 ); } private: Bu::Signal2 sRef; p1t p1; p2t p2; }; template class DeferredSignal2 : public Bu::Signal2 { typedef Bu::Signal2 Parent; public: DeferredSignal2() : Parent() { } DeferredSignal2( Bu::_Slot2 *pCb ) : Parent( pCb ) { } DeferredSignal2( const DeferredSignal2 &rSrc ) : Parent( (const Parent &)rSrc ) { } virtual ~DeferredSignal2() { } void operator()( p1t p1, p2t p2 ) { lCalls.enqueue( SignalCall2( (Parent &)*this, p1, p2 ) ); } DeferredSignal2 &operator=( const Bu::Signal2 &rhs ) { ((Parent &)*this) = rhs; return *this; } bool operator==( const Bu::Signal2 &rhs ) const { return ((Parent &)*this) == rhs; } bool hasNext() const { return !lCalls.isEmpty(); } ret callNext() { return lCalls.dequeue().call(); } private: Bu::List< SignalCall2 > lCalls; }; // // Slots // int area( int x, int y ) { return x*y; } int diff( int x, int y ) { return x-y; } int thing( int x, int y ) { return x*x-y*y; } int square( int x ) { return x*x; } int rand() { Bu::RandomCmwc c; c.seed( time( NULL ) ); return c.rand(); } int main() { // Direct use of SignalCall objects Bu::println("Testing SignalCall classes:"); typedef Bu::List * > CallList; CallList calls; calls.append( new SignalCall2( Bu::slot(&area), 5, 10 ) ); calls.append( new SignalCall2( Bu::slot(&diff), 5, 15 ) ); calls.append( new SignalCall2( Bu::slot(&thing), 10, 5 ) ); calls.append( new SignalCall1( Bu::slot(&square), 12 ) ); calls.append( new SignalCall0( Bu::slot(&rand)) ); for( CallList::iterator i = calls.begin(); i; i++ ) { Bu::println(" - Result: %1").arg( (*i)->call() ); } // Deferred Signals: Bu::println(""); Bu::println("Testing DeferredSignals:"); DeferredSignal2 sigArea; sigArea = Bu::slot(&area); sigArea( 5, 5 ); sigArea( 10, 10 ); sigArea( 15, 15 ); while( sigArea.hasNext() ) { Bu::println(" - Result: %1").arg( sigArea.callNext() ); } return 0; }