00001 #ifndef FBXFILESDK_COMPONENTS_KBASELIB_KLIB_KSCOPEDPTR_H
00002 #define FBXFILESDK_COMPONENTS_KBASELIB_KLIB_KSCOPEDPTR_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "kdebug.h"
00041
00042
00043 #include <fbxfilesdk/fbxfilesdk_nsbegin.h>
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 template<class T>
00056 class DefaultDeletionPolicy
00057 {
00058 public:
00059 static inline void DeleteIt(T** ptr)
00060 {
00061 if ( *ptr != NULL )
00062 {
00063 delete *ptr;
00064 *ptr = NULL;
00065 }
00066 }
00067 };
00068
00069 template<class T>
00070 class FreeDeletionPolicy
00071 {
00072 public:
00073 static inline void DeleteIt(T** ptr)
00074 {
00075 if ( *ptr != NULL )
00076 {
00077 free( *ptr );
00078 *ptr = NULL;
00079 }
00080 }
00081 };
00082
00083
00084 template<class T, class DeletionPolicyT = DefaultDeletionPolicy<T> >
00085 class KScopedPtr
00086 {
00087 private:
00088 T* ptr;
00089
00090
00091 KScopedPtr(KScopedPtr const &);
00092 KScopedPtr& operator=(KScopedPtr const &);
00093
00094 typedef KScopedPtr<T, DeletionPolicyT> ThisType;
00095 typedef DeletionPolicyT DeletionPolicy;
00096
00097 public:
00099 explicit KScopedPtr(T* p = 0): ptr(p){}
00100
00102 ~KScopedPtr()
00103 {
00104 DeletionPolicy::DeleteIt(&ptr);
00105 }
00106
00108 inline void Reset(T* p = 0)
00109 {
00110 K_ASSERT(p == 0 || p != ptr);
00111 ThisType(p).Swap(*this);
00112 }
00113
00115 inline T & operator*() const
00116 {
00117 K_ASSERT(ptr != 0);
00118 return *ptr;
00119 }
00120
00122 inline T* operator->() const
00123 {
00124 K_ASSERT(ptr != 0);
00125 return ptr;
00126 }
00127
00129 inline T* Get() const
00130 {
00131 return ptr;
00132 }
00133
00134 inline operator T* () const
00135 {
00136 return ptr;
00137 }
00138
00140
00141 operator bool () const
00142 {
00143 return ptr != 0;
00144 }
00145
00147 bool operator! () const
00148 {
00149 return ptr == 0;
00150 }
00151
00153 void Swap(KScopedPtr & b)
00154 {
00155 T * tmp = b.ptr;
00156 b.ptr = ptr;
00157 ptr = tmp;
00158 }
00159
00161 T* Release()
00162 {
00163 T* tmp = ptr;
00164 ptr = NULL;
00165
00166 return tmp;
00167 }
00168 };
00169
00170
00171
00172
00173
00174
00175
00176 template <class FBXObjectT>
00177 class FBXObjectDeletionPolicy
00178 {
00179 public:
00180 static inline void DeleteIt(FBXObjectT** ptr)
00181 {
00182 if (*ptr != NULL)
00183 {
00184 (*ptr)->Destroy();
00185 *ptr = NULL;
00186 }
00187 }
00188 };
00189
00190
00191 template <class FBXObjectT>
00192 class KFBXObjectScopedPtr: public KScopedPtr<FBXObjectT, FBXObjectDeletionPolicy<FBXObjectT> >
00193 {
00194 public:
00195 explicit KFBXObjectScopedPtr(FBXObjectT* p = 0):KScopedPtr<FBXObjectT, FBXObjectDeletionPolicy<FBXObjectT> >(p){}
00196 };
00197
00198
00199 #include <fbxfilesdk/fbxfilesdk_nsend.h>
00200
00201 #endif // FBXFILESDK_COMPONENTS_KBASELIB_KLIB_KSCOPEDPTR_H
00202