00001 /* 00002 * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события 00003 * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru 00004 * _______________________________________________________________________________ 00005 * Разрешено свободное использование, копирование, распространение, изменение 00006 * (изменение сведений об авторских правах запрещено). Запрещена продажа и 00007 * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об 00008 * авторских правах на программу (или сведениях о программе, об авторах, 00009 * использованных средствах разработки и т.д.) должна быть указана информация 00010 * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е. 00011 * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора. 00012 */ 00013 00014 #ifndef CNTM_EVENTLINK_H 00015 #define CNTM_EVENTLINK_H 00016 #include <boost/utility.hpp> 00017 #include <Cntm/Utils/SignatureInfo.h> 00018 #include <Cntm/RefCount/RefPtr.h> 00019 #include <Cntm/Synchro/SynchroSpace.h> 00020 #include <Cntm/Events/DeferEvent.h> 00021 #include <Cntm/Events/DirectEvent.h> 00022 00023 namespace Cntm 00024 { 00025 00026 /** 00027 * Класс связи между событием и обработчиком. В качестве события используется либо отложенное либо прямое событие (см. классы Cntm::DeferEvent и Cntm::DirectEvent). 00028 * 00029 * Данный класс имеет конструктор по умолчанию, создающий пустую связь и конструкторы инициализации, создающие связь указанного события с указанным обработчиком. В деструкторе класса происходит разрушение связи, если она была установлена. Методы Attach() разрушают старую связь (если она была) и инициализируют новую. Метод Detach() разрушает текущую связь. Данный класс не имеет конструктора и оператора копирования. 00030 * 00031 * Данный класс является общим для отложенных и прямых событий, и не является шаблоном, т.е. не зависит от сигнатуры события. 00032 * 00033 * Более подробное описание использование класса приведено в описании классов событий (см. классы Cntm::DeferEvent и Cntm::DirectEvent). 00034 * 00035 * Данный класс обеспечивает многопоточность. 00036 * @author Овсеевич Р. 00037 * \ingroup Events 00038 */ 00039 class EventLink: boost::noncopyable 00040 { 00041 public: 00042 00043 /** 00044 * Конструктор по умолчанию. Создает пустую связь. 00045 */ 00046 EventLink() {} 00047 00048 /** 00049 * Конструктор инициализации связи. В качестве параметров указывается объект отложенного события, ссылочный указатель на объект обработчика, указатель на метод обработчика, ссылочный указатель на синхропространство (опционально). 00050 * 00051 * Исключения: 00052 * Cntm::NullArgException - если указатель на объект обработчика равен NULL; 00053 * Cntm::IllegalStateException - если не удалось определить синхропространство в котором будет вызван обработчик (явно не задано и не создано главное синхропространство). 00054 * @param Event - ссылка на объект отложенного события, т.е. должен передаваться объект события, с которым происходит связывание. 00055 * @param Object - ссылочный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00056 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00057 * @param Space (опциональный) - синхропространство, в котором будет выполняться обработчик. Если оно явно не указано, то определяется следующим образом. Если объект обработчика является синхрообъектом (см. класс Cntm::SynchroObject), то синхропространство берется из свойства Space() этого объекта. В противном случае используется главное синхропространство (см. Cntm::SynchroSpace::Main()). Если главного синхропространства нет (Cntm::SynchroSpace::Main() возвращает NULL), то генерируется исключение Cntm::IllegalStateException. 00058 */ 00059 template < typename SignatureT, typename ClassT > 00060 EventLink(DeferEvent < SignatureT > & Event, 00061 RefPtr < ClassT > Object, 00062 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method, 00063 const SynchroSpace::Ptr& Space = SynchroSpace::Ptr()): 00064 handler(Event.GetHandlersRegister(Object.Pointer(), Space), 00065 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))) {} 00066 00067 /** 00068 * Конструктор инициализации связи. В качестве параметров указывается объект отложенного события, обычный указатель на объект обработчика, указатель на метод обработчика, ссылочный указатель на синхропространство (опционально). 00069 * 00070 * Исключения: 00071 * Cntm::NullArgException - если указатель на объект обработчика равен NULL; 00072 * Cntm::IllegalStateException - если не удалось определить синхропространство в котором будет вызван обработчик (явно не задано и не создано главное синхропространство). 00073 * @param Event - ссылка на объект отложенного события, т.е. должен передаваться объект события, с которым происходит связывание. 00074 * @param Object - обычный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00075 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00076 * @param Space (опциональный) - синхропространство, в котором будет выполняться обработчик. Если оно явно не указано, то определяется следующим образом. Если объект обработчика является синхрообъектом (см. класс Cntm::SynchroObject), то синхропространство берется из свойства Space() этого объекта. В противном случае используется главное синхропространство (см. Cntm::SynchroSpace::Main()). Если главного синхропространства нет (Cntm::SynchroSpace::Main() возвращает NULL), то генерируется исключение Cntm::IllegalStateException. 00077 */ 00078 template < typename SignatureT, typename ClassT > 00079 EventLink(DeferEvent < SignatureT > & Event, 00080 ClassT* Object, 00081 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method, 00082 const SynchroSpace::Ptr& Space = SynchroSpace::Ptr()): 00083 handler(Event.GetHandlersRegister(Object, Space), 00084 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))) {} 00085 00086 /** 00087 * Конструктор инициализации связи. В качестве параметров указывается объект прямого события, ссылочный указатель на объект обработчика, указатель на метод обработчика. 00088 * 00089 * Исключение Cntm::NullArgException - если указатель на объект обработчика равен NULL. 00090 * @param Event - ссылка на объект прямого события, т.е. должен передаваться объект события, с которым происходит связывание. 00091 * @param Object - ссылочный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00092 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00093 */ 00094 template < typename SignatureT, typename ClassT > 00095 EventLink(DirectEvent < SignatureT > & Event, 00096 RefPtr < ClassT > Object, 00097 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method): 00098 handler(Event.GetHandlersRegister(Object.Pointer()), 00099 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))) {} 00100 00101 /** 00102 * Конструктор инициализации связи. В качестве параметров указывается объект прямого события, обычный указатель на объект обработчика, указатель на метод обработчика. 00103 * 00104 * Исключения: 00105 * Cntm::NullArgException - если указатель на объект обработчика равен NULL; 00106 * @param Event - ссылка на объект прямого события, т.е. должен передаваться объект события, с которым происходит связывание. 00107 * @param Object - обычный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00108 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00109 */ 00110 template < typename SignatureT, typename ClassT > 00111 EventLink(DirectEvent < SignatureT > & Event, 00112 ClassT* Object, 00113 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method): 00114 handler(Event.GetHandlersRegister(Object), 00115 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))) {} 00116 00117 /** 00118 * Установка нового значения в объект связи, при этом старая связь разрушается. В качестве параметров указывается объект отложенного события, ссылочный указатель на объект обработчика, указатель на метод обработчика, ссылочный указатель на синхропространство (опционально). 00119 * 00120 * Исключения: 00121 * Cntm::NullArgException - если указатель на объект обработчика равен NULL; 00122 * Cntm::IllegalStateException - если не удалось определить синхропространство в котором будет вызван обработчик (явно не задано и не создано главное синхропространство). 00123 * @param Event - ссылка на объект отложенного события, т.е. должен передаваться объект события, с которым происходит связывание. 00124 * @param Object - ссылочный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00125 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00126 * @param Space (опциональный) - синхропространство, в котором будет выполняться обработчик. Если оно явно не указано, то определяется следующим образом. Если объект обработчика является синхрообъектом (см. класс Cntm::SynchroObject), то синхропространство берется из свойства Space() этого объекта. В противном случае используется главное синхропространство (см. Cntm::SynchroSpace::Main()). Если главного синхропространства нет (Cntm::SynchroSpace::Main() возвращает NULL), то генерируется исключение Cntm::IllegalStateException. 00127 */ 00128 template < typename SignatureT, typename ClassT > 00129 void Attach(DeferEvent < SignatureT > & Event, 00130 RefPtr < ClassT > Object, 00131 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method, 00132 const SynchroSpace::Ptr& Space = SynchroSpace::Ptr()) 00133 { 00134 handler.Set(Event.GetHandlersRegister(Object.Pointer(), Space), 00135 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))); 00136 } 00137 00138 /** 00139 * Установка нового значения в объект связи, при этом старая связь разрушается. В качестве параметров указывается объект отложенного события, обычный указатель на объект обработчика, указатель на метод обработчика, ссылочный указатель на синхропространство (опционально). 00140 * 00141 * Исключения: 00142 * Cntm::NullArgException - если указатель на объект обработчика равен NULL; 00143 * Cntm::IllegalStateException - если не удалось определить синхропространство в котором будет вызван обработчик (явно не задано и не создано главное синхропространство). 00144 * @param Event - ссылка на объект отложенного события, т.е. должен передаваться объект события, с которым происходит связывание. 00145 * @param Object - обычный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00146 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00147 * @param Space (опциональный) - синхропространство, в котором будет выполняться обработчик. Если оно явно не указано, то определяется следующим образом. Если объект обработчика является синхрообъектом (см. класс Cntm::SynchroObject), то синхропространство берется из свойства Space() этого объекта. В противном случае используется главное синхропространство (см. Cntm::SynchroSpace::Main()). Если главного синхропространства нет (Cntm::SynchroSpace::Main() возвращает NULL), то генерируется исключение Cntm::IllegalStateException. 00148 */ 00149 template < typename SignatureT, typename ClassT > 00150 void Attach(DeferEvent < SignatureT > & Event, 00151 ClassT* Object, 00152 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method, 00153 const SynchroSpace::Ptr& Space = SynchroSpace::Ptr()) 00154 { 00155 handler.Set(Event.GetHandlersRegister(Object, Space), 00156 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))); 00157 } 00158 00159 /** 00160 * Установка нового значения в объект связи, при этом старая связь разрушается. В качестве параметров указывается объект прямого события, ссылочный указатель на объект обработчика, указатель на метод обработчика. 00161 * 00162 * Исключения: 00163 * Cntm::NullArgException - если указатель на объект обработчика равен NULL; 00164 * @param Event - ссылка на объект прямого события, т.е. должен передаваться объект события, с которым происходит связывание. 00165 * @param Object - ссылочный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00166 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00167 */ 00168 template < typename SignatureT, typename ClassT > 00169 void Attach(DirectEvent < SignatureT > & Event, 00170 RefPtr < ClassT > Object, 00171 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method) 00172 { 00173 handler.Set(Event.GetHandlersRegister(Object.Pointer()), 00174 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))); 00175 } 00176 00177 /** 00178 * Установка нового значения в объект связи, при этом старая связь разрушается. В качестве параметров указывается объект прямого события, обычный указатель на объект обработчика, указатель на метод обработчика. 00179 * 00180 * Исключения: 00181 * Cntm::NullArgException - если указатель на объект обработчика равен NULL; 00182 * @param Event - ссылка на объект прямого события, т.е. должен передаваться объект события, с которым происходит связывание. 00183 * @param Object - обычный указатель на объект, который будет обрабатывать событие. Если указатель равен NULL, то генерируется исключение Cntm::NullArgException. 00184 * @param Method - указатель на метод обработчика. Сигнатура метода должна полностью совпадать с сигнатурой события, в противном случае будет выдана ошибка компиляции. 00185 */ 00186 template < typename SignatureT, typename ClassT > 00187 void Attach(DirectEvent < SignatureT > & Event, 00188 ClassT* Object, 00189 typename SignatureInfo < SignatureT > ::template Method < ClassT > ::Pointer Method) 00190 { 00191 handler.Set(Event.GetHandlersRegister(Object), 00192 HandlerType(Object, reinterpret_cast<typename HandlerType::SignInfo::Method<ClassT>::Pointer>(Method))); 00193 } 00194 00195 /** 00196 * Разрушить текущую связь. После вызова объект содержит пустую связь. 00197 */ 00198 void Detach() { handler.Unassign(); } 00199 00200 private: 00201 00202 typedef SpecUtils::BasicEvent::HandlerType HandlerType; 00203 00204 /** 00205 * Эл-т перечня, содержащий информацию об обработчике события. 00206 */ 00207 SpecUtils::BasicEvent::HandlersRegisterEx::Item handler; 00208 }; 00209 00210 } 00211 00212 #endif //CNTM_EVENTLINK_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |