286 #ifdef CGU_USE_SCHED_YIELD
293 #include <unordered_set>
295 #include <functional>
338 std::unordered_set<Callback::SafeFunctor> disconnect_set;
458 template <
class... FreeArgs>
461 #ifndef DOXYGEN_PARSING
466 Callback::FunctorArg<FreeArgs...> f1;
470 f1(f1_), f2(f2_), blocked(false) {}
474 std::list<ListItem> emission_list;
477 void tracking_disconnect(
const Callback::FunctorArg<FreeArgs...>&);
607 template <
class... FreeArgs>
620 struct DisconnectReleaserItem {
621 static void exec(
const ListItem& l) {(l.f2)();}
623 std::for_each(emission_list.begin(), emission_list.end(),
627 template <
class... FreeArgs>
659 std::list<ListItem> local_list = emission_list;
666 typename std::list<ListItem>::const_iterator iter;
667 for (iter = local_list.begin(); iter != local_list.end(); ++iter) {
668 if (!iter->blocked) iter->f1(args...);
672 template <
class... FreeArgs>
674 if (emission_list.empty())
return false;
679 template <
class... FreeArgs>
685 template <
class... FreeArgs>
698 emission_list.emplace_back(f1, f2);
707 template <
class... FreeArgs>
711 auto iter = emission_list.begin();
724 iter = std::find_if(iter, emission_list.end(),
725 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
726 if (iter != emission_list.end()) {
731 iter = emission_list.erase(iter);
740 template <
class... FreeArgs>
742 auto iter = emission_list.begin();
755 iter = std::find_if(iter, emission_list.end(),
756 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
757 if (iter != emission_list.end()) {
759 iter = emission_list.erase(iter);
765 template <
class... FreeArgs>
769 auto iter = emission_list.begin();
782 iter = std::find_if(iter, emission_list.end(),
783 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
784 if (iter != emission_list.end()) {
785 iter->blocked =
true;
792 template <
class... FreeArgs>
796 auto iter = emission_list.begin();
809 iter = std::find_if(iter, emission_list.end(),
810 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
811 if (iter != emission_list.end()) {
812 iter->blocked =
false;
869 template <
class... FreeArgs>
872 #ifndef DOXYGEN_PARSING
881 f1(f1_), f2(f2_), blocked(false) {}
885 std::list<ListItem> emission_list;
886 mutable Thread::Mutex mutex;
889 void tracking_disconnect(
const Callback::SafeFunctorArg<FreeArgs...>&);
1034 template <
class... FreeArgs>
1041 while (!emission_list.empty()) {
1042 auto iter = emission_list.begin();
1045 (iter->f2)(&result);
1048 emission_list.erase(iter);
1053 #ifdef CGU_USE_SCHED_YIELD
1063 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>
1170 emission_list.splice(emission_list.end(), std::move(tmp));
1174 template <
class... FreeArgs>
1192 std::list<ListItem> tmp{ListItem{f1, f2}};
1194 emission_list.splice(emission_list.end(), std::move(tmp));
1203 template <
class... FreeArgs>
1208 auto iter = emission_list.begin();
1221 iter = std::find_if(iter, emission_list.end(),
1222 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1223 if (iter != emission_list.end()) {
1226 (iter->f2)(&result);
1229 iter = emission_list.erase(iter);
1234 #ifdef CGU_USE_SCHED_YIELD
1242 iter = emission_list.begin();
1252 template <
class... FreeArgs>
1255 auto iter = emission_list.begin();
1264 static bool pred(
const ListItem& p,
const Callback::SafeFunctorArg<FreeArgs...>& f) {
1268 iter = std::find_if(iter, emission_list.end(),
1269 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1270 if (iter != emission_list.end()) {
1272 iter = emission_list.erase(iter);
1278 template <
class... FreeArgs>
1283 auto iter = emission_list.begin();
1296 iter = std::find_if(iter, emission_list.end(),
1297 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1298 if (iter != emission_list.end()) {
1299 iter->blocked =
true;
1306 template <
class... FreeArgs>
1311 auto iter = emission_list.begin();
1324 iter = std::find_if(iter, emission_list.end(),
1325 std::bind(Pred::pred, std::placeholders::_1, std::ref(arg)));
1326 if (iter != emission_list.end()) {
1327 iter->blocked =
false;