BasicGenericRefPtr.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_BASICGENERICREFPTR_H
00015 #define CNTM_BASICGENERICREFPTR_H
00016 #include <Cntm/RefCount/RefPtr.h>
00017 #include <Cntm/RefCount/Internal/GenericRefPtrImpl.h>
00018 
00019 namespace Cntm
00020 {
00021 
00022         namespace SpecUtils {}
00023         
00024         /**
00025          * Базовый класс для классов GenericRefPtr и GenericNoRefPtr (см. эти классы). Содержит основные операции для работы с обобщенными указателями.
00026          * 
00027          * Данный класс не обеспечивает полную многопоточность. Операция присвоения нового значения требует внешней синхронизации.
00028          */
00029         class BasicGenericRefPtr
00030         {
00031         private:
00032                 
00033                 /**
00034                  * Класс для управления NULL - значениями.
00035                  */
00036                 class NullGenericRefPtrImpl : public SpecUtils::GenericRefPtrImpl
00037                 {
00038                 public:
00039                         
00040                         void InitRefPtr(void** PtrPtr) {}
00041                         
00042                         void DeinitRefPtr(void** PtrPtr) {}
00043                         
00044                         void* CastPtrTo(void* Ptr, const std::type_info& TypeInfo) { return NULL; }
00045                 };
00046                 
00047         public:
00048 
00049                 /**
00050                  * Конструктор по умолчанию. Инициализирует указатель  NULL. 
00051                  */
00052                 BasicGenericRefPtr()
00053                 {
00054                         SetNull();
00055                 }
00056 
00057                 /**
00058                  * Конструктор инициализации из ссылочного указателя. 
00059                  */
00060                 template < typename T >
00061                 BasicGenericRefPtr(RefPtr < T > Src)
00062                 {
00063                         SetPointer(Src.Pointer());
00064                 }
00065 
00066                 /**
00067                  * Конструктор инициализации из обычного указателя. 
00068                  */
00069                 template < typename T >
00070                 BasicGenericRefPtr(T* Src)
00071                 {
00072                         SetPointer(Src);
00073                 }
00074 
00075                 /**
00076                  * Конструктор копирования. 
00077                  */
00078                 BasicGenericRefPtr(const BasicGenericRefPtr& Src)
00079                 {
00080                         genImpl = Src.genImpl;
00081                         pointer = Src.pointer;
00082                 }
00083 
00084                 /**
00085                  * Оператор присвоения ссылочного указателя. 
00086                  */
00087                 template < typename T >
00088                 BasicGenericRefPtr& operator = (RefPtr < T > Src)
00089                 {
00090                         SetPointer(Src.Pointer());
00091                         return *this;
00092                 }
00093 
00094                 /**
00095                  * Оператор присвоения обычного указателя. 
00096                  */
00097                 template < typename T >
00098                 BasicGenericRefPtr& operator = (T* Src)
00099                 {
00100                         SetPointer(Src);
00101                         return *this;
00102                 }
00103 
00104                 /**
00105                  * Оператор присвоения. 
00106                  */
00107                 BasicGenericRefPtr& operator = (const BasicGenericRefPtr& Src)
00108                 {
00109                         genImpl = Src.genImpl;
00110                         pointer = Src.pointer;
00111                         return *this;
00112                 }
00113 
00114                 /**
00115                  * Приведение к типу bool. true - если указатель не равен NULL, иначе false.
00116                  */
00117                 operator bool () const
00118                 {
00119                         return pointer != NULL;
00120                 }
00121 
00122                 /**
00123                  * Оператор not. Противоположен operator bool().
00124                  */
00125                 bool operator ! () const
00126                 {
00127                         return pointer == NULL;
00128                 }
00129 
00130                 /**
00131                  * Оператор сравнения на равенство. Использует ссылочный указатель.
00132                  */
00133                 template < typename T >
00134                 bool operator == (const RefPtr < T > & Ptr) const
00135                 {
00136                         return pointer == Ptr.Pointer();
00137                 }
00138 
00139                 /**
00140                  * Оператор сравнения на равенство. Использует указатель на объект.
00141                  */
00142                 template < typename T >
00143                 bool operator == (T* Ptr) const
00144                 {
00145                         return pointer == Ptr;
00146                 }
00147 
00148                 /**
00149                  * Оператор сравнения на равенство. Использует ссылку на обобщенный указатель.
00150                  */
00151                 bool operator == (const BasicGenericRefPtr& Src) const
00152                 {
00153                         return pointer == Src.Pointer();
00154                 }
00155 
00156                 /**
00157                  * Оператор сравнения на не равенство. Использует ссылочный указатель.
00158                  */
00159                 template < typename T >
00160                 bool operator != (const RefPtr < T > & Ptr) const
00161                 {
00162                         return pointer == Ptr.Pointer();
00163                 }
00164 
00165                 /**
00166                  * Оператор сравнения на не равенство. Использует указатель на объект.
00167                  */
00168                 template < typename T >
00169                 bool operator != (T* Ptr) const
00170                 {
00171                         return pointer == Ptr;
00172                 }
00173 
00174                 /**
00175                  * Оператор сравнения на не равенство. Использует ссылку на обобщенный указатель.
00176                  */
00177                 bool operator != (const BasicGenericRefPtr& Src) const
00178                 {
00179                         return pointer == Src.Pointer();
00180                 }
00181 
00182                 /**
00183                  * Получить нетипизированный указатель на объект.
00184                  */
00185                 void* Pointer() const
00186                 {
00187                         return pointer;
00188                 }
00189 
00190                 /**
00191                  * Пытается преобразовать указатель к указанному в шаблоне типу. Поддерживается ограниченный набор классов, к которым может выполниться приведение. Эти классы перечислены в описаниях методов CastPtrTo() классов, унаследовавших Cntm::SpecUtils::GenericRefPtrImpl.
00192                  * 
00193                  * Этот метод является служебным. 
00194                  */
00195                 template < typename BaseT >
00196                 BaseT* DynamicCast()
00197                 {
00198                         return reinterpret_cast<BaseT*>(genImpl->CastPtrTo(pointer, typeid(BaseT)));
00199                 }
00200 
00201                 /**
00202                  * Сбросить указатель в NULL. 
00203                  */
00204                 void SetNull()
00205                 {
00206                         static NullGenericRefPtrImpl nullGenericRefPtrImpl;
00207                         genImpl = &nullGenericRefPtrImpl;
00208                         pointer = NULL;
00209                 }
00210 
00211         protected:
00212 
00213                 /**
00214                  * Возвращает указатель на объект, который выполняет манипуляции с нетипизированным указателем на объект с подсчетом ссылок. 
00215                  */
00216                 SpecUtils::GenericRefPtrImpl* GenImpl() const
00217                 {
00218                         return genImpl;
00219                 }
00220 
00221                 /**
00222                  * Возвращает указатель на указатель для записи нового значения. 
00223                  */
00224                 void** PtrPointer() { return &pointer; }
00225                 
00226                 /**
00227                  * Шаблонный метод, устанавливающий указатель и выбирающий объект, выполняющий манипуляции с указателем исходя из типа класса указателя. 
00228                  */
00229                 template < typename T >
00230                 void SetPointer(T* Src)
00231                 {
00232                         using namespace SpecUtils;
00233                         genImpl = GetGenericRefPtrImpl(Src, Src);
00234                         pointer = Src;
00235                 }
00236 
00237         private:
00238                 
00239                 /**
00240                  * Указатель на объект, который выполняет манипуляции с нетипизированным указателем на объект с подсчетом ссылок. Данный объект знает, как преобразовать указатель void* к истинному типу объекта, как увеличивать и уменьшать кол-во ссылок. По сути дела используется для задания информации о типе объекта. 
00241                  */
00242                 SpecUtils::GenericRefPtrImpl* genImpl;
00243                 
00244                 /**
00245                  * Нетипизированный указатель на объект. 
00246                  */
00247                 void* pointer;
00248         };
00249 
00250 }
00251 
00252 #endif //CNTM_BASICGENERICREFPTR_H

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