RefHandle.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_REFHANDLE_H
00015 #define CNTM_REFHANDLE_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          * Данный класс является шаблоном, первым параметром которого является тип объекта, а вторым - указатель на метод объекта, который следует вызвать. Метод должен иметь сигнатуру void(void), т.е. ничего не принимать и не возвращать.
00026          * 
00027          * Указанный в шаблоне метод может вызываться многократно. Это происходит, если после уничтожения всех хэндлов, связанных с объектом и вызова указанного метода, вновь будут созданы хэндлы, связанные с объектом.
00028          * 
00029          * Пример использования приведен в SynchroRefBase.
00030          * 
00031          * Класс обеспечивает многопоточность.
00032          * \ingroup RefUtils
00033          * @author Овсеевич Р. 
00034          */
00035         template < typename T, void (T::*FinalizeP)()>
00036         class RefHandle: public SpecUtils::BasicRefHandle < T, SpecUtils::RefHandleRefImplementation >
00037         {
00038         public:
00039         
00040                 /**
00041                  * Конструктор по умолчанию. Создает хэндл, не связанный ни с каким объектом. 
00042                  */
00043                 RefHandle(): 
00044                         SpecUtils::BasicRefHandle<T, SpecUtils::RefHandleRefImplementation>(RefPtr<T>::Null(), &RefHandle::Finalize) {}
00045                 
00046                 /**
00047                  * Конструктор. Создает хэндл, связанный с указанным объектом. 
00048                  */
00049                 RefHandle(RefPtr<T> Object): 
00050                         SpecUtils::BasicRefHandle<T, SpecUtils::RefHandleRefImplementation>(Object, &RefHandle::Finalize) {}
00051                 
00052                 /**
00053                  * Связывает хэндл с новым объектом. 
00054                  */
00055                 RefHandle < T, FinalizeP > & operator = (RefPtr<T> Object)
00056                 {
00057                         Assign(Object);
00058                         return *this;
00059                 }
00060                 
00061                 /**
00062                  * Связывает хэндл с новым объектом. 
00063                  */
00064                 void Assign(RefPtr<T> Object)
00065                 {
00066                         SpecUtils::BasicRefHandle<T, SpecUtils::RefHandleRefImplementation>::
00067 				Assign(Object, &RefHandle::Finalize);
00068                 }
00069         
00070                 /**
00071                  * Делает хэндл не связанным. 
00072                  */
00073                 void Unassign()
00074                 {
00075                         Assign(RefPtr<T>::Null());
00076                 }
00077                 
00078         private:
00079         
00080                 /**
00081                  * Вызывает указанный метод объекта. 
00082                  */
00083                 static void Finalize(RefPtr<T> HandledObject) { (HandledObject.Pointer()->*FinalizeP)(); }
00084         };
00085 
00086 }
00087 
00088 #endif //CNTM_REFHANDLE_H

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