298 #ifdef CGU_USE_SCHED_YIELD
305 #include <unordered_set>
307 #include <functional>
349 std::unordered_set<Callback::SafeFunctor> disconnect_set;
475 template <
class... FreeArgs>
478 #ifndef DOXYGEN_PARSING
483 Callback::FunctorArg<FreeArgs...> f1;
487 f1(f1_), f2(f2_), blocked(false) {}
491 std::list<ListItem> emission_list;
494 void tracking_disconnect(
const Callback::FunctorArg<FreeArgs...>&);
624 template <
class... FreeArgs>
637 struct DisconnectReleaserItem {
638 static void exec(
const ListItem& l) {(l.f2)();}
640 std::for_each(emission_list.begin(), emission_list.end(),
641 DisconnectReleaserItem::exec);
644 template <
class... FreeArgs>
676 std::list<ListItem> local_list = emission_list;
683 typename std::list<ListItem>::const_iterator iter;
684 for (iter = local_list.begin(); iter != local_list.end(); ++iter) {
685 if (!iter->blocked) iter->f1(args...);
689 template <
class... FreeArgs>
691 if (emission_list.empty())
return false;
696 template <
class... FreeArgs>
702 template <
class... FreeArgs>
715 emission_list.push_back(ListItem{f1, f2});
724 template <
class... FreeArgs>
728 auto iter = emission_list.begin();
741 iter = std::find_if(iter, emission_list.end(),
742 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
743 if (iter != emission_list.end()) {
748 iter = emission_list.erase(iter);
757 template <
class... FreeArgs>
759 auto iter = emission_list.begin();
772 iter = std::find_if(iter, emission_list.end(),
773 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
774 if (iter != emission_list.end()) {
776 iter = emission_list.erase(iter);
782 template <
class... FreeArgs>
786 auto iter = emission_list.begin();
799 iter = std::find_if(iter, emission_list.end(),
800 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
801 if (iter != emission_list.end()) {
802 iter->blocked =
true;
809 template <
class... FreeArgs>
813 auto iter = emission_list.begin();
826 iter = std::find_if(iter, emission_list.end(),
827 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
828 if (iter != emission_list.end()) {
829 iter->blocked =
false;
892 template <
class... FreeArgs>
895 #ifndef DOXYGEN_PARSING
904 f1(f1_), f2(f2_), blocked(false) {}
908 std::list<ListItem> emission_list;
909 mutable Thread::Mutex mutex;
912 void tracking_disconnect(
const Callback::SafeFunctorArg<FreeArgs...>&);
1057 template <
class... FreeArgs>
1064 while (!emission_list.empty()) {
1065 auto iter = emission_list.begin();
1068 (iter->f2)(&result);
1071 emission_list.erase(iter);
1076 #ifdef CGU_USE_SCHED_YIELD
1086 template <
class... FreeArgs>
1130 std::list<ListItem> local_list;
1133 local_list = emission_list;
1141 typename std::list<ListItem>::const_iterator iter;
1142 for (iter = local_list.begin(); iter != local_list.end(); ++iter) {
1143 if (!iter->blocked) iter->f1(args...);
1147 template <
class... FreeArgs>
1150 std::list<ListItem> local_list;
1153 if (emission_list.empty())
return false;
1154 local_list = emission_list;
1162 typename std::list<ListItem>::const_iterator iter;
1163 for (iter = local_list.begin(); iter != local_list.end(); ++iter) {
1164 if (!iter->blocked) iter->f1(args...);
1169 template <
class... FreeArgs>
1176 template <
class... FreeArgs>
1193 emission_list.push_back(ListItem{f1, f2});
1204 template <
class... FreeArgs>
1209 auto iter = emission_list.begin();
1222 iter = std::find_if(iter, emission_list.end(),
1223 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1224 if (iter != emission_list.end()) {
1227 (iter->f2)(&result);
1230 iter = emission_list.erase(iter);
1235 #ifdef CGU_USE_SCHED_YIELD
1243 iter = emission_list.begin();
1253 template <
class... FreeArgs>
1256 auto iter = emission_list.begin();
1265 static bool pred(
const ListItem& p,
const Callback::SafeFunctorArg<FreeArgs...>& f) {
1269 iter = std::find_if(iter, emission_list.end(),
1270 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1271 if (iter != emission_list.end()) {
1273 iter = emission_list.erase(iter);
1279 template <
class... FreeArgs>
1284 auto iter = emission_list.begin();
1297 iter = std::find_if(iter, emission_list.end(),
1298 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1299 if (iter != emission_list.end()) {
1300 iter->blocked =
true;
1307 template <
class... FreeArgs>
1312 auto iter = emission_list.begin();
1325 iter = std::find_if(iter, emission_list.end(),
1326 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1327 if (iter != emission_list.end()) {
1328 iter->blocked =
false;