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_COPIEDPTRPOLICIES_HPP
00030 #define THOR_COPIEDPTRPOLICIES_HPP
00031
00032 #include <typeinfo>
00033 #include <cassert>
00034
00035
00036 namespace thor
00037 {
00038 namespace detail
00039 {
00040
00041
00042 inline void SuppressUnusedWarning(const void*)
00043 {
00044 }
00045
00046
00047 template <typename T>
00048 bool SameDynamicPointerType(const T* lhs, const T* rhs)
00049 {
00050 SuppressUnusedWarning(lhs);
00051 SuppressUnusedWarning(rhs);
00052
00053 return typeid(*lhs) == typeid(*rhs);
00054 }
00055
00056
00057 template <typename Lhs>
00058 bool SameDynamicPointerType(const Lhs* rhs)
00059 {
00060 SuppressUnusedWarning(rhs);
00061
00062 return typeid(Lhs) == typeid(*rhs);
00063 }
00064
00065 }
00066
00067
00068
00069
00072
00077 template <typename T>
00078 struct StaticCopy
00079 {
00080 static T* Copy(const T* originPtr)
00081 {
00082 T* copiedPtr = new T(*originPtr);
00083
00084
00085 assert( detail::SameDynamicPointerType<T>(copiedPtr, originPtr) );
00086
00087 return copiedPtr;
00088 }
00089
00090 static void Destroy(T* pointer)
00091 {
00092
00093 assert( !pointer || detail::SameDynamicPointerType<T>(pointer) );
00094
00095 delete pointer;
00096 }
00097 };
00098
00104 template <typename T>
00105 struct DynamicCopy
00106 {
00107 template <class DynamicType>
00108 static T* Copy(const DynamicType* originPtr)
00109 {
00110 T* copiedPtr = new DynamicType(*originPtr);
00111
00112
00113
00114
00115
00116
00117 assert( detail::SameDynamicPointerType<T>(copiedPtr, originPtr) );
00118
00119
00120 return copiedPtr;
00121 }
00122
00123 template <class DynamicType>
00124 static void Destroy(DynamicType* pointer)
00125 {
00126
00127 assert( !pointer || detail::SameDynamicPointerType<DynamicType>(pointer) );
00128
00129 delete pointer;
00130 }
00131 };
00132
00136 template <typename T>
00137 struct VirtualClone
00138 {
00139 static T* Copy(const T* originPtr)
00140 {
00141 T* clonedPtr = originPtr->Clone();
00142
00143
00144
00145 assert( detail::SameDynamicPointerType<T>(clonedPtr, originPtr) );
00146
00147
00148 return clonedPtr;
00149 }
00150
00151 static void Destroy(T* pointer)
00152 {
00153 delete pointer;
00154 }
00155 };
00156
00158
00159 }
00160
00161 #endif // THOR_COPIEDPTRPOLICIES_HPP