00001
00002 #ifndef header_signal_v5
00003 #define header_signal_v5
00004
00005 #ifdef WIN32
00006 #pragma warning ( disable : 4786 )
00007 #endif
00008
00009 #include "slot_v5.h"
00010 #include <list>
00011
00012 template <class PARAM1, class PARAM2, class PARAM3, class PARAM4, class PARAM5>
00013 class CL_Signal_v5
00014 {
00015 public:
00016 typedef CL_Slot_v5<PARAM1, PARAM2, PARAM3, PARAM4, PARAM5> *Slot;
00017 typedef std::list<Slot>::iterator SlotIterator;
00018
00019
00020 public:
00021 CL_Signal_v5()
00022 {
00023 }
00024
00025 ~CL_Signal_v5()
00026 {
00027 for (SlotIterator slot_it = slots.begin(); slot_it != slots.end(); slot_it++)
00028 {
00029 Slot slot = *slot_it;
00030 slot->release_ref();
00031 }
00032 }
00033
00034
00035 public:
00036 void operator() (PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5)
00037 {
00038 call(param1, param2, param3, param4, param5);
00039 }
00040
00041 void call(PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5)
00042 {
00043 std::list<SlotIterator> remove_slots;
00044
00045
00046 for (SlotIterator slot_it = slots.begin(); slot_it != slots.end(); slot_it++)
00047 {
00048 Slot slot = *slot_it;
00049
00050
00051
00052 if (slot->get_ref() == 1)
00053 {
00054 remove_slots.push_back(slot_it);
00055 continue;
00056 }
00057
00058 slot->call(param1, param2, param3, param4, param5);
00059 }
00060
00061
00062 std::list<SlotIterator>::iterator remove_it;
00063 for (remove_it = remove_slots.begin(); remove_it != remove_slots.end(); remove_it++)
00064 {
00065 Slot slot = **remove_it;
00066 slot->release_ref();
00067 slots.erase(*remove_it);
00068 }
00069 }
00070
00071 CL_Slot connect(Slot slot)
00072 {
00073 slot->add_ref();
00074 slots.push_back(slot);
00075 return CL_Slot(slot);
00076 }
00077
00078 void disconnect(CL_Slot &disconnect_slot)
00079 {
00080 for (SlotIterator slot_it = slots.begin(); slot_it != slots.end();)
00081 {
00082 Slot slot = *slot_it;
00083 if (disconnect_slot.impl == slot)
00084 {
00085 slot->release_ref();
00086 slot_it = slots.erase(slot_it);
00087 }
00088 else
00089 slot_it++;
00090 }
00091 }
00092
00093
00094 private:
00095 std::list<Slot> slots;
00096 };
00097
00098 #endif