EventLink.h

См. документацию.
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

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3