Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

signal_v5.h

Go to the documentation of this file.
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 // Construction:
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 // Operations:
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                 // call slots connected to signal:
00046                 for (SlotIterator slot_it = slots.begin(); slot_it != slots.end(); slot_it++)
00047                 {
00048                         Slot slot = *slot_it;
00049 
00050                         // skip slot if it has no more references left in application.
00051                         // (make it pending for removal)
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                 // remove all slots no longer connected to any CL_Slot.
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 // Implementation:
00094 private:
00095         std::list<Slot> slots;
00096 };
00097 
00098 #endif

Generated at Wed Apr 4 19:54:03 2001 for ClanLib by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001