#pragma once #if defined(_MSC_VER) && _MSC_VER >= 1400 #pragma warning(push) #pragma warning(disable:4996) #endif #include #if defined(_MSC_VER) && _MSC_VER >= 1400 #pragma warning(pop) #endif #include #include namespace fc { #if !defined(BOOST_NO_TEMPLATE_ALIASES) template using signal = boost::signals2::signal; using scoped_connection = boost::signals2::scoped_connection; #else /** Workaround for missing Template Aliases feature in the VS 2012. \warning Class defined below cannot have defined constructor (even base class has it) since it is impossible to reference directly template class arguments outside this class. This code will work until someone will use non-default constructor as it is defined in boost::signals2::signal. */ template class signal : public boost::signals2::signal { public: }; #endif template inline T wait( boost::signals2::signal& sig, const microseconds& timeout_us=microseconds::maximum() ) { typename promise::ptr p(new promise("fc::signal::wait")); boost::signals2::scoped_connection c( sig.connect( [=]( T t ) { p->set_value(t); } )); return p->wait( timeout_us ); } inline void wait( boost::signals2::signal& sig, const microseconds& timeout_us=microseconds::maximum() ) { promise::ptr p(new promise("fc::signal::wait")); boost::signals2::scoped_connection c( sig.connect( [=]() { p->set_value(); } )); p->wait( timeout_us ); } }