Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include "cinder/Cinder.h"
00026
00027 #include <algorithm>
00028 #include <vector>
00029 #include <utility>
00030
00031 #include <boost/signals2.hpp>
00032 namespace cinder { namespace signals {
00033 using namespace boost::signals2;
00034 } }
00035
00036 #include <functional>
00037 namespace std {
00038 using namespace std::placeholders;
00039 }
00040
00041 namespace cinder {
00042
00044 typedef uint32_t CallbackId;
00045
00047 template<typename SIG>
00048 class CallbackMgr {
00049 public:
00050 typedef typename std::vector<std::pair<CallbackId,std::function<SIG> > > collection;
00051 typedef typename collection::iterator iterator;
00052
00053 CallbackId registerCb( std::function<SIG> cb )
00054 {
00055 CallbackId cbId = 0;
00056 if( ! mCallbacks.empty() )
00057 cbId = mCallbacks.rbegin()->first + 1;
00058 mCallbacks.push_back( std::make_pair( cbId, cb ) );
00059 return cbId;
00060 }
00061
00062 CallbackId registerCb( iterator position, std::function<SIG> cb )
00063 {
00064 CallbackId cbId = 0;
00065 if( ! mCallbacks.empty() )
00066 cbId = mCallbacks.rbegin()->first + 1;
00067 mCallbacks.insert( position, std::make_pair( cbId, cb ) );
00068 return cbId;
00069 }
00070
00071 void call() { for( iterator it = begin(); it != end(); ++it ) it->second(); }
00072 template<typename A1>
00073 void call( A1 a1 ) { for( iterator it = begin(); it != end(); ++it ) it->second( a1 ); }
00074 template<typename A1, typename A2>
00075 void call( A1 a1, A2 a2 ) { for( iterator it = begin(); it != end(); ++it ) it->second( a1, a2 ); }
00076 template<typename A1, typename A2, typename A3>
00077 void call( A1 a1, A2 a2, A3 a3 ) { for( iterator it = begin(); it != end(); ++it ) it->second( a1, a2, a3 ); }
00078 template<typename A1, typename A2, typename A3, typename A4>
00079 void call( A1 a1, A2 a2, A3 a3, A4 a4 ) { for( iterator it = begin(); it != end(); ++it ) it->second( a1, a2, a3, a4 ); }
00080 template<typename A1, typename A2, typename A3, typename A4, typename A5>
00081 void call( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) { for( iterator it = begin(); it != end(); ++it ) it->second( a1, a2, a3, a4, a5 ); }
00082
00083 void unregisterCb( CallbackId cbId ) { mCallbacks.erase( find( cbId ) ); }
00084
00085 bool empty() const { return mCallbacks.empty(); }
00086
00087 iterator find( CallbackId cbId ) { for( iterator it = begin(); it != end(); ++it ) if( it->first == cbId ) return it; return mCallbacks.end(); }
00088 iterator begin() { return mCallbacks.begin(); }
00089 iterator end() { return mCallbacks.end(); }
00090
00091 collection& getCallbacks() { return mCallbacks; }
00092
00093 private:
00094 collection mCallbacks;
00095 };
00096
00097 }