/* Copyright 2014-2015 Glen Joseph Fernandes (glenjofe@gmail.com) Distributed under the Boost Software License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_NEW_HPP #define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_NEW_HPP #include <boost/align/detail/is_alignment.hpp> #include <boost/align/align.hpp> #include <boost/align/alignment_of.hpp> #include <boost/assert.hpp> #include <new> namespace boost { namespace alignment { inline void* aligned_alloc(std::size_t alignment, std::size_t size) BOOST_NOEXCEPT { BOOST_ASSERT(detail::is_alignment(alignment)); enum { N = alignment_of<void*>::value }; if (alignment < N) { alignment = N; } std::size_t n = size + alignment - N; void* p = ::operator new(sizeof(void*) + n, std::nothrow); if (p) { void* r = static_cast<char*>(p) + sizeof(void*); (void)boost::alignment::align(alignment, size, r, n); *(static_cast<void**>(r) - 1) = p; p = r; } return p; } inline void aligned_free(void* ptr) BOOST_NOEXCEPT { if (ptr) { ::operator delete(*(static_cast<void**>(ptr) - 1)); } } } /* alignment */ } /* boost */ #endif