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