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_GENERICREFPTR_H 00015 #define CNTM_GENERICREFPTR_H 00016 #include <Cntm/RefCount/GenericPtr/BasicGenericRefPtr.h> 00017 00018 namespace Cntm 00019 { 00020 00021 /** 00022 * Обобщенные ссылочные указатели это нешаблонные, нетипизированные указатели (указатели на void*), обладающие способностью управлять подсчетом ссылок на указываемый объект. 00023 * 00024 * Их назначение - обеспечить подсчет ссылок на объекты, когда требуется уйти от шаблонов на типы классов этих объектов. Тип объекта указывается только при создании или присвоении обобщенному указателю значения из ссылочного указателя. В других операциях (копирования, сравнения, уничтожения) тип присвоенного объекта не указывается. 00025 * 00026 * Поведение обобщенного ссылочного указателя совпадает с поведением ссылочного указателя: в конструкторе происходит увеличение кол-ва ссылок на объект, в деструкторе - уменьшение, а при присвоении нового значения - увеличение ссылок на новое значение и уменьшение ссылок на старое. Если тип присвоенного объекта не поддерживает подсчет ссылок, то ни каких действий выполнено не будет. 00027 * 00028 * Пример: 00029 * \code 00030 * Class1::Ptr p1 = new Class1(1); // Создание объекта типа Class1, кол-во ссылок = 1 (объект 1). 00031 * Class1::Ptr p2 = new Class1(2)); // Создание объекта типа Class1, кол-во ссылок = 1 (объект 2). 00032 * ... 00033 * GenericRefPtr gp1 = p1; // Увеличение кол-ва ссылок на объект 1. 00034 * GenericRefPtr gp2 = p2; // Увеличение кол-ва ссылок на объект 2. 00035 * ... 00036 * GenericRefPtr gp = gp1; // Увеличение кол-ва ссылок на объект 1. 00037 * gp = gp2; // Увеличение кол-ва ссылок на объект 2 и уменьшение на объект 1. 00038 * ... 00039 * // В деструкторах p1 и gp1 кол-во ссылок на объект 1 уменьшается до 0. 00040 * // В деструкторах p2, gp2 и gp кол-во ссылок на объект 1 уменьшается до 0. 00041 * \endcode 00042 * 00043 * Данный класс наследует BasicGenericRefPtr, в котором определены основные операции над обобщенным ссылочным указателем. 00044 * 00045 * В пару с обобщенным ссылочным указателем имеется обобщенный не ссылочный указатель (нешаблонный указатель на void*) GenericNoRefPtr. Обеспечивается взаимная конвертация между классами GenericRefPtr и GenericNoRefPtr. 00046 * 00047 * Данный класс не обеспечивает полную многопоточность. Операция присвоения нового значения требует внешней синхронизации, при условии, что существует возможность того, что в момент присвоения источнику тоже может быть присвоено значение. 00048 * @author Овсеевич Р. 00049 * \ingroup RefCount 00050 */ 00051 class GenericRefPtr: public BasicGenericRefPtr 00052 { 00053 public: 00054 00055 /** 00056 * Конструктор по умолчанию. Инициализирует указатель NULL. Увеличивает кол-во ссылок на присваиваемый объект. 00057 */ 00058 GenericRefPtr(): BasicGenericRefPtr() 00059 { 00060 GenImpl()->InitRefPtr(PtrPointer()); 00061 } 00062 00063 /** 00064 * Конструктор инициализации из ссылочного указателя. Увеличивает кол-во ссылок на присваиваемый объект. 00065 */ 00066 template < typename T > 00067 GenericRefPtr(const RefPtr < T > & Src): BasicGenericRefPtr(Src) 00068 { 00069 GenImpl()->InitRefPtr(PtrPointer()); 00070 } 00071 00072 /** 00073 * Конструктор инициализации из обычного указателя. Увеличивает кол-во ссылок на присваиваемый объект. 00074 */ 00075 template < typename T > 00076 GenericRefPtr(T* Src): BasicGenericRefPtr(Src) 00077 { 00078 GenImpl()->InitRefPtr(PtrPointer()); 00079 } 00080 00081 /** 00082 * Конструктор копирования. Увеличивает кол-во ссылок на присваиваемый объект. 00083 */ 00084 GenericRefPtr(const BasicGenericRefPtr& Src): BasicGenericRefPtr(Src) 00085 { 00086 GenImpl()->InitRefPtr(PtrPointer()); 00087 } 00088 00089 /** 00090 * Конструктор копирования. Увеличивает кол-во ссылок на присваиваемый объект. 00091 */ 00092 GenericRefPtr(const GenericRefPtr& Src): BasicGenericRefPtr(Src) 00093 { 00094 GenImpl()->InitRefPtr(PtrPointer()); 00095 } 00096 00097 /** 00098 * Уменьшает кол-во ссылок на хранимый объект. 00099 */ 00100 ~GenericRefPtr() 00101 { 00102 GenImpl()->DeinitRefPtr(PtrPointer()); 00103 } 00104 00105 /** 00106 * Оператор присвоения ссылочного указателя. Увеличивает ссылки на новый объект и уменьшает на старый. 00107 */ 00108 template < typename T > 00109 BasicGenericRefPtr& operator= (const RefPtr<T> & Src) 00110 { 00111 SpecUtils::GenericRefPtrImpl* oldGenImpl = GenImpl(); 00112 void* oldPointer = Pointer(); 00113 00114 BasicGenericRefPtr::operator =(Src); 00115 GenImpl()->InitRefPtr(PtrPointer()); 00116 oldGenImpl->DeinitRefPtr(&oldPointer); 00117 00118 return *this; 00119 } 00120 00121 /** 00122 * Оператор присвоения обычного указателя. Увеличивает ссылки на новый объект и уменьшает на старый. 00123 */ 00124 template < typename T > 00125 BasicGenericRefPtr& operator= (const T* Src) 00126 { 00127 SpecUtils::GenericRefPtrImpl* oldGenImpl = GenImpl(); 00128 void* oldPointer = Pointer(); 00129 00130 BasicGenericRefPtr::operator =(Src); 00131 GenImpl()->InitRefPtr(PtrPointer()); 00132 oldGenImpl->DeinitRefPtr(&oldPointer); 00133 00134 return *this; 00135 } 00136 00137 /** 00138 * Оператор присвоения. Увеличивает ссылки на новый объект и уменьшает на старый. 00139 */ 00140 BasicGenericRefPtr& operator= (const BasicGenericRefPtr& Src) 00141 { 00142 SpecUtils::GenericRefPtrImpl* oldGenImpl = GenImpl(); 00143 void* oldPointer = Pointer(); 00144 00145 BasicGenericRefPtr::operator =(Src); 00146 GenImpl()->InitRefPtr(PtrPointer()); 00147 oldGenImpl->DeinitRefPtr(&oldPointer); 00148 00149 return *this; 00150 } 00151 00152 /** 00153 * Оператор присвоения. Увеличивает ссылки на новый объект и уменьшает на старый. 00154 */ 00155 BasicGenericRefPtr& operator = (const GenericRefPtr& Src) 00156 { 00157 SpecUtils::GenericRefPtrImpl* oldGenImpl = GenImpl(); 00158 void* oldPointer = Pointer(); 00159 00160 BasicGenericRefPtr::operator =(Src); 00161 GenImpl()->InitRefPtr(PtrPointer()); 00162 oldGenImpl->DeinitRefPtr(&oldPointer); 00163 00164 return *this; 00165 } 00166 00167 /** 00168 * Сбросить указатель в NULL. 00169 */ 00170 void SetNull() 00171 { 00172 GenImpl()->DeinitRefPtr(PtrPointer()); 00173 BasicGenericRefPtr::SetNull(); 00174 } 00175 }; 00176 00177 } 00178 00179 #endif //CNTM_GENERICREFPTR_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |