1//
2// traits/static_require.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~~~
4//
5// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6//
7// Distributed under the Boost Software License, Version 1.0. (See accompanying
8// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9//
10
11#ifndef BOOST_ASIO_TRAITS_STATIC_REQUIRE_HPP
12#define BOOST_ASIO_TRAITS_STATIC_REQUIRE_HPP
13
14#if defined(_MSC_VER) && (_MSC_VER >= 1200)
15# pragma once
16#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
18#include <boost/asio/detail/config.hpp>
19#include <boost/asio/detail/type_traits.hpp>
20#include <boost/asio/traits/static_query.hpp>
21
22#define BOOST_ASIO_HAS_DEDUCED_STATIC_REQUIRE_TRAIT 1
23
24#include <boost/asio/detail/push_options.hpp>
25
26namespace boost {
27namespace asio {
28namespace traits {
29
30template <typename T, typename Property, typename = void>
31struct static_require_default;
32
33template <typename T, typename Property, typename = void>
34struct static_require;
35
36} // namespace traits
37namespace detail {
38
39struct no_static_require
40{
41 static constexpr bool is_valid = false;
42};
43
44template <typename T, typename Property, typename = void>
45struct static_require_trait :
46 conditional_t<
47 is_same<T, decay_t<T>>::value
48 && is_same<Property, decay_t<Property>>::value,
49 no_static_require,
50 traits::static_require<
51 decay_t<T>,
52 decay_t<Property>>
53 >
54{
55};
56
57#if defined(BOOST_ASIO_HAS_WORKING_EXPRESSION_SFINAE)
58
59template <typename T, typename Property>
60struct static_require_trait<T, Property,
61 enable_if_t<
62 decay_t<Property>::value() == traits::static_query<T, Property>::value()
63 >>
64{
65 static constexpr bool is_valid = true;
66};
67
68#else // defined(BOOST_ASIO_HAS_WORKING_EXPRESSION_SFINAE)
69
70false_type static_require_test(...);
71
72template <typename T, typename Property>
73true_type static_require_test(T*, Property*,
74 enable_if_t<
75 Property::value() == traits::static_query<T, Property>::value()
76 >* = 0);
77
78template <typename T, typename Property>
79struct has_static_require
80{
81 static constexpr bool value =
82 decltype((static_require_test)(
83 static_cast<T*>(0), static_cast<Property*>(0)))::value;
84};
85
86template <typename T, typename Property>
87struct static_require_trait<T, Property,
88 enable_if_t<
89 has_static_require<decay_t<T>,
90 decay_t<Property>>::value
91 >>
92{
93 static constexpr bool is_valid = true;
94};
95
96#endif // defined(BOOST_ASIO_HAS_WORKING_EXPRESSION_SFINAE)
97
98} // namespace detail
99namespace traits {
100
101template <typename T, typename Property, typename>
102struct static_require_default : detail::static_require_trait<T, Property>
103{
104};
105
106template <typename T, typename Property, typename>
107struct static_require : static_require_default<T, Property>
108{
109};
110
111} // namespace traits
112} // namespace asio
113} // namespace boost
114
115#include <boost/asio/detail/pop_options.hpp>
116
117#endif // BOOST_ASIO_TRAITS_STATIC_REQUIRE_HPP
118

source code of boost/libs/asio/include/boost/asio/traits/static_require.hpp