// file : xsd/cxx/xml/dom/auto-ptr.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef XSD_CXX_XML_DOM_AUTO_PTR_HXX #define XSD_CXX_XML_DOM_AUTO_PTR_HXX namespace xsd { namespace cxx { namespace xml { namespace dom { // Simple auto_ptr version that calls release() instead of delete. // template struct remove_c { typedef T r; }; template struct remove_c { typedef T r; }; template struct auto_ptr_ref { T* x_; explicit auto_ptr_ref (T* x) : x_ (x) { } }; template struct auto_ptr { ~auto_ptr () { reset (); } explicit auto_ptr (T* x = 0) : x_ (x) { } auto_ptr (auto_ptr& y) : x_ (y.release ()) { } template auto_ptr (auto_ptr& y) : x_ (y.release ()) { } auto_ptr (auto_ptr_ref r) : x_ (r.x_) { } auto_ptr& operator= (auto_ptr& y) { if (x_ != y.x_) reset (y.release ()); return *this; } template auto_ptr& operator= (auto_ptr& y) { if (x_ != y.x_) reset (y.release ()); return *this; } auto_ptr& operator= (auto_ptr_ref r) { if (r.x_ != x_) reset (r.x_); return *this; } template operator auto_ptr_ref () { return auto_ptr_ref (release ()); } template operator auto_ptr () { return auto_ptr (release ()); } public: T& operator* () const { return *x_; } T* operator-> () const { return x_; } T* get () const { return x_; } T* release () { T* x (x_); x_ = 0; return x; } void reset (T* x = 0) { if (x_) const_cast::r*> (x_)->release (); x_ = x; } private: T* x_; }; } } } } #endif // XSD_CXX_XML_DOM_AUTO_PTR_HXX