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
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |