📄 unique_ptr.hpp
字号:
//!Returns: A reference to the stored deleter. //! //!Throws: nothing. deleter_reference get_deleter() { return ptr_.second(); } //!Returns: A const reference to the stored deleter. //! //!Throws: nothing. deleter_const_reference get_deleter() const { return ptr_.second(); } //!Returns: An unspecified value that, when used in boolean //!contexts, is equivalent to get() != 0. //! //!Throws: nothing. operator int nat::*() const { return ptr_.first() ? &nat::for_bool_ : 0; } //!Postcondition: get() == 0. //! //!Returns: The value get() had at the start of the call to release. //! //!Throws: nothing. pointer release() { pointer tmp = ptr_.first(); ptr_.first() = 0; return tmp; } //!Effects: If p == get() there are no effects. Otherwise get_deleter()(get()). //! //!Postconditions: get() == p. //! //!Throws: nothing. void reset(pointer p = 0) { if (ptr_.first() != p){ if (ptr_.first()) ptr_.second()(ptr_.first()); ptr_.first() = p; } } //!Requires: The deleter D is Swappable and will not throw an exception under swap. //! //!Effects: The stored pointers of this and u are exchanged. //! The stored deleters are swapped (unqualified). //!Throws: nothing. #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE void swap(unique_ptr& u) { ptr_.swap(u.ptr_); } void swap(detail::moved_object<unique_ptr> mu) { ptr_.swap(mu.get().ptr_); } #else void swap(unique_ptr&&u) { ptr_.swap(u.ptr_); } #endif /// @cond private: boost::compressed_pair<pointer, D> ptr_; //This private constructor avoids moving from non-const lvalues unique_ptr(const unique_ptr&); template <class U, class E> unique_ptr(unique_ptr<U, E>&); template <class U> unique_ptr(U&, typename detail::unique_ptr_error<U>::type = 0); unique_ptr& operator=(unique_ptr&); template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&); template <class U> typename detail::unique_ptr_error<U>::type operator=(U&); /// @endcond};/*template <class T, class D>class unique_ptr<T[], D>{ struct nat {int for_bool_;}; typedef typename detail::add_reference<D>::type deleter_reference; typedef typename detail::add_reference<const D>::type deleter_const_reference;public: typedef T element_type; typedef D deleter_type; typedef typename detail::pointer_type<T, D>::type pointer; // constructors unique_ptr() : ptr_(pointer()) {} explicit unique_ptr(pointer p) : ptr_(p) {} unique_ptr(pointer p, typename if_< boost::is_reference<D>, D, typename detail::add_reference<const D>::type>::type d) : ptr_(p, d) {} unique_ptr(const unique_ptr& u) : ptr_(const_cast<unique_ptr&>(u).release(), u.get_deleter()) {} // destructor ~unique_ptr() {reset();} // assignment unique_ptr& operator=(const unique_ptr& cu) { unique_ptr& u = const_cast<unique_ptr&>(cu); reset(u.release()); ptr_.second() = u.get_deleter(); return *this; } unique_ptr& operator=(int nat::*) { reset(); return *this; } // observers typename detail::add_reference<T>::type operator[](std::size_t i) const {return ptr_.first()[i];} pointer get() const {return ptr_.first();} deleter_reference get_deleter() {return ptr_.second();} deleter_const_reference get_deleter() const {return ptr_.second();} operator int nat::*() const {return ptr_.first() ? &nat::for_bool_ : 0;} // modifiers pointer release() { pointer tmp = ptr_.first(); ptr_.first() = 0; return tmp; } void reset(pointer p = 0) { if (ptr_.first() != p) { if (ptr_.first()) ptr_.second()(ptr_.first()); ptr_.first() = p; } } void swap(unique_ptr& u) {ptr_.swap(u.ptr_);}private: boost::compressed_pair<pointer, D> ptr_; template <class U, class E> unique_ptr(U p, E, typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); template <class U> explicit unique_ptr(U, typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); unique_ptr(unique_ptr&); template <class U> unique_ptr(U&, typename detail::unique_ptr_error<U>::type = 0); unique_ptr& operator=(unique_ptr&); template <class U> typename detail::unique_ptr_error<U>::type operator=(U&);};template <class T, class D, std::size_t N>class unique_ptr<T[N], D>{ struct nat {int for_bool_;}; typedef typename detail::add_reference<D>::type deleter_reference; typedef typename detail::add_reference<const D>::type deleter_const_reference;public: typedef T element_type; typedef D deleter_type; typedef typename detail::pointer_type<T, D>::type pointer; static const std::size_t size = N; // constructors unique_ptr() : ptr_(0) {} explicit unique_ptr(pointer p) : ptr_(p) {} unique_ptr(pointer p, typename if_< boost::is_reference<D>, D, typename detail::add_reference<const D>::type>::type d) : ptr_(p, d) {} unique_ptr(const unique_ptr& u) : ptr_(const_cast<unique_ptr&>(u).release(), u.get_deleter()) {} // destructor ~unique_ptr() {reset();} // assignment unique_ptr& operator=(const unique_ptr& cu) { unique_ptr& u = const_cast<unique_ptr&>(cu); reset(u.release()); ptr_.second() = u.get_deleter(); return *this; } unique_ptr& operator=(int nat::*) { reset(); return *this; } // observers typename detail::add_reference<T>::type operator[](std::size_t i) const {return ptr_.first()[i];} pointer get() const {return ptr_.first();} deleter_reference get_deleter() {return ptr_.second();} deleter_const_reference get_deleter() const {return ptr_.second();} operator int nat::*() const {return ptr_.first() ? &nat::for_bool_ : 0;} // modifiers pointer release() { pointer tmp = ptr_.first(); ptr_.first() = 0; return tmp; } void reset(pointer p = 0) { if (ptr_.first() != p) { if (ptr_.first()) ptr_.second()(ptr_.first(), N); ptr_.first() = p; } } void swap(unique_ptr& u) {ptr_.swap(u.ptr_);}private: boost::compressed_pair<pointer, D> ptr_; template <class U, class E> unique_ptr(U p, E, typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); template <class U> explicit unique_ptr(U, typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); unique_ptr(unique_ptr&); template <class U> unique_ptr(U&, typename detail::unique_ptr_error<U>::type = 0); unique_ptr& operator=(unique_ptr&); template <class U> typename detail::unique_ptr_error<U>::type operator=(U&);};*/template <class T, class D> inlinevoid swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y){ x.swap(y); }template <class T1, class D1, class T2, class D2> inlinebool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y){ return x.get() == y.get(); }template <class T1, class D1, class T2, class D2> inlinebool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y){ return x.get() != y.get(); }template <class T1, class D1, class T2, class D2> inlinebool operator <(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y){ return x.get() < y.get(); }template <class T1, class D1, class T2, class D2> inlinebool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y){ return x.get() <= y.get(); }template <class T1, class D1, class T2, class D2> inlinebool operator >(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y){ return x.get() > y.get(); }template <class T1, class D1, class T2, class D2> inlinebool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y){ return x.get() >= y.get(); }/// @cond//!This class has move constructortemplate <class T, class D>struct is_movable<unique_ptr<T, D> >{ enum { value = true };};/// @endcond//!Returns the type of a unique pointer//!of type T with boost::interprocess::deleter deleter//!that can be constructed in the given managed segment type.template<class T, class ManagedMemory>struct managed_unique_ptr{ typedef unique_ptr < T , typename ManagedMemory::template deleter<T>::type > type;};//!Returns an instance of a unique pointer constructed//!with boost::interproces::deleter from a pointer//!of type T that has been allocated in the passed managed segmenttemplate<class T, class ManagedMemory>#ifndef BOOST_INTERPROCESS_RVALUE_REFERENCEinline typename detail::return_type <typename managed_unique_ptr<T, ManagedMemory>::type >::type #elsetypename managed_unique_ptr<T, ManagedMemory>::type#endif make_managed_unique_ptr(T *constructed_object, ManagedMemory &managed_memory){ typename managed_unique_ptr<T, ManagedMemory>::type to_return ( constructed_object , managed_memory.template get_deleter<T>() ); return to_return;}} //namespace interprocess{} //namespace boost{#include <boost/interprocess/detail/config_end.hpp>#endif //#ifndef BOOST_INTERPROCESS_UNIQUE_PTR_HPP_INCLUDED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -