#pragma once #include #include #include #ifdef emit #undef emit #endif namespace fc { template class signal { public: typedef int64_t connection_id_type; template connection_id_type connect( Functor&& f ) { auto c = new std::function( fc::forward(f) ); _handlers.push_back( c ); return reinterpret_cast(c); } #ifdef WIN32 template void emit( Arg&& arg ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(arg) ); } } template void operator()( Arg&& arg ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(arg) ); } } template void emit( Arg&& arg, Arg2&& arg2 ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(arg), fc::forward(arg2) ); } } template void operator()( Arg&& arg, Arg2&& arg2 ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(arg), fc::forward(arg2) ); } } template void emit( Arg&& arg, Arg2&& arg2, Arg3&& arg3 ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(arg), fc::forward(arg2), fc::forward(arg3) ); } } template void operator()( Arg&& arg, Arg2&& arg2, Arg3&& arg3 ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(arg), fc::forward(arg2), fc::forward(arg3) ); } } #else template void emit( Args&&... args ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(args)... ); } } template void operator()( Args&&... args ) { for( size_t i = 0; i < _handlers.size(); ++i ) { (*_handlers[i])( fc::forward(args)... ); } } #endif void disconnect( connection_id_type cid ) { auto itr = _handlers.begin(); while( itr != _handlers.end() ) { if( reinterpret_cast(*itr) == cid ) { delete *itr; _handlers.erase(itr); } ++itr; } } signal() { _handlers.reserve(4); } ~signal() { for( auto itr = _handlers.begin(); itr != _handlers.end(); ++itr ) { delete *itr; } _handlers.clear(); } private: fc::vector< std::function* > _handlers; }; }