SynchroRefHandleFn.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_SYNCHROREFHANDLEFN_H
00015 #define CNTM_SYNCHROREFHANDLEFN_H
00016 #include <Cntm/RefUtils/Internal/SynchroRefHandleRefImplementation.h>
00017 #include <Cntm/RefUtils/Internal/BasicRefHandle.h>
00018 #include <Cntm/Synchro/SynchroObject.h>
00019 
00020 namespace Cntm
00021 {       
00022 
00023         /**
00024          * Механизм хэндлов предназначен для автоматизации вызова определенного метода объекта при уничтожении последнего хэндла, связанного с объектом.
00025          * 
00026          * Отличием данного класса от SynchroRefHandle является то, что задается не метод, а функция, принимающая ссылочный указатель на класс в качестве параметра.
00027          * 
00028          * Данный класс является шаблоном, первым параметром которого является тип объекта, а вторым - указатель на функцию, которую следует вызвать. Функция должна иметь сигнатуру void(RefPtr<T>). При вызове данной функции гарантируется, что переданный указатель никогда не будет содержать NULL значения.
00029          * 
00030          * Указанный в шаблоне метод может вызываться многократно. Это происходит, если после уничтожения всех хэндлов, связанных с объектом и вызова указанного метода, вновь будут созданы хэндлы, связанные с объектом.
00031          * 
00032          * Отличием данного класса от RefHandleFn является то, что гарантируется синхронизированный отложенный вызов указанного в шаблоне метода. Это приводит к тому, что объект, с которым связан хэндл, может быть только синхрообъектом.
00033          * 
00034          * Особенность вызова указанной в шаблоне функции. Если после того, как будет уничтожен последний хэндл, связанный с объектом, но до выполнения функции (она вызывается отложенно) создать новый хэндл, связанный с объектом, внутри синхропространства, к которому принадлежит объект, то гарантируется, что вызов функции будет отменен.
00035          * 
00036          * Пример:
00037          * \code
00038          * class Class1: public SynchroRefBase
00039          * {
00040          * private:
00041          *      static void AutoClose(RefPtr<Class1> p) {...}
00042          * public:
00043          *      typedef RefPtr<Class1> Ptr;
00044          *      typedef SynchroRefHandleFn<Class1, &Class1::AutoClose> Handle;
00045          * };
00046          * 
00047          * int main(int argc, char **argv)
00048          * {
00049          *      Cntm::QTMainSynchroSpace::Application a(argc, argv);
00050          * 
00051          *      mw = new Form1();
00052          *      mw->setCaption( "Form1" );
00053          *      mw->show();
00054          *      a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
00055          *      
00056          *      Class1::Ptr p(new Class1);
00057          * 
00058          *      if (Какое-то условие)
00059          *      {
00060          *              Class1::Handle h1 = p;
00061          *              Какието-действия с объектом p.
00062          *      } // Гарантируется вызов метода Close() для объекта p после уничтожения хэндла, связанного с ним.
00063          *      a.exec();
00064          * }
00065          * \endcode
00066          * 
00067          * Класс обеспечивает многопоточность.
00068          * @author Овсеевич Р.
00069          * \ingroup RefUtils
00070          */
00071         template < typename T, void (*FinalizeP)(RefPtr < T > )>
00072         class SynchroRefHandleFn: public SpecUtils::BasicRefHandle < T, SpecUtils::SynchroRefHandleRefImplementation >
00073         {
00074         public:
00075         
00076                 /**
00077                  * Конструктор по умолчанию. Создает хэндл, не связанный ни с каким объектом. 
00078                  */
00079                 SynchroRefHandleFn(): 
00080                         SpecUtils::BasicRefHandle<T, SpecUtils::SynchroRefHandleRefImplementation>(RefPtr<T>::Null(), FinalizeP)
00081                 {
00082                         CheckTypeCast<SynchroObject*>((T*)NULL);
00083                 }
00084                 
00085                 /**
00086                  * Конструктор. Создает хэндл, связанный с указанным объектом. 
00087                  */
00088                 SynchroRefHandleFn(RefPtr<T> Object): 
00089                         SpecUtils::BasicRefHandle<T, SpecUtils::SynchroRefHandleRefImplementation>(Object, FinalizeP)
00090                 {
00091                         CheckTypeCast<SynchroObject*>((T*)NULL);
00092                 }
00093                 
00094                 /**
00095                  * Связывает хэндл с новым объектом. 
00096                  */
00097                 SynchroRefHandleFn < T, FinalizeP > & operator = (RefPtr<T> Object)
00098                 {
00099                         Assign(Object);
00100                         return *this;
00101                 }
00102                 
00103                 /**
00104                  * Связывает хэндл с новым объектом. 
00105                  */
00106                 void Assign(RefPtr<T> Object)
00107                 {
00108                         SpecUtils::BasicRefHandle<T, SpecUtils::SynchroRefHandleRefImplementation>::Assign(Object, FinalizeP);
00109                 }
00110         
00111                 /**
00112                  * Делает хэндл не связанным. 
00113                  */
00114                 void Unassign()
00115                 {
00116                         Assign(RefPtr<T>::Null());
00117                 }
00118                 
00119         private:
00120         
00121                 /**
00122                  * Вызывает указанный метод объекта. 
00123                  */
00124                 static void Finalize(RefPtr<T> HandledObject) { (HandledObject.Pointer()->*FinalizeP)(); }
00125         };
00126 
00127 }
00128 
00129 #endif //CNTM_SYNCHROREFHANDLEFN_H

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