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 + -
显示快捷键?