private_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_PRIVATE_ADAPTIVE_POOL_HPP#define BOOST_INTERPROCESS_PRIVATE_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/allocators/detail/adaptive_node_pool.hpp>#include <boost/interprocess/exceptions.hpp>#include <boost/interprocess/detail/utilities.hpp>#include <boost/interprocess/detail/workaround.hpp>#include <memory>#include <algorithm>#include <cstddef>//!\file//!Describes private_adaptive_pool_base 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 private_adaptive_pool_base   : public node_pool_allocation_impl   < private_adaptive_pool_base < Version, T, SegmentManager, NodesPerBlock                                , MaxFreeBlocks, OverheadPercent>   , Version   , T   , SegmentManager   >{   public:   //Segment manager   typedef SegmentManager                                segment_manager;   typedef typename SegmentManager::void_pointer         void_pointer;   /// @cond   private:   typedef private_adaptive_pool_base      < Version, T, SegmentManager, NodesPerBlock      , MaxFreeBlocks, OverheadPercent>                  self_t;   typedef detail::private_adaptive_node_pool      <SegmentManager      , sizeof_value<T>::value      , NodesPerBlock      , MaxFreeBlocks      , OverheadPercent      > node_pool_t;   BOOST_STATIC_ASSERT((Version <=2));   /// @endcond   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      <private_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 node_allocator from other node_allocator   template<class T2>   struct rebind   {        typedef private_adaptive_pool_base         <Version, T2, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent>   other;   };   /// @cond   template <int dummy>   struct node_pool   {      typedef detail::private_adaptive_node_pool      <SegmentManager      , sizeof_value<T>::value      , NodesPerBlock      , MaxFreeBlocks      , OverheadPercent      > type;      static type *get(void *p)      {  return static_cast<type*>(p);  }   };   private:   //!Not assignable from related private_adaptive_pool_base   template<unsigned int Version2, class T2, class MemoryAlgorithm2, std::size_t N2, std::size_t F2, unsigned char OP2>   private_adaptive_pool_base& operator=      (const private_adaptive_pool_base<Version2, T2, MemoryAlgorithm2, N2, F2, OP2>&);   //!Not assignable from other private_adaptive_pool_base   private_adaptive_pool_base& operator=(const private_adaptive_pool_base&);   /// @endcond   public:   //!Constructor from a segment manager   private_adaptive_pool_base(segment_manager *segment_mngr)      : m_node_pool(segment_mngr)   {}   //!Copy constructor from other private_adaptive_pool_base. Never throws   private_adaptive_pool_base(const private_adaptive_pool_base &other)      : m_node_pool(other.get_segment_manager())   {}   //!Copy constructor from related private_adaptive_pool_base. Never throws.   template<class T2>   private_adaptive_pool_base      (const private_adaptive_pool_base         <Version, T2, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent> &other)      : m_node_pool(other.get_segment_manager())   {}   //!Destructor, frees all used memory. Never throws   ~private_adaptive_pool_base()    {}   //!Returns the segment manager. Never throws   segment_manager* get_segment_manager()const   {  return m_node_pool.get_segment_manager(); }   //!Returns the internal node pool. Never throws   node_pool_t* get_node_pool() const   {  return const_cast<node_pool_t*>(&m_node_pool); }   //!Swaps allocators. Does not throw. If each allocator is placed in a   //!different shared memory segments, the result is undefined.   friend void swap(self_t &alloc1,self_t &alloc2)   {  alloc1.m_node_pool.swap(alloc2.m_node_pool);  }   /// @cond   private:   node_pool_t m_node_pool;   /// @endcond};//!Equality test for same type of private_adaptive_pool_basetemplate<unsigned int V, class T, class S, std::size_t NodesPerBlock, std::size_t F, unsigned char OP> inlinebool operator==(const private_adaptive_pool_base<V, T, S, NodesPerBlock, F, OP> &alloc1,                 const private_adaptive_pool_base<V, T, S, NodesPerBlock, F, OP> &alloc2){  return &alloc1 == &alloc2; }//!Inequality test for same type of private_adaptive_pool_basetemplate<unsigned int V, class T, class S, std::size_t NodesPerBlock, std::size_t F, unsigned char OP> inlinebool operator!=(const private_adaptive_pool_base<V, T, S, NodesPerBlock, F, OP> &alloc1,                 const private_adaptive_pool_base<V, T, S, NodesPerBlock, F, OP> &alloc2){  return &alloc1 != &alloc2; }template < class T         , class SegmentManager         , std::size_t NodesPerBlock = 64         , std::size_t MaxFreeBlocks = 2         , unsigned char OverheadPercent = 5         >class private_adaptive_pool_v1   :  public private_adaptive_pool_base         < 1         , T         , SegmentManager         , NodesPerBlock         , MaxFreeBlocks         , OverheadPercent         >{   public:   typedef detail::private_adaptive_pool_base         < 1, T, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent> base_t;   template<class T2>   struct rebind   {        typedef private_adaptive_pool_v1<T2, SegmentManager, NodesPerBlock, MaxFreeBlocks, OverheadPercent>  other;   };   private_adaptive_pool_v1(SegmentManager *segment_mngr)       : base_t(segment_mngr)   {}   template<class T2>   private_adaptive_pool_v1      (const private_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//!placing the allocator in shared memory, memory mapped-files, etc...

⌨️ 快捷键说明

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