diff options
Diffstat (limited to 'boost/align/aligned_allocator_adaptor.hpp')
-rw-r--r-- | boost/align/aligned_allocator_adaptor.hpp | 57 |
1 files changed, 26 insertions, 31 deletions
diff --git a/boost/align/aligned_allocator_adaptor.hpp b/boost/align/aligned_allocator_adaptor.hpp index 19777173f1..29d13874ad 100644 --- a/boost/align/aligned_allocator_adaptor.hpp +++ b/boost/align/aligned_allocator_adaptor.hpp @@ -9,15 +9,14 @@ http://boost.org/LICENSE_1_0.txt #ifndef BOOST_ALIGN_ALIGNED_ALLOCATOR_ADAPTOR_HPP #define BOOST_ALIGN_ALIGNED_ALLOCATOR_ADAPTOR_HPP -#include <boost/config.hpp> -#include <boost/static_assert.hpp> -#include <boost/align/align.hpp> -#include <boost/align/aligned_allocator_adaptor_forward.hpp> -#include <boost/align/alignment_of.hpp> #include <boost/align/detail/addressof.hpp> #include <boost/align/detail/is_alignment_constant.hpp> #include <boost/align/detail/max_align.hpp> #include <boost/align/detail/max_size.hpp> +#include <boost/align/align.hpp> +#include <boost/align/aligned_allocator_adaptor_forward.hpp> +#include <boost/align/alignment_of.hpp> +#include <boost/static_assert.hpp> #include <new> #if !defined(BOOST_NO_CXX11_ALLOCATOR) @@ -54,10 +53,6 @@ class aligned_allocator_adaptor typedef typename char_alloc::pointer char_ptr; #endif - enum { - ptr_align = alignment_of<char_ptr>::value - }; - public: #if !defined(BOOST_NO_CXX11_ALLOCATOR) typedef typename traits::value_type value_type; @@ -127,44 +122,44 @@ public: } pointer allocate(size_type size) { - std::size_t n1 = size * sizeof(value_type); - std::size_t n2 = n1 + min_align - ptr_align; + std::size_t s = size * sizeof(value_type); + std::size_t n = s + min_align - 1; char_alloc a(base()); - char_ptr p1 = a.allocate(sizeof p1 + n2); - void* p2 = detail::addressof(*p1) + sizeof p1; - (void)align(min_align, n1, p2, n2); - void* p3 = static_cast<char_ptr*>(p2) - 1; - ::new(p3) char_ptr(p1); - return static_cast<pointer>(p2); + char_ptr p = a.allocate(sizeof p + n); + void* r = detail::addressof(*p) + sizeof p; + (void)align(min_align, s, r, n); + ::new(static_cast<void*>(static_cast<char_ptr*>(r) - + 1)) char_ptr(p); + return static_cast<pointer>(r); } pointer allocate(size_type size, const_void_pointer hint) { - std::size_t n1 = size * sizeof(value_type); - std::size_t n2 = n1 + min_align - ptr_align; + std::size_t s = size * sizeof(value_type); + std::size_t n = s + min_align - 1; char_ptr h = char_ptr(); if (hint) { h = *(static_cast<const char_ptr*>(hint) - 1); } char_alloc a(base()); #if !defined(BOOST_NO_CXX11_ALLOCATOR) - char_ptr p1 = char_traits::allocate(a, sizeof p1 + n2, h); + char_ptr p = char_traits::allocate(a, sizeof p + n, h); #else - char_ptr p1 = a.allocate(sizeof p1 + n2, h); + char_ptr p = a.allocate(sizeof p + n, h); #endif - void* p2 = detail::addressof(*p1) + sizeof p1; - (void)align(min_align, n1, p2, n2); - void* p3 = static_cast<char_ptr*>(p2) - 1; - ::new(p3) char_ptr(p1); - return static_cast<pointer>(p2); + void* r = detail::addressof(*p) + sizeof p; + (void)align(min_align, s, r, n); + ::new(static_cast<void*>(static_cast<char_ptr*>(r) - + 1)) char_ptr(p); + return static_cast<pointer>(r); } void deallocate(pointer ptr, size_type size) { - char_ptr* p1 = reinterpret_cast<char_ptr*>(ptr) - 1; - char_ptr p2 = *p1; - p1->~char_ptr(); + char_ptr* p = reinterpret_cast<char_ptr*>(ptr) - 1; + char_ptr r = *p; + p->~char_ptr(); char_alloc a(base()); - a.deallocate(p2, size * sizeof(value_type) + - min_align - ptr_align + sizeof p2); + a.deallocate(r, sizeof r + size * sizeof(value_type) + + min_align - 1); } }; |