GenericMethodNoRefPtr.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_GENERICMETHODNOREFPTR_H
00015 #define CNTM_GENERICMETHODNOREFPTR_H
00016 #include <Cntm/Utils/SignatureInfo.h>
00017 #include <Cntm/RefCount/GenericPtr/GenericNoRefPtr.h>
00018 #include <Cntm/RefCount/GenericPtr/GenericMethodRefPtr.h>
00019 
00020 namespace Cntm
00021 {
00022 
00023         template < typename SignatureT >
00024         class GenericMethodRefPtr;
00025 
00026         /**
00027          * Класс указателя на метод объекта. Объединяет в себе обобщенный не ссылочный указатель на объект (GenericNoRefPtr) и указатель на метод.
00028          * 
00029          * Данный класс является шаблоном. В качестве параметра шаблона задается сигнатура метода без указания конкретного класса, например: GenericMethodRefPtr < void (int, double) > methPtr. Это позволяет присваивать указатели на методы любых классов, сигнатура которых совпадает с заданной в шаблоне (что обеспечивает жесткую проверку типов).
00030          * 
00031          * Вызов метода осуществляется с помощью свойств Object() и Method() следующим образом: (methPtr.Object()->*methPtr.Method()) (45, 234.78). Перед вызовом следует проверить указатель на NULL: if (methPtr) ...
00032          * 
00033          * В остальном поведение этого класса совпадает с поведением GenericNoRefPtr.
00034          * @author Овсеевич Р.
00035          * \ingroup RefCount
00036          */
00037         template < typename SignatureT >
00038         class GenericMethodNoRefPtr
00039         {
00040         public:
00041 
00042                 /**
00043                  * Специальный класс, используемый для вызова метода, на который указывает указатель. 
00044                  */
00045                 class Closure
00046                 {
00047                 };
00048 
00049                 typedef SignatureT SignatureType;
00050                 typedef SignatureInfo < SignatureT > SignInfo;
00051                 typedef typename SignInfo::template Method < Closure > ::Pointer ClosureMethod;
00052 
00053                 /**
00054                  * Конструктор по умолчанию. Инициализирует указатель в NULL.
00055                  */
00056                 GenericMethodNoRefPtr(): method(NULL) {}
00057 
00058                 /**
00059                  * Конструктор инициализации из ссылочного указателя и указателя на метод. 
00060                  */
00061                 template < typename ClassT >
00062                 GenericMethodNoRefPtr(const RefPtr < ClassT > & ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method):
00063                         genericPtr(ObjectPtr), method(reinterpret_cast<ClosureMethod>(Method)) {}
00064                 
00065                 /**
00066                  * Конструктор инициализации из обычного указателя и указателя на метод. 
00067                  */
00068                 template < typename ClassT >
00069                 GenericMethodNoRefPtr(ClassT* ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method):
00070                         genericPtr(ObjectPtr), method(reinterpret_cast<ClosureMethod>(Method)) {}
00071                 
00072                 /**
00073                  * Конструктор копирования из ссылочного указателя. 
00074                  */
00075                 GenericMethodNoRefPtr(const GenericMethodRefPtr < SignatureT > & Src):
00076                         genericPtr(Src.GenericPtr()), method(reinterpret_cast<ClosureMethod>(Src.Method())) {}
00077 
00078                 /**
00079                  * Конструктор копирования. 
00080                  */
00081                 GenericMethodNoRefPtr(const GenericMethodNoRefPtr < SignatureT > & Src):
00082                         genericPtr(Src.GenericPtr()), method(Src.Method()) {}
00083 
00084                 /**
00085                  * Оператор присвоения из ссылочного указателя.
00086                  */
00087                 GenericMethodNoRefPtr < SignatureT > & operator = (const GenericMethodRefPtr < SignatureT > & Src)
00088                 {
00089                         genericPtr = Src.GenericPtr();
00090                         method = reinterpret_cast<ClosureMethod>(Src.Method());
00091                         return *this;
00092                 }
00093 
00094                 /**
00095                  * Оператор присвоения. 
00096                  */
00097                 GenericMethodNoRefPtr < SignatureT > & operator = (const GenericMethodNoRefPtr < SignatureT > & Src)
00098                 {
00099                         genericPtr = Src.GenericPtr();
00100                         method = Src.Method();
00101                         return *this;
00102                 }
00103 
00104                 /**
00105                  * Приведение к типу bool. true - если указатель не равен NULL, иначе false.
00106                  */
00107                 operator bool () const
00108                 {
00109                         return (bool)genericPtr;
00110                 }
00111 
00112                 /**
00113                  * Оператор not. Противоположен operator bool().
00114                  */
00115                 bool operator ! () const
00116                 {
00117                         return !genericPtr;
00118                 }
00119 
00120                 /**
00121                  * Оператор сравнения на равенство. 
00122                  */
00123                 bool operator == (const GenericMethodRefPtr < SignatureT > & Ptr) const
00124                 {
00125                         return genericPtr == Ptr.GenericPtr() && method == reinterpret_cast<ClosureMethod>(Ptr.Method());
00126                 }
00127 
00128                 /**
00129                  * Оператор сравнения на равенство. 
00130                  */
00131                 bool operator == (const GenericMethodNoRefPtr < SignatureT > & Ptr) const
00132                 {
00133                         return genericPtr == Ptr.GenericPtr() && method == Ptr.Method();
00134                 }
00135 
00136                 /**
00137                  * Оператор сравнения на не равенство. 
00138                  */
00139                 bool operator != (const GenericMethodRefPtr < SignatureT > & Ptr) const
00140                 {
00141                         return !(*this == Ptr);
00142                 }
00143 
00144                 /**
00145                  * Оператор сравнения на не равенство. 
00146                  */
00147                 bool operator != (const GenericMethodNoRefPtr < SignatureT > & Ptr) const
00148                 {
00149                         return !(*this == Ptr);
00150                 }
00151 
00152                 /**
00153                  * Возвращает обобщенный не ссылочный указатель.
00154                  */
00155                 const GenericNoRefPtr& GenericPtr() const 
00156                 {
00157                         return genericPtr;
00158                 }
00159 
00160                 /**
00161                  * Возвращает объект, приведенный к специальному классу Closure. Используется для вызова метода. 
00162                  */
00163                 Closure* Object() const 
00164                 {
00165                         return reinterpret_cast<Closure*>(genericPtr.Pointer());
00166                 }
00167 
00168                 /**
00169                  * Возвращает указатель на метод специального класса Closure с указанной сигнатурой. Используется для вызова метода. 
00170                  */
00171                 ClosureMethod Method() const 
00172                 {
00173                         return method;
00174                 }
00175 
00176                 /**
00177                  * Установить новые значения из ссылочного указателя и указателя на метод. 
00178                  */
00179                 template < typename ClassT >
00180                 void Set(const RefPtr < ClassT > & ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method)
00181                 {
00182                         genericPtr = ObjectPtr;
00183                         method = reinterpret_cast<ClosureMethod>(Method);
00184                 }
00185                 
00186                 /**
00187                  * Установить новые значения обычного указателя и указателя на метод. 
00188                  */
00189                 template < typename ClassT >
00190                 void Set(ClassT* ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method)
00191                 {
00192                         genericPtr = ObjectPtr;
00193                         method = reinterpret_cast<ClosureMethod>(Method);
00194                 }
00195 
00196                 /**
00197                  * Установить новые значения ссылки на объект и указателя на метод. 
00198                  */
00199                 template < typename ClassT >
00200                 void Set(const ClassT& Object, typename SignInfo::template Method < ClassT > ::Pointer Method)
00201                 {
00202                         genericPtr = const_cast<ClassT*>(&Object);
00203                         method = reinterpret_cast<ClosureMethod>(Method);
00204                 }
00205 
00206                 /**
00207                  * Установить указатель в NULL. 
00208                  */
00209                 void SetNull()
00210                 {
00211                         genericPtr.SetNull();
00212                 }
00213 
00214         private:
00215                 /**
00216                  * Обобщенный не ссылочный указатель на объект.
00217                  */
00218                 GenericNoRefPtr genericPtr;
00219                 /**
00220                  * Указатель на метод специального класса Closure с указанной сигнатурой. 
00221                  */
00222                 ClosureMethod method;
00223         };
00224 
00225 }
00226 
00227 #endif //CNTM_GENERICMETHODNOREFPTR_H

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