1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost 4 // Software License, Version 1.0. (See accompanying file 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // See http://www.boost.org/libs/container for documentation. 8 // 9 ////////////////////////////////////////////////////////////////////////////// 10 11 #ifndef BOOST_CONTAINER_DETAIL_POOL_COMMON_ALLOC_HPP 12 #define BOOST_CONTAINER_DETAIL_POOL_COMMON_ALLOC_HPP 13 14 #ifndef BOOST_CONFIG_HPP 15 # include <boost/config.hpp> 16 #endif 17 18 #if defined(BOOST_HAS_PRAGMA_ONCE) 19 # pragma once 20 #endif 21 22 #include <boost/container/detail/config_begin.hpp> 23 #include <boost/container/detail/workaround.hpp> 24 #include <boost/container/throw_exception.hpp> 25 26 #include <boost/intrusive/slist.hpp> 27 #include <boost/container/detail/pool_common.hpp> 28 #include <boost/container/detail/alloc_lib.h> 29 #include <cstddef> 30 31 namespace boost{ 32 namespace container{ 33 namespace container_detail{ 34 35 struct node_slist_helper 36 : public boost::container::container_detail::node_slist<void*> 37 {}; 38 39 struct fake_segment_manager 40 { 41 typedef void * void_pointer; 42 static const std::size_t PayloadPerAllocation = BOOST_CONTAINER_ALLOCATION_PAYLOAD; 43 44 typedef boost::container::container_detail:: 45 basic_multiallocation_chain<void*> multiallocation_chain; deallocateboost::container::container_detail::fake_segment_manager46 static void deallocate(void_pointer p) 47 { boost_cont_free(p); } 48 deallocate_manyboost::container::container_detail::fake_segment_manager49 static void deallocate_many(multiallocation_chain &chain) 50 { 51 std::size_t size = chain.size(); 52 std::pair<void*, void*> ptrs = chain.extract_data(); 53 boost_cont_memchain dlchain; 54 BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&dlchain, ptrs.first, ptrs.second, size); 55 boost_cont_multidealloc(&dlchain); 56 } 57 58 typedef std::ptrdiff_t difference_type; 59 typedef std::size_t size_type; 60 allocate_alignedboost::container::container_detail::fake_segment_manager61 static void *allocate_aligned(std::size_t nbytes, std::size_t alignment) 62 { 63 void *ret = boost_cont_memalign(nbytes, alignment); 64 if(!ret) 65 boost::container::throw_bad_alloc(); 66 return ret; 67 } 68 allocateboost::container::container_detail::fake_segment_manager69 static void *allocate(std::size_t nbytes) 70 { 71 void *ret = boost_cont_malloc(nbytes); 72 if(!ret) 73 boost::container::throw_bad_alloc(); 74 return ret; 75 } 76 }; 77 78 } //namespace boost{ 79 } //namespace container{ 80 } //namespace container_detail{ 81 82 namespace boost { 83 namespace container { 84 namespace container_detail { 85 86 template<class T> 87 struct is_stateless_segment_manager; 88 89 template<> 90 struct is_stateless_segment_manager 91 <boost::container::container_detail::fake_segment_manager> 92 { 93 static const bool value = true; 94 }; 95 96 } //namespace container_detail { 97 } //namespace container { 98 } //namespace boost { 99 100 #include <boost/container/detail/config_end.hpp> 101 102 #endif //BOOST_CONTAINER_DETAIL_POOL_COMMON_ALLOC_HPP 103