adaptive_pool.hpp

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

HPP
468
字号
////////////////////////////////////////////////////////////////////////////////// (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_ADAPTIVE_POOL_HPP#define BOOST_INTERPROCESS_ADAPTIVE_POOL_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/adaptive_node_pool.hpp>#include <boost/interprocess/exceptions.hpp>#include <boost/interprocess/allocators/detail/allocator_common.hpp>#include <boost/interprocess/detail/mpl.hpp>#include <memory>#include <algorithm>#include <cstddef>//!\file//!Describes adaptive_pool pooled shared memory STL compatible allocator namespace boost {namespace interprocess {/// @condnamespace detail{template < unsigned int Version         , class T         , class SegmentManager         , std::size_t NodesPerBlock         , std::size_t MaxFreeBlocks         , unsigned char OverheadPercent         >class adaptive_pool_base   : public node_pool_allocation_impl   < adaptive_pool_base      < Version, T, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent>   , Version   , T   , SegmentManager   >{   public:   typedef typename SegmentManager::void_pointer         void_pointer;   typedef SegmentManager                                segment_manager;   typedef adaptive_pool_base      <Version, T, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent>   self_t;   /// @cond   template <int dummy>   struct node_pool   {      typedef detail::shared_adaptive_node_pool      < SegmentManager, sizeof_value<T>::value, NodesPerBlock, MaxFreeBlocks, OverheadPercent> 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<adaptive_pool_base, Version>   version;   typedef transform_iterator      < typename SegmentManager::         multiallocation_iterator      , detail::cast_functor <T> >              multiallocation_iterator;   typedef typename SegmentManager::      multiallocation_chain                     multiallocation_chain;   //!Obtains adaptive_pool_base from    //!adaptive_pool_base   template<class T2>   struct rebind   {        typedef adaptive_pool_base<Version, T2, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent>       other;   };   /// @cond   private:   //!Not assignable from related adaptive_pool_base   template<unsigned int Version2, class T2, class SegmentManager2, std::size_t N2, std::size_t F2, unsigned char O2>   adaptive_pool_base& operator=      (const adaptive_pool_base<Version2, T2, SegmentManager2, N2, F2, O2>&);   /// @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   adaptive_pool_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 adaptive_pool_base. Increments the reference    //!count of the associated node pool. Never throws   adaptive_pool_base(const adaptive_pool_base &other)       : mp_node_pool(other.get_node_pool())    {        node_pool<0>::get(detail::get_pointer(mp_node_pool))->inc_ref_count();      }   //!Assignment from other adaptive_pool_base   adaptive_pool_base& operator=(const adaptive_pool_base &other)   {      adaptive_pool_base c(other);      swap(*this, c);      return *this;   }   //!Copy constructor from related adaptive_pool_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>   adaptive_pool_base      (const adaptive_pool_base<Version, T2, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent> &other)      : mp_node_pool(detail::get_or_create_node_pool<typename node_pool<0>::type>(other.get_segment_manager())) { }   //!Destructor, removes node_pool_t from memory   //!if its reference count reaches to zero. Never throws   ~adaptive_pool_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 adaptive_pool_basetemplate<unsigned int V, class T, class S, std::size_t NPC, std::size_t F, unsigned char OP> inlinebool operator==(const adaptive_pool_base<V, T, S, NPC, F, OP> &alloc1,                 const adaptive_pool_base<V, T, S, NPC, F, OP> &alloc2)   {  return alloc1.get_node_pool() == alloc2.get_node_pool(); }//!Inequality test for same type//!of adaptive_pool_basetemplate<unsigned int V, class T, class S, std::size_t NPC, std::size_t F, unsigned char OP> inlinebool operator!=(const adaptive_pool_base<V, T, S, NPC, F, OP> &alloc1,                 const adaptive_pool_base<V, T, S, NPC, F, OP> &alloc2)   {  return alloc1.get_node_pool() != alloc2.get_node_pool(); }template < class T         , class SegmentManager         , std::size_t NodesPerBlock = 64         , std::size_t MaxFreeBlocks = 2         , unsigned char OverheadPercent = 5         >class adaptive_pool_v1   :  public adaptive_pool_base         < 1         , T         , SegmentManager         , NodesPerBlock         , MaxFreeBlocks         , OverheadPercent         >{   public:   typedef detail::adaptive_pool_base         < 1, T, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent> base_t;   template<class T2>   struct rebind   {        typedef adaptive_pool_v1<T2, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent>  other;   };   adaptive_pool_v1(SegmentManager *segment_mngr)       : base_t(segment_mngr)   {}   template<class T2>   adaptive_pool_v1      (const adaptive_pool_v1<T2, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent> &other)      : base_t(other)   {}};}  //namespace detail{/// @endcond//!An STL node allocator that uses a segment manager as memory //!source. The internal pointer type will of the same type (raw, smart) as//!"typename SegmentManager::void_pointer" type. This allows

⌨️ 快捷键说明

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