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