summaryrefslogtreecommitdiff
path: root/boost/align/aligned_allocator_adaptor.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/align/aligned_allocator_adaptor.hpp')
-rw-r--r--boost/align/aligned_allocator_adaptor.hpp57
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);
}
};