diff options
Diffstat (limited to '3rdparty/asio/include/asio/detail/memory.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/detail/memory.hpp | 110 |
1 files changed, 86 insertions, 24 deletions
diff --git a/3rdparty/asio/include/asio/detail/memory.hpp b/3rdparty/asio/include/asio/detail/memory.hpp index 51f45329b62..173e49fe065 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-2024 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,37 +16,49 @@ #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" +#include <cstddef> +#include <cstdlib> #include <memory> +#include <new> +#include "asio/detail/cstdint.hpp" +#include "asio/detail/throw_exception.hpp" -#if !defined(ASIO_HAS_STD_SHARED_PTR) -# include <boost/shared_ptr.hpp> -# include <boost/weak_ptr.hpp> -#endif // !defined(ASIO_HAS_STD_SHARED_PTR) - -#if !defined(ASIO_HAS_STD_ADDRESSOF) -# include <boost/utility/addressof.hpp> -#endif // !defined(ASIO_HAS_STD_ADDRESSOF) +#if !defined(ASIO_HAS_STD_ALIGNED_ALLOC) \ + && defined(ASIO_HAS_BOOST_ALIGN) +# include <boost/align/aligned_alloc.hpp> +#endif // !defined(ASIO_HAS_STD_ALIGNED_ALLOC) + // && defined(ASIO_HAS_BOOST_ALIGN) namespace asio { namespace detail { -#if defined(ASIO_HAS_STD_SHARED_PTR) +using std::allocate_shared; +using std::make_shared; using std::shared_ptr; using std::weak_ptr; -#else // defined(ASIO_HAS_STD_SHARED_PTR) -using boost::shared_ptr; -using boost::weak_ptr; -#endif // defined(ASIO_HAS_STD_SHARED_PTR) - -#if defined(ASIO_HAS_STD_ADDRESSOF) using std::addressof; -#else // defined(ASIO_HAS_STD_ADDRESSOF) -using boost::addressof; -#endif // defined(ASIO_HAS_STD_ADDRESSOF) + +#if defined(ASIO_HAS_STD_TO_ADDRESS) +using std::to_address; +#else // defined(ASIO_HAS_STD_TO_ADDRESS) +template <typename T> +inline T* to_address(T* p) { return p; } +template <typename T> +inline const T* to_address(const T* p) { return p; } +template <typename T> +inline volatile T* to_address(volatile T* p) { return p; } +template <typename T> +inline const volatile T* to_address(const volatile T* p) { return p; } +#endif // defined(ASIO_HAS_STD_TO_ADDRESS) + +inline void* align(std::size_t alignment, + std::size_t size, void*& ptr, std::size_t& space) +{ + return std::align(alignment, size, ptr, space); +} } // namespace detail -#if defined(ASIO_HAS_NULLPTR) using std::allocator_arg_t; # define ASIO_USES_ALLOCATOR(t) \ namespace std { \ @@ -54,10 +66,60 @@ using std::allocator_arg_t; struct uses_allocator<t, Allocator> : true_type {}; \ } \ /**/ -#else // defined(ASIO_HAS_NULLPTR) -struct allocator_arg_t {}; -# define ASIO_USES_ALLOCATOR(t) -#endif // defined(ASIO_HAS_NULLPTR) +# define ASIO_REBIND_ALLOC(alloc, t) \ + typename std::allocator_traits<alloc>::template rebind_alloc<t> + /**/ + +inline void* aligned_new(std::size_t align, std::size_t size) +{ +#if defined(ASIO_HAS_STD_ALIGNED_ALLOC) + align = (align < ASIO_DEFAULT_ALIGN) ? ASIO_DEFAULT_ALIGN : align; + 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) + align = (align < ASIO_DEFAULT_ALIGN) ? ASIO_DEFAULT_ALIGN : align; + 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) + align = (align < ASIO_DEFAULT_ALIGN) ? ASIO_DEFAULT_ALIGN : align; + 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) + (void)align; + return ::operator new(size); +#endif // defined(ASIO_MSVC) +} + +inline void aligned_delete(void* ptr) +{ +#if defined(ASIO_HAS_STD_ALIGNED_ALLOC) + std::free(ptr); +#elif defined(ASIO_HAS_BOOST_ALIGN) + boost::alignment::aligned_free(ptr); +#elif defined(ASIO_MSVC) + _aligned_free(ptr); +#else // defined(ASIO_MSVC) + ::operator delete(ptr); +#endif // defined(ASIO_MSVC) +} } // namespace asio |