diff options
Diffstat (limited to '3rdparty/asio/include/asio/detail/memory.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/detail/memory.hpp | 77 |
1 files changed, 73 insertions, 4 deletions
diff --git a/3rdparty/asio/include/asio/detail/memory.hpp b/3rdparty/asio/include/asio/detail/memory.hpp index 51f45329b62..d61dfa5788c 100644 --- a/3rdparty/asio/include/asio/detail/memory.hpp +++ b/3rdparty/asio/include/asio/detail/memory.hpp @@ -2,7 +2,7 @@ // detail/memory.hpp // ~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -16,9 +16,14 @@ #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" +#include <cstddef> +#include <cstdlib> #include <memory> +#include <new> +#include "asio/detail/throw_exception.hpp" #if !defined(ASIO_HAS_STD_SHARED_PTR) +# include <boost/make_shared.hpp> # include <boost/shared_ptr.hpp> # include <boost/weak_ptr.hpp> #endif // !defined(ASIO_HAS_STD_SHARED_PTR) @@ -27,13 +32,23 @@ # include <boost/utility/addressof.hpp> #endif // !defined(ASIO_HAS_STD_ADDRESSOF) +#if !defined(ASIO_HAS_STD_ALIGNED_ALLOC) \ + && defined(ASIO_HAS_BOOST_ALIGN) \ + && defined(ASIO_HAS_ALIGNOF) +# include <boost/align/aligned_alloc.hpp> +#endif // !defined(ASIO_HAS_STD_ALIGNED_ALLOC) + // && defined(ASIO_HAS_BOOST_ALIGN) + // && defined(ASIO_HAS_ALIGNOF) + namespace asio { namespace detail { #if defined(ASIO_HAS_STD_SHARED_PTR) +using std::make_shared; using std::shared_ptr; using std::weak_ptr; #else // defined(ASIO_HAS_STD_SHARED_PTR) +using boost::make_shared; using boost::shared_ptr; using boost::weak_ptr; #endif // defined(ASIO_HAS_STD_SHARED_PTR) @@ -46,7 +61,7 @@ using boost::addressof; } // namespace detail -#if defined(ASIO_HAS_NULLPTR) +#if defined(ASIO_HAS_CXX11_ALLOCATORS) using std::allocator_arg_t; # define ASIO_USES_ALLOCATOR(t) \ namespace std { \ @@ -54,10 +69,64 @@ using std::allocator_arg_t; struct uses_allocator<t, Allocator> : true_type {}; \ } \ /**/ -#else // defined(ASIO_HAS_NULLPTR) +# define ASIO_REBIND_ALLOC(alloc, t) \ + typename std::allocator_traits<alloc>::template rebind_alloc<t> + /**/ +#else // defined(ASIO_HAS_CXX11_ALLOCATORS) struct allocator_arg_t {}; # define ASIO_USES_ALLOCATOR(t) -#endif // defined(ASIO_HAS_NULLPTR) +# define ASIO_REBIND_ALLOC(alloc, t) \ + typename alloc::template rebind<t>::other + /**/ +#endif // defined(ASIO_HAS_CXX11_ALLOCATORS) + +inline void* aligned_new(std::size_t align, std::size_t size) +{ +#if defined(ASIO_HAS_STD_ALIGNED_ALLOC) && defined(ASIO_HAS_ALIGNOF) + size = (size % align == 0) ? size : size + (align - size % align); + void* ptr = std::aligned_alloc(align, size); + if (!ptr) + { + std::bad_alloc ex; + asio::detail::throw_exception(ex); + } + return ptr; +#elif defined(ASIO_HAS_BOOST_ALIGN) && defined(ASIO_HAS_ALIGNOF) + size = (size % align == 0) ? size : size + (align - size % align); + void* ptr = boost::alignment::aligned_alloc(align, size); + if (!ptr) + { + std::bad_alloc ex; + asio::detail::throw_exception(ex); + } + return ptr; +#elif defined(ASIO_MSVC) && defined(ASIO_HAS_ALIGNOF) + size = (size % align == 0) ? size : size + (align - size % align); + void* ptr = _aligned_malloc(size, align); + if (!ptr) + { + std::bad_alloc ex; + asio::detail::throw_exception(ex); + } + return ptr; +#else // defined(ASIO_MSVC) && defined(ASIO_HAS_ALIGNOF) + (void)align; + return ::operator new(size); +#endif // defined(ASIO_MSVC) && defined(ASIO_HAS_ALIGNOF) +} + +inline void aligned_delete(void* ptr) +{ +#if defined(ASIO_HAS_STD_ALIGNED_ALLOC) && defined(ASIO_HAS_ALIGNOF) + std::free(ptr); +#elif defined(ASIO_HAS_BOOST_ALIGN) && defined(ASIO_HAS_ALIGNOF) + boost::alignment::aligned_free(ptr); +#elif defined(ASIO_MSVC) && defined(ASIO_HAS_ALIGNOF) + _aligned_free(ptr); +#else // defined(ASIO_MSVC) && defined(ASIO_HAS_ALIGNOF) + ::operator delete(ptr); +#endif // defined(ASIO_MSVC) && defined(ASIO_HAS_ALIGNOF) +} } // namespace asio |