#ifndef __MARSEVENTS_H__ #define __MARSEVENTS_H__ #include namespace mars { template< class L > class Observable { public: inline void addListener (L * const pListener) { _listeners.insert(pListener); } inline void removeListener (L * const pListener) { _listeners.erase(pListener); } protected: #define WALK_LISTENERS(fn) \ for (typename std::set< L * >::iterator i = _listeners.begin(); i != _listeners.end(); ++i) \ ((*i)->*fn) template< typename Fn, typename A1 > void fire (Fn fn, A1 a1) { WALK_LISTENERS(fn)(a1); } template< typename Fn, typename A1, typename A2 > void fire (Fn fn, A1 a1, A2 a2) { WALK_LISTENERS(fn)(a1, a2); } template< typename Fn, typename A1, typename A2, typename A3 > void fire (Fn fn, A1 a1, A2 a2, A3 a3) { WALK_LISTENERS(fn)(a1, a2, a3); } template< typename Fn, typename A1, typename A2, typename A3, typename A4 > void fire (Fn fn, A1 a1, A2 a2, A3 a3, A4 a4) { WALK_LISTENERS(fn)(a1, a2, a3, a4); } template< typename Fn, typename A1, typename A2, typename A3, typename A4, typename A5 > void fire (Fn fn, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { WALK_LISTENERS(fn)(a1, a2, a3, a4, a5); } template< typename Fn, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 > void fire (Fn fn, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { WALK_LISTENERS(fn)(a1, a2, a3, a4, a5, a6); } private: std::set< L * > _listeners; }; } #endif // __MARSEVENTS_H__