node_allocator.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 452 行 · 第 1/2 页

HPP
452
字号
////////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2005-2008. Distributed under the Boost// Software License, Version 1.0. (See accompanying file// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org/libs/interprocess for documentation.////////////////////////////////////////////////////////////////////////////////#ifndef BOOST_INTERPROCESS_NODE_ALLOCATOR_HPP#define BOOST_INTERPROCESS_NODE_ALLOCATOR_HPP#if (defined _MSC_VER) && (_MSC_VER >= 1200)#  pragma once#endif#include <boost/interprocess/detail/config_begin.hpp>#include <boost/interprocess/detail/workaround.hpp>#include <boost/interprocess/interprocess_fwd.hpp>#include <boost/assert.hpp>#include <boost/utility/addressof.hpp>#include <boost/interprocess/detail/utilities.hpp>#include <boost/interprocess/detail/type_traits.hpp>#include <boost/interprocess/allocators/detail/node_pool.hpp>#include <boost/interprocess/exceptions.hpp>#include <boost/interprocess/allocators/detail/allocator_common.hpp>#include <memory>#include <algorithm>#include <cstddef>//!\file//!Describes node_allocator pooled shared memory STL compatible allocator namespace boost {namespace interprocess {/// @condnamespace detail{template < unsigned int Version         , class T         , class SegmentManager         , std::size_t NodesPerBlock         >class node_allocator_base   : public node_pool_allocation_impl   < node_allocator_base      < Version, T, SegmentManager, NodesPerBlock>   , Version   , T   , SegmentManager   >{   public:   typedef typename SegmentManager::void_pointer         void_pointer;   typedef SegmentManager                                segment_manager;   typedef node_allocator_base      <Version, T, SegmentManager, NodesPerBlock>   self_t;   /// @cond   template <int dummy>   struct node_pool   {      typedef detail::shared_node_pool      < SegmentManager, sizeof_value<T>::value, NodesPerBlock> type;      static type *get(void *p)      {  return static_cast<type*>(p);  }   };   /// @endcond   BOOST_STATIC_ASSERT((Version <=2));   public:   //-------   typedef typename detail::      pointer_to_other<void_pointer, T>::type            pointer;   typedef typename detail::      pointer_to_other<void_pointer, const T>::type      const_pointer;   typedef T                                             value_type;   typedef typename detail::add_reference                     <value_type>::type                  reference;   typedef typename detail::add_reference                     <const value_type>::type            const_reference;   typedef std::size_t                                   size_type;   typedef std::ptrdiff_t                                difference_type;   typedef detail::version_type<node_allocator_base, Version>   version;   typedef transform_iterator      < typename SegmentManager::         multiallocation_iterator      , detail::cast_functor <T> >              multiallocation_iterator;   typedef typename SegmentManager::      multiallocation_chain                     multiallocation_chain;   //!Obtains node_allocator_base from    //!node_allocator_base   template<class T2>   struct rebind   {        typedef node_allocator_base<Version, T2, SegmentManager, NodesPerBlock>       other;   };   /// @cond   private:   //!Not assignable from related node_allocator_base   template<unsigned int Version2, class T2, class SegmentManager2, std::size_t N2>   node_allocator_base& operator=      (const node_allocator_base<Version2, T2, SegmentManager2, N2>&);   //!Not assignable from other node_allocator_base   //node_allocator_base& operator=(const node_allocator_base&);   /// @endcond   public:   //!Constructor from a segment manager. If not present, constructs a node   //!pool. Increments the reference count of the associated node pool.   //!Can throw boost::interprocess::bad_alloc   node_allocator_base(segment_manager *segment_mngr)       : mp_node_pool(detail::get_or_create_node_pool<typename node_pool<0>::type>(segment_mngr)) { }   //!Copy constructor from other node_allocator_base. Increments the reference    //!count of the associated node pool. Never throws   node_allocator_base(const node_allocator_base &other)       : mp_node_pool(other.get_node_pool())    {        node_pool<0>::get(detail::get_pointer(mp_node_pool))->inc_ref_count();      }   //!Copy constructor from related node_allocator_base. If not present, constructs   //!a node pool. Increments the reference count of the associated node pool.   //!Can throw boost::interprocess::bad_alloc   template<class T2>   node_allocator_base      (const node_allocator_base<Version, T2, SegmentManager, NodesPerBlock> &other)      : mp_node_pool(detail::get_or_create_node_pool<typename node_pool<0>::type>(other.get_segment_manager())) { }   //!Assignment from other node_allocator_base   node_allocator_base& operator=(const node_allocator_base &other)   {      node_allocator_base c(other);      swap(*this, c);      return *this;   }   //!Destructor, removes node_pool_t from memory   //!if its reference count reaches to zero. Never throws   ~node_allocator_base()    {  detail::destroy_node_pool_if_last_link(node_pool<0>::get(detail::get_pointer(mp_node_pool)));   }   //!Returns a pointer to the node pool.   //!Never throws   void* get_node_pool() const   {  return detail::get_pointer(mp_node_pool);   }   //!Returns the segment manager.   //!Never throws   segment_manager* get_segment_manager()const   {  return node_pool<0>::get(detail::get_pointer(mp_node_pool))->get_segment_manager();  }   //!Swaps allocators. Does not throw. If each allocator is placed in a   //!different memory segment, the result is undefined.   friend void swap(self_t &alloc1, self_t &alloc2)   {  detail::do_swap(alloc1.mp_node_pool, alloc2.mp_node_pool);  }   /// @cond   private:   void_pointer   mp_node_pool;   /// @endcond};//!Equality test for same type//!of node_allocator_basetemplate<unsigned int V, class T, class S, std::size_t NPC> inlinebool operator==(const node_allocator_base<V, T, S, NPC> &alloc1,                 const node_allocator_base<V, T, S, NPC> &alloc2)   {  return alloc1.get_node_pool() == alloc2.get_node_pool(); }//!Inequality test for same type//!of node_allocator_basetemplate<unsigned int V, class T, class S, std::size_t NPC> inlinebool operator!=(const node_allocator_base<V, T, S, NPC> &alloc1,                 const node_allocator_base<V, T, S, NPC> &alloc2)   {  return alloc1.get_node_pool() != alloc2.get_node_pool(); }template < class T         , class SegmentManager         , std::size_t NodesPerBlock = 64         >class node_allocator_v1   :  public node_allocator_base         < 1         , T         , SegmentManager         , NodesPerBlock         >{   public:   typedef detail::node_allocator_base         < 1, T, SegmentManager, NodesPerBlock> base_t;   template<class T2>   struct rebind   {        typedef node_allocator_v1<T2, SegmentManager, NodesPerBlock>  other;   };   node_allocator_v1(SegmentManager *segment_mngr)       : base_t(segment_mngr)   {}   template<class T2>   node_allocator_v1      (const node_allocator_v1<T2, SegmentManager, NodesPerBlock> &other)      : base_t(other)   {}};}  //namespace detail{/// @endcond

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?