Chris@102: /* Chris@102: (c) 2014 Glen Joseph Fernandes Chris@102: glenjofe at gmail dot com Chris@102: Chris@102: Distributed under the Boost Software Chris@102: License, Version 1.0. Chris@102: http://boost.org/LICENSE_1_0.txt Chris@102: */ Chris@102: #ifndef BOOST_ALIGN_ALIGNED_ALLOCATOR_HPP Chris@102: #define BOOST_ALIGN_ALIGNED_ALLOCATOR_HPP Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@102: #include Chris@102: #endif Chris@102: Chris@102: namespace boost { Chris@102: namespace alignment { Chris@102: template Chris@102: class aligned_allocator { Chris@102: BOOST_STATIC_ASSERT(detail:: Chris@102: is_alignment_constant::value); Chris@102: Chris@102: public: Chris@102: typedef T value_type; Chris@102: typedef T* pointer; Chris@102: typedef const T* const_pointer; Chris@102: typedef void* void_pointer; Chris@102: typedef const void* const_void_pointer; Chris@102: typedef std::size_t size_type; Chris@102: typedef std::ptrdiff_t difference_type; Chris@102: typedef T& reference; Chris@102: typedef const T& const_reference; Chris@102: Chris@102: private: Chris@102: typedef detail::max_align::value> MaxAlign; Chris@102: Chris@102: public: Chris@102: template Chris@102: struct rebind { Chris@102: typedef aligned_allocator other; Chris@102: }; Chris@102: Chris@102: #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) Chris@102: aligned_allocator() Chris@102: BOOST_NOEXCEPT = default; Chris@102: #else Chris@102: aligned_allocator() Chris@102: BOOST_NOEXCEPT { Chris@102: } Chris@102: #endif Chris@102: Chris@102: template Chris@102: aligned_allocator(const aligned_allocator&) BOOST_NOEXCEPT { Chris@102: } Chris@102: Chris@102: pointer address(reference value) const Chris@102: BOOST_NOEXCEPT { Chris@102: return detail::addressof(value); Chris@102: } Chris@102: Chris@102: const_pointer address(const_reference value) const Chris@102: BOOST_NOEXCEPT { Chris@102: return detail::addressof(value); Chris@102: } Chris@102: Chris@102: pointer allocate(size_type size, Chris@102: const_void_pointer = 0) { Chris@102: void* p = aligned_alloc(MaxAlign::value, Chris@102: sizeof(T) * size); Chris@102: if (!p && size > 0) { Chris@102: boost::throw_exception(std::bad_alloc()); Chris@102: } Chris@102: return static_cast(p); Chris@102: } Chris@102: Chris@102: void deallocate(pointer ptr, size_type) { Chris@102: alignment::aligned_free(ptr); Chris@102: } Chris@102: Chris@102: BOOST_CONSTEXPR size_type max_size() const Chris@102: BOOST_NOEXCEPT { Chris@102: return detail::max_count_of::value; Chris@102: } Chris@102: Chris@102: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@102: #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@102: template Chris@102: void construct(U* ptr, Args&&... args) { Chris@102: void* p = ptr; Chris@102: ::new(p) U(std::forward(args)...); Chris@102: } Chris@102: #else Chris@102: template Chris@102: void construct(U* ptr, V&& value) { Chris@102: void* p = ptr; Chris@102: ::new(p) U(std::forward(value)); Chris@102: } Chris@102: #endif Chris@102: #else Chris@102: template Chris@102: void construct(U* ptr, const V& value) { Chris@102: void* p = ptr; Chris@102: ::new(p) U(value); Chris@102: } Chris@102: #endif Chris@102: Chris@102: template Chris@102: void construct(U* ptr) { Chris@102: void* p = ptr; Chris@102: ::new(p) U(); Chris@102: } Chris@102: Chris@102: template Chris@102: void destroy(U* ptr) { Chris@102: (void)ptr; Chris@102: ptr->~U(); Chris@102: } Chris@102: }; Chris@102: Chris@102: template Chris@102: class aligned_allocator { Chris@102: BOOST_STATIC_ASSERT(detail:: Chris@102: is_alignment_constant::value); Chris@102: Chris@102: public: Chris@102: typedef void value_type; Chris@102: typedef void* pointer; Chris@102: typedef const void* const_pointer; Chris@102: Chris@102: template Chris@102: struct rebind { Chris@102: typedef aligned_allocator other; Chris@102: }; Chris@102: }; Chris@102: Chris@102: template Chris@102: inline bool operator==(const aligned_allocator&, const aligned_allocator&) BOOST_NOEXCEPT Chris@102: { Chris@102: return true; Chris@102: } Chris@102: Chris@102: template Chris@102: inline bool operator!=(const aligned_allocator&, const aligned_allocator&) BOOST_NOEXCEPT Chris@102: { Chris@102: return false; Chris@102: } Chris@102: } Chris@102: } Chris@102: Chris@102: #endif