304 #ifdef CGU_USE_SCHED_YIELD
311 #include <unordered_set>
313 #include <functional>
314 #include <type_traits>
356 std::unordered_set<Callback::SafeFunctor> disconnect_set;
493 template <
class... FreeArgs>
496 #ifndef DOXYGEN_PARSING
501 Callback::FunctorArg<FreeArgs...> f1;
505 f1(f1_), f2(f2_), blocked(false) {}
509 std::list<ListItem> emission_list;
512 void tracking_disconnect(
const Callback::FunctorArg<FreeArgs...>&);
603 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<F>::type,
606 return connect(Callback::lambda<FreeArgs...>(std::forward<F>(f)));
634 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<F>::type,
637 return connect(Callback::lambda<FreeArgs...>(std::forward<F>(f)), r);
702 template <
class... FreeArgs>
704 for(
const auto& l: emission_list) {l.f2();}
707 template <
class... FreeArgs>
739 std::list<ListItem> local_list = emission_list;
741 for (
const auto& l: local_list) {
742 if (!l.blocked) l.f1(args...);
746 template <
class... FreeArgs>
748 if (emission_list.empty())
return false;
753 template <
class... FreeArgs>
759 template <
class... FreeArgs>
772 emission_list.push_back(ListItem{f1, f2});
781 template <
class... FreeArgs>
785 auto iter = emission_list.begin();
787 iter = std::find_if(iter, emission_list.end(),
788 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
789 if (iter != emission_list.end()) {
794 iter = emission_list.erase(iter);
803 template <
class... FreeArgs>
805 auto iter = emission_list.begin();
807 iter = std::find_if(iter, emission_list.end(),
808 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
809 if (iter != emission_list.end()) {
811 iter = emission_list.erase(iter);
817 template <
class... FreeArgs>
821 auto iter = emission_list.begin();
823 iter = std::find_if(iter, emission_list.end(),
824 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
825 if (iter != emission_list.end()) {
826 iter->blocked =
true;
833 template <
class... FreeArgs>
837 auto iter = emission_list.begin();
839 iter = std::find_if(iter, emission_list.end(),
840 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
841 if (iter != emission_list.end()) {
842 iter->blocked =
false;
919 template <
class... FreeArgs>
922 #ifndef DOXYGEN_PARSING
931 f1(f1_), f2(f2_), blocked(false) {}
935 std::list<ListItem> emission_list;
936 mutable Thread::Mutex mutex;
939 void tracking_disconnect(
const Callback::SafeFunctorArg<FreeArgs...>&);
1036 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<F>::type,
1039 return connect(Callback::lambda<FreeArgs...>(std::forward<F>(f)));
1067 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<F>::type,
1070 return connect(Callback::lambda<FreeArgs...>(std::forward<F>(f)), r);
1144 template <
class... FreeArgs>
1151 while (!emission_list.empty()) {
1152 auto iter = emission_list.begin();
1155 (iter->f2)(&result);
1158 emission_list.erase(iter);
1163 #ifdef CGU_USE_SCHED_YIELD
1173 template <
class... FreeArgs>
1217 std::list<ListItem> local_list;
1220 local_list = emission_list;
1223 for (
const auto& l: local_list) {
1224 if (!l.blocked) l.f1(args...);
1228 template <
class... FreeArgs>
1231 std::list<ListItem> local_list;
1234 if (emission_list.empty())
return false;
1235 local_list = emission_list;
1238 for (
const auto& l: local_list) {
1239 if (!l.blocked) l.f1(args...);
1244 template <
class... FreeArgs>
1251 template <
class... FreeArgs>
1268 emission_list.push_back(ListItem{f1, f2});
1279 template <
class... FreeArgs>
1284 auto iter = emission_list.begin();
1287 iter = std::find_if(iter, emission_list.end(),
1288 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
1289 if (iter != emission_list.end()) {
1292 (iter->f2)(&result);
1295 iter = emission_list.erase(iter);
1300 #ifdef CGU_USE_SCHED_YIELD
1308 iter = emission_list.begin();
1318 template <
class... FreeArgs>
1321 auto iter = emission_list.begin();
1323 iter = std::find_if(iter, emission_list.end(),
1324 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
1325 if (iter != emission_list.end()) {
1327 iter = emission_list.erase(iter);
1333 template <
class... FreeArgs>
1338 auto iter = emission_list.begin();
1340 iter = std::find_if(iter, emission_list.end(),
1341 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
1342 if (iter != emission_list.end()) {
1343 iter->blocked =
true;
1350 template <
class... FreeArgs>
1355 auto iter = emission_list.begin();
1357 iter = std::find_if(iter, emission_list.end(),
1358 [&arg](
const ListItem& p) ->
bool {
return p.f1 == arg;});
1359 if (iter != emission_list.end()) {
1360 iter->blocked =
false;