RefHandleFn.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_REFHANDLEFN_H
00015 #define CNTM_REFHANDLEFN_H
00016 #include <Cntm/RefUtils/Internal/RefHandleRefImplementation.h>
00017 #include <Cntm/RefUtils/Internal/BasicRefHandle.h>
00018 
00019 namespace Cntm
00020 {       
00021 
00022         /**
00023          * Механизм хэндлов предназначен для автоматизации вызова определенного метода объекта при уничтожении последнего хэндла, связанного с объектом.
00024          * 
00025          * Отличием данного класса от RefHandle является то, что задается не метод, а функция, принимающая ссылочный указатель на класс в качестве параметра.
00026          * 
00027          * Данный класс является шаблоном, первым параметром которого является тип объекта, а вторым - указатель на функцию, которую следует вызвать. Функция должна иметь сигнатуру void(RefPtr<T>). При вызове данной функции гарантируется, что переданный указатель никогда не будет содержать NULL значения.
00028          * 
00029          * Указанный в шаблоне метод может вызываться многократно. Это происходит, если после уничтожения всех хэндлов, связанных с объектом и вызова указанного метода, вновь будут созданы хэндлы, связанные с объектом.
00030          * 
00031          * Пример использования приведен в SynchroRefBaseFn.
00032          * 
00033          * Класс обеспечивает многопоточность.
00034          * @author Овсеевич Р.
00035          * \ingroup RefUtils
00036          */
00037         template < typename T, void (*FinalizeP)(RefPtr < T > )>
00038         class RefHandleFn: public SpecUtils::BasicRefHandle < T, SpecUtils::RefHandleRefImplementation >
00039         {
00040         public:
00041         
00042                 /**
00043                  * Конструктор по умолчанию. Создает хэндл, не связанный ни с каким объектом. 
00044                  */
00045                 RefHandleFn(): 
00046                         SpecUtils::BasicRefHandle<T, SpecUtils::RefHandleRefImplementation>(RefPtr<T>::Null(), FinalizeP) {}
00047                 
00048                 /**
00049                  * Конструктор. Создает хэндл, связанный с указанным объектом. 
00050                  */
00051                 RefHandleFn(RefPtr<T> Object): 
00052                         SpecUtils::BasicRefHandle<T, SpecUtils::RefHandleRefImplementation>(Object, FinalizeP) {}
00053                 
00054                 /**
00055                  * Связывает хэндл с новым объектом. 
00056                  */
00057                 RefHandleFn < T, FinalizeP > & operator = (RefPtr<T> Object)
00058                 {
00059                         Assign(Object);
00060                         return *this;
00061                 }
00062                 
00063                 /**
00064                  * Связывает хэндл с новым объектом. 
00065                  */
00066                 void Assign(RefPtr<T> Object)
00067                 {
00068                         SpecUtils::BasicRefHandle<T, SpecUtils::RefHandleRefImplementation>::Assign(Object, FinalizeP);
00069                 }
00070         
00071                 /**
00072                  * Делает хэндл не связанным. 
00073                  */
00074                 void Unassign()
00075                 {
00076                         Assign(RefPtr<T>::Null());
00077                 }
00078         };
00079 
00080 }
00081 
00082 #endif //CNTM_REFHANDLEFN_H

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