Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00025
00028
00029 #ifndef THOR_OWNERSHIPPOLICIES_HPP
00030 #define THOR_OWNERSHIPPOLICIES_HPP
00031
00032 #include <Thor/Config.hpp>
00033
00034 #include THOR_TR1_HEADER(type_traits)
00035 #include <typeinfo>
00036 #include <cassert>
00037
00038
00039 namespace thor
00040 {
00041 namespace detail
00042 {
00043
00044
00045 inline void SuppressUnusedWarning(const void*)
00046 {
00047 }
00048
00049
00050 template <typename T>
00051 bool SameDynamicPointerType(const T* lhs, const T* rhs)
00052 {
00053 SuppressUnusedWarning(lhs);
00054 SuppressUnusedWarning(rhs);
00055
00056 return typeid(*lhs) == typeid(*rhs);
00057 }
00058
00059
00060 template <typename Lhs>
00061 bool SameDynamicPointerType(const Lhs* rhs)
00062 {
00063 SuppressUnusedWarning(rhs);
00064
00065 return typeid(Lhs) == typeid(*rhs);
00066 }
00067
00068 }
00069
00070
00071
00072
00075
00076
00081 template <typename T>
00082 struct NoCopy
00083 {
00084 static void Destroy(T* pointer)
00085 {
00086
00087
00088 assert( !pointer || detail::SameDynamicPointerType<T>(pointer) || std::tr1::has_virtual_destructor<T>::value );
00089
00090 delete pointer;
00091 }
00092 };
00093
00098 template <typename T>
00099 struct StaticCopy
00100 {
00101 static T* Copy(const T* originPtr)
00102 {
00103 T* copiedPtr = new T(*originPtr);
00104
00105
00106 assert( detail::SameDynamicPointerType<T>(copiedPtr, originPtr) );
00107
00108 return copiedPtr;
00109 }
00110
00111 static void Destroy(T* pointer)
00112 {
00113
00114 assert( !pointer || detail::SameDynamicPointerType<T>(pointer) );
00115
00116 delete pointer;
00117 }
00118 };
00119
00125 template <typename T>
00126 struct DynamicCopy
00127 {
00128 template <class DynamicType>
00129 static T* Copy(const DynamicType* originPtr)
00130 {
00131 T* copiedPtr = new DynamicType(*originPtr);
00132
00133
00134
00135
00136
00137
00138 assert( detail::SameDynamicPointerType<T>(copiedPtr, originPtr) );
00139
00140
00141 return copiedPtr;
00142 }
00143
00144 template <class DynamicType>
00145 static void Destroy(DynamicType* pointer)
00146 {
00147
00148 assert( !pointer || detail::SameDynamicPointerType<DynamicType>(pointer) );
00149
00150 delete pointer;
00151 }
00152 };
00153
00157 template <typename T>
00158 struct VirtualClone
00159 {
00160 static T* Copy(const T* originPtr)
00161 {
00162 T* clonedPtr = originPtr->Clone();
00163
00164
00165
00166 assert( detail::SameDynamicPointerType<T>(clonedPtr, originPtr) );
00167
00168
00169 return clonedPtr;
00170 }
00171
00172 static void Destroy(T* pointer)
00173 {
00174 delete pointer;
00175 }
00176 };
00177
00179
00180 }
00181
00182 #endif // THOR_OWNERSHIPPOLICIES_HPP