GenericRefPtr.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_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

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