#ifndef ARG_DEEP_COPY_H #define ARG_DEEP_COPY_H #ifndef ARG_COMPILER_H #include "arg_compiler.h" #endif #ifndef ARG_DEEP_COPY_UTILS_H #include "arg_deep_copy_utils.h" #endif namespace arg { template<class pointee_type> class deep_copy_ptr { public: // Construction deep_copy_ptr(); explicit deep_copy_ptr(pointee_type* p) throw(); deep_copy_ptr(const deep_copy_ptr& rhs); ~deep_copy_ptr() throw(); // Accessors pointee_type* get() const; pointee_type* operator->() const; pointee_type& operator*() const; // Mutators deep_copy_ptr& operator=(const deep_copy_ptr& rhs); pointee_type* release(); void reset(pointee_type* p) throw(); void swap(deep_copy_ptr& with) throw(); private: pointee_type* pointee; }; template<class pointee_type> class body_part_ptr { public: // Construction & assignment body_part_ptr() : pointee() {} explicit body_part_ptr(pointee_type* p) throw() : pointee(p) {} // Default copy is OK // Accessors - (overloaded on const) const pointee_type* get() const { return pointee.get(); } pointee_type* get() { return pointee.get(); } const pointee_type* operator->() const { return pointee.get(); } pointee_type* operator->() { return pointee.get(); } const pointee_type& operator*() const { return *pointee; } pointee_type& operator*() { return *pointee; } // Mutators pointee_type* release() { return pointee.release(); } void reset(pointee_type* p) throw() { pointee.reset(p); } void swap(deep_copy_ptr<pointee_type>& with) throw() { pointee.swap(with); } operator deep_copy_ptr<pointee_type>&() { return pointee; } // Default assignment is OK private: deep_copy_ptr<pointee_type> pointee; }; template<class pointee_type> inline deep_copy_ptr<pointee_type>::deep_copy_ptr() : pointee(0) {} template<class pointee_type> inline deep_copy_ptr<pointee_type>::deep_copy_ptr(pointee_type* p) throw() : pointee(p) {} template<class pointee_type> inline deep_copy_ptr<pointee_type>::deep_copy_ptr(const deep_copy_ptr& rhs) : pointee(deep_copy(rhs.pointee)) {} template<class pointee_type> inline deep_copy_ptr<pointee_type>& deep_copy_ptr<pointee_type>:: operator=(const deep_copy_ptr& rhs) { pointee_type* p = deep_copy(rhs.pointee); delete pointee, pointee = p; return *this; } template<class pointee_type> inline deep_copy_ptr<pointee_type>::~deep_copy_ptr() throw() { delete pointee; } template<class pointee_type> pointee_type* deep_copy_ptr<pointee_type>::get() const { return pointee; } template<class pointee_type> inline pointee_type* deep_copy_ptr<pointee_type>::operator->() const { return pointee; } template<class pointee_type> inline pointee_type& deep_copy_ptr<pointee_type>::operator*() const { return *pointee; } template<class pointee_type> inline pointee_type* deep_copy_ptr<pointee_type>::release() { pointee_type* temp = pointee; pointee = 0; return temp; } template<class pointee_type> inline void deep_copy_ptr<pointee_type>::reset(pointee_type* p) throw() { pointee_type* temp = pointee; pointee = p; delete temp; } template<class pointee_type> inline void deep_copy_ptr<pointee_type>::swap(deep_copy_ptr& with) throw() { pointee_type* temp = pointee; pointee = with.pointee; with.pointee = temp; } } namespace std { template<class pointee_type> inline void swap( ::arg::deep_copy_ptr<pointee_type>& lhs, ::arg::deep_copy_ptr<pointee_type>& rhs) throw() { lhs.swap(rhs); } template<class pointee_type> inline void swap( ::arg::body_part_ptr<pointee_type>& lhs, ::arg::body_part_ptr<pointee_type>& rhs) throw() { lhs.swap(rhs); } } #endif