// file : odb/details/transfer-ptr.hxx // copyright : Copyright (c) 2009-2015 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_DETAILS_TRANSFER_PTR_HXX #define ODB_DETAILS_TRANSFER_PTR_HXX #include #include // std::auto_ptr, std::unique_ptr #include // ODB_CXX11 namespace odb { namespace details { template class transfer_ptr { public: typedef T element_type; transfer_ptr (): p_ (0) {} #ifndef ODB_CXX11 template transfer_ptr (std::auto_ptr p): p_ (p.release ()) {} private: transfer_ptr& operator= (const transfer_ptr&); public: // In our usage transfer_ptr is always created implicitly and // never const. So while this is not very clean, it is legal. // Plus it will all go away once we drop C++98 (I can hardly // wait). // transfer_ptr (const transfer_ptr& p) : p_ (const_cast (p).transfer ()) {} #else #ifdef ODB_CXX11_NULLPTR transfer_ptr (std::nullptr_t): p_ (0) {} #endif template transfer_ptr (std::unique_ptr&& p): p_ (p.release ()) {} private: transfer_ptr (const transfer_ptr&); transfer_ptr& operator= (const transfer_ptr&); public: transfer_ptr (transfer_ptr&& p): p_ (p.transfer ()) {} #endif ~transfer_ptr () {delete p_;} T* transfer () { T* r (p_); p_ = 0; return r; } private: T* p_; }; } } #include #endif // ODB_DETAILS_TRANSFER_PTR_HXX