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