diff options
Diffstat (limited to '3rdparty/asio/include/asio/execution/allocator.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/execution/allocator.hpp | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/3rdparty/asio/include/asio/execution/allocator.hpp b/3rdparty/asio/include/asio/execution/allocator.hpp new file mode 100644 index 00000000000..cdb6a4a9203 --- /dev/null +++ b/3rdparty/asio/include/asio/execution/allocator.hpp @@ -0,0 +1,278 @@ +// +// execution/allocator.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~ +// +// 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) +// + +#ifndef ASIO_EXECUTION_ALLOCATOR_HPP +#define ASIO_EXECUTION_ALLOCATOR_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" +#include "asio/detail/type_traits.hpp" +#include "asio/execution/executor.hpp" +#include "asio/is_applicable_property.hpp" +#include "asio/traits/query_static_constexpr_member.hpp" +#include "asio/traits/static_query.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { + +#if defined(GENERATING_DOCUMENTATION) + +namespace execution { + +/// A property to describe which allocator an executor will use to allocate the +/// memory required to store a submitted function object. +template <typename ProtoAllocator> +struct allocator_t +{ + /// The allocator_t property applies to executors. + template <typename T> + static constexpr bool is_applicable_property_v = is_executor_v<T>; + + /// The allocator_t property can be required. + static constexpr bool is_requirable = true; + + /// The allocator_t property can be preferred. + static constexpr bool is_preferable = true; + + /// Default constructor. + constexpr allocator_t(); + + /// Obtain the allocator stored in the allocator_t property object. + /** + * Present only if @c ProtoAllocator is non-void. + */ + constexpr ProtoAllocator value() const; + + /// Create an allocator_t object with a different allocator. + /** + * Present only if @c ProtoAllocator is void. + */ + template <typename OtherAllocator> + allocator_t<OtherAllocator operator()(const OtherAllocator& a); +}; + +/// A special value used for accessing the allocator_t property. +constexpr allocator_t<void> allocator; + +} // namespace execution + +#else // defined(GENERATING_DOCUMENTATION) + +namespace execution { + +template <typename ProtoAllocator> +struct allocator_t +{ +#if defined(ASIO_HAS_VARIABLE_TEMPLATES) + template <typename T> + static constexpr bool is_applicable_property_v = is_executor<T>::value; +#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES) + + static constexpr bool is_requirable = true; + static constexpr bool is_preferable = true; + + template <typename T> + struct static_proxy + { +#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + struct type + { + template <typename P> + static constexpr auto query(P&& p) + noexcept( + noexcept( + conditional_t<true, T, P>::query(static_cast<P&&>(p)) + ) + ) + -> decltype( + conditional_t<true, T, P>::query(static_cast<P&&>(p)) + ) + { + return T::query(static_cast<P&&>(p)); + } + }; +#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + typedef T type; +#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + }; + + template <typename T> + struct query_static_constexpr_member : + traits::query_static_constexpr_member< + typename static_proxy<T>::type, allocator_t> {}; + +#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \ + && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + template <typename T> + static constexpr typename query_static_constexpr_member<T>::result_type + static_query() + noexcept(query_static_constexpr_member<T>::is_noexcept) + { + return query_static_constexpr_member<T>::value(); + } + + template <typename E, typename T = decltype(allocator_t::static_query<E>())> + static constexpr const T static_query_v = allocator_t::static_query<E>(); +#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) + // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + + constexpr ProtoAllocator value() const + { + return a_; + } + +private: + friend struct allocator_t<void>; + + explicit constexpr allocator_t(const ProtoAllocator& a) + : a_(a) + { + } + + ProtoAllocator a_; +}; + +#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \ + && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) +template <typename ProtoAllocator> template <typename E, typename T> +const T allocator_t<ProtoAllocator>::static_query_v; +#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) + // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + +template <> +struct allocator_t<void> +{ +#if defined(ASIO_HAS_VARIABLE_TEMPLATES) + template <typename T> + static constexpr bool is_applicable_property_v = is_executor<T>::value; +#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES) + + static constexpr bool is_requirable = true; + static constexpr bool is_preferable = true; + + constexpr allocator_t() + { + } + + template <typename T> + struct static_proxy + { +#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + struct type + { + template <typename P> + static constexpr auto query(P&& p) + noexcept( + noexcept( + conditional_t<true, T, P>::query(static_cast<P&&>(p)) + ) + ) + -> decltype( + conditional_t<true, T, P>::query(static_cast<P&&>(p)) + ) + { + return T::query(static_cast<P&&>(p)); + } + }; +#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + typedef T type; +#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT) + }; + + template <typename T> + struct query_static_constexpr_member : + traits::query_static_constexpr_member< + typename static_proxy<T>::type, allocator_t> {}; + +#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \ + && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + template <typename T> + static constexpr typename query_static_constexpr_member<T>::result_type + static_query() + noexcept(query_static_constexpr_member<T>::is_noexcept) + { + return query_static_constexpr_member<T>::value(); + } + + template <typename E, typename T = decltype(allocator_t::static_query<E>())> + static constexpr const T static_query_v = allocator_t::static_query<E>(); +#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) + // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + + template <typename OtherProtoAllocator> + constexpr allocator_t<OtherProtoAllocator> operator()( + const OtherProtoAllocator& a) const + { + return allocator_t<OtherProtoAllocator>(a); + } +}; + +#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \ + && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) +template <typename E, typename T> +const T allocator_t<void>::static_query_v; +#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) + // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + +constexpr allocator_t<void> allocator; + +} // namespace execution + +#if !defined(ASIO_HAS_VARIABLE_TEMPLATES) + +template <typename T, typename ProtoAllocator> +struct is_applicable_property<T, execution::allocator_t<ProtoAllocator>> + : integral_constant<bool, execution::is_executor<T>::value> +{ +}; + +#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES) + +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \ + || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + +template <typename T, typename ProtoAllocator> +struct static_query<T, execution::allocator_t<ProtoAllocator>, + enable_if_t< + execution::allocator_t<ProtoAllocator>::template + query_static_constexpr_member<T>::is_valid + >> +{ + static constexpr bool is_valid = true; + static constexpr bool is_noexcept = true; + + typedef typename execution::allocator_t<ProtoAllocator>::template + query_static_constexpr_member<T>::result_type result_type; + + static constexpr result_type value() + { + return execution::allocator_t<ProtoAllocator>::template + query_static_constexpr_member<T>::value(); + } +}; + +#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) + // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES) + +} // namespace traits + +#endif // defined(GENERATING_DOCUMENTATION) + +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#endif // ASIO_EXECUTION_ALLOCATOR_HPP |