/* 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_HPP #define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_HPP #include #include #include #include #include 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::value }; if (alignment < N) { alignment = N; } std::size_t n = size + alignment - N; void* p = std::malloc(sizeof(void*) + n); if (p) { void* r = static_cast(p) + sizeof(void*); (void)align(alignment, size, r, n); *(static_cast(r) - 1) = p; p = r; } return p; } inline void aligned_free(void* ptr) BOOST_NOEXCEPT { if (ptr) { std::free(*(static_cast(ptr) - 1)); } } } /* alignment */ } /* boost */ #endif