293 #ifdef CGU_USE_SCHED_YIELD
300 #include <unordered_set>
302 #include <functional>
312 template <
class... FreeArgs>
class EmitterArg;
344 std::unordered_set<Callback::SafeFunctor> disconnect_set;
470 template <
class... FreeArgs>
473 #ifndef DOXYGEN_PARSING
482 f1(f1_), f2(f2_), blocked(
false) {}
486 std::list<ListItem> emission_list;
619 template <
class... FreeArgs>
632 struct DisconnectReleaserItem {
633 static void exec(
const ListItem& l) {(l.f2)();}
635 std::for_each(emission_list.begin(), emission_list.end(),
636 DisconnectReleaserItem::exec);
639 template <
class... FreeArgs>
671 std::list<ListItem> local_list = emission_list;
678 typename std::list<ListItem>::const_iterator iter;
679 for (iter = local_list.begin(); iter != local_list.end(); ++iter) {
680 if (!iter->blocked) iter->f1(args...);
684 template <
class... FreeArgs>
686 if (emission_list.empty())
return false;
691 template <
class... FreeArgs>
697 template <
class... FreeArgs>
710 emission_list.push_back(ListItem{f1, f2});
719 template <
class... FreeArgs>
723 auto iter = emission_list.begin();
736 iter = std::find_if(iter, emission_list.end(),
737 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
738 if (iter != emission_list.end()) {
743 iter = emission_list.erase(iter);
752 template <
class... FreeArgs>
754 auto iter = emission_list.begin();
767 iter = std::find_if(iter, emission_list.end(),
768 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
769 if (iter != emission_list.end()) {
771 iter = emission_list.erase(iter);
777 template <
class... FreeArgs>
781 auto iter = emission_list.begin();
794 iter = std::find_if(iter, emission_list.end(),
795 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
796 if (iter != emission_list.end()) {
797 iter->blocked =
true;
804 template <
class... FreeArgs>
808 auto iter = emission_list.begin();
821 iter = std::find_if(iter, emission_list.end(),
822 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
823 if (iter != emission_list.end()) {
824 iter->blocked =
false;
887 template <
class... FreeArgs>
890 #ifndef DOXYGEN_PARSING
899 f1(f1_), f2(f2_), blocked(
false) {}
903 std::list<ListItem> emission_list;
1052 template <
class... FreeArgs>
1059 while (!emission_list.empty()) {
1060 auto iter = emission_list.begin();
1063 (iter->f2)(&result);
1066 emission_list.erase(iter);
1071 #ifdef CGU_USE_SCHED_YIELD
1081 template <
class... FreeArgs>
1125 std::list<ListItem> local_list;
1128 local_list = emission_list;
1136 typename std::list<ListItem>::const_iterator iter;
1137 for (iter = local_list.begin(); iter != local_list.end(); ++iter) {
1138 if (!iter->blocked) iter->f1(args...);
1142 template <
class... FreeArgs>
1145 std::list<ListItem> local_list;
1148 if (emission_list.empty())
return false;
1149 local_list = emission_list;
1157 typename std::list<ListItem>::const_iterator iter;
1158 for (iter = local_list.begin(); iter != local_list.end(); ++iter) {
1159 if (!iter->blocked) iter->f1(args...);
1164 template <
class... FreeArgs>
1171 template <
class... FreeArgs>
1188 emission_list.push_back(ListItem{f1, f2});
1199 template <
class... FreeArgs>
1204 auto iter = emission_list.begin();
1217 iter = std::find_if(iter, emission_list.end(),
1218 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1219 if (iter != emission_list.end()) {
1222 (iter->f2)(&result);
1225 iter = emission_list.erase(iter);
1230 #ifdef CGU_USE_SCHED_YIELD
1238 iter = emission_list.begin();
1248 template <
class... FreeArgs>
1251 auto iter = emission_list.begin();
1260 static bool pred(
const ListItem& p,
const Callback::SafeFunctorArg<FreeArgs...>& f) {
1264 iter = std::find_if(iter, emission_list.end(),
1265 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1266 if (iter != emission_list.end()) {
1268 iter = emission_list.erase(iter);
1274 template <
class... FreeArgs>
1279 auto iter = emission_list.begin();
1292 iter = std::find_if(iter, emission_list.end(),
1293 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1294 if (iter != emission_list.end()) {
1295 iter->blocked =
true;
1302 template <
class... FreeArgs>
1307 auto iter = emission_list.begin();
1320 iter = std::find_if(iter, emission_list.end(),
1321 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1322 if (iter != emission_list.end()) {
1323 iter->blocked =
false;