⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unique_ptr.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
   //!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 + -