00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
00026
00027
00028
00029 class BasicGenericRefPtr
00030 {
00031 private:
00032
00033
00034
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
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
00116
00117 operator bool () const
00118 {
00119 return pointer != NULL;
00120 }
00121
00122
00123
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
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
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
00241
00242 SpecUtils::GenericRefPtrImpl* genImpl;
00243
00244
00245
00246
00247 void* pointer;
00248 };
00249
00250 }
00251
00252 #endif //CNTM_BASICGENERICREFPTR_H