//: Call void call(PARAM1 param1) { Signal_v1_Generic *data = impl; data->in_call = true; std::list<SlotIterator> remove_slots; try { data->in_call_remove_slots = &remove_slots; // call slots connected to signal: for (SlotIterator slot_it = data->slots.begin(); slot_it != data->slots.end(); slot_it++) { Slot slot = *slot_it; // skip slot if it has no more references left in application. // (make it pending for removal) if (slot->get_slot_ref() == 0 && slot->is_persistent() == false) { if (std::find(remove_slots.begin(), remove_slots.end(), slot_it)==remove_slots.end()) remove_slots.push_back(slot_it); } slot->call(param1); if (data->deleted) break; } } catch (...) { catch_final(data, remove_slots); throw; } catch_final(data, remove_slots); }
static void ConnectAction( const std::string & valuestr, const SignalMap & signalmap, Slot & slot) { typename SignalMap::const_iterator it = signalmap.find(valuestr); if (it != signalmap.end()) slot.connect(*it->second); else slot.call(valuestr); }