File indexing completed on 2025-01-18 10:09:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef RANGES_V3_DETAIL_ADL_GET_HPP
0013 #define RANGES_V3_DETAIL_ADL_GET_HPP
0014
0015 #include <cstddef>
0016
0017 #include <concepts/concepts.hpp>
0018
0019 #include <range/v3/range_fwd.hpp>
0020
0021 #include <range/v3/detail/prologue.hpp>
0022
0023 namespace ranges
0024 {
0025
0026 namespace detail
0027 {
0028 namespace _adl_get_
0029 {
0030 template<typename>
0031 void get();
0032
0033 template<std::size_t I, typename TupleLike>
0034 constexpr auto adl_get(TupleLike && t) noexcept
0035 -> decltype(get<I>(static_cast<TupleLike &&>(t)))
0036 {
0037 return get<I>(static_cast<TupleLike &&>(t));
0038 }
0039 template<typename T, typename TupleLike>
0040 constexpr auto adl_get(TupleLike && t) noexcept
0041 -> decltype(get<T>(static_cast<TupleLike &&>(t)))
0042 {
0043 return get<T>(static_cast<TupleLike &&>(t));
0044 }
0045 }
0046 using _adl_get_::adl_get;
0047 }
0048
0049 namespace _tuple_wrapper_
0050 {
0051 template<typename TupleLike>
0052 struct forward_tuple_interface : TupleLike
0053 {
0054 forward_tuple_interface() = default;
0055 using TupleLike::TupleLike;
0056 #if !defined(__clang__) || __clang_major__ > 3
0057 CPP_member
0058 constexpr CPP_ctor(forward_tuple_interface)(TupleLike && base)(
0059 noexcept(std::is_nothrow_move_constructible<TupleLike>::value)
0060 requires move_constructible<TupleLike>)
0061 : TupleLike(static_cast<TupleLike &&>(base))
0062 {}
0063 CPP_member
0064 constexpr CPP_ctor(forward_tuple_interface)(TupleLike const & base)(
0065 noexcept(std::is_nothrow_copy_constructible<TupleLike>::value)
0066 requires copy_constructible<TupleLike>)
0067 : TupleLike(base)
0068 {}
0069 #else
0070
0071
0072
0073 template(typename B = TupleLike)(
0074 requires move_constructible<B>)
0075 constexpr forward_tuple_interface(TupleLike && base) noexcept(
0076 std::is_nothrow_move_constructible<TupleLike>::value)
0077 : TupleLike(static_cast<TupleLike &&>(base))
0078 {}
0079 template(typename B = TupleLike)(
0080 requires copy_constructible<B>)
0081 constexpr forward_tuple_interface(TupleLike const & base) noexcept(
0082 std::is_nothrow_copy_constructible<TupleLike>::value)
0083 : TupleLike(base)
0084 {}
0085 #endif
0086
0087
0088 template<std::size_t I, typename U = TupleLike>
0089 friend constexpr auto CPP_auto_fun(get)(
0090 forward_tuple_interface<TupleLike> &wb)
0091 (
0092 return detail::adl_get<I>(static_cast<U &>(wb))
0093 )
0094 template<std::size_t I, typename U = TupleLike>
0095 friend constexpr auto CPP_auto_fun(get)(
0096 forward_tuple_interface<TupleLike> const &wb)
0097 (
0098 return detail::adl_get<I>(static_cast<U const &>(wb))
0099 )
0100 template<std::size_t I, typename U = TupleLike>
0101 friend constexpr auto CPP_auto_fun(get)(
0102 forward_tuple_interface<TupleLike> &&wb)
0103 (
0104 return detail::adl_get<I>(static_cast<U &&>(wb))
0105 )
0106 template<std::size_t I, typename U = TupleLike>
0107 friend constexpr auto CPP_auto_fun(get)(
0108 forward_tuple_interface<TupleLike> const &&wb)
0109 (
0110 return detail::adl_get<I>(static_cast<U const &&>(wb))
0111 )
0112 template<typename T, typename U = TupleLike>
0113 friend constexpr auto CPP_auto_fun(get)(
0114 forward_tuple_interface<TupleLike> &wb)
0115 (
0116 return detail::adl_get<T>(static_cast<U &>(wb))
0117 )
0118 template<typename T, typename U = TupleLike>
0119 friend constexpr auto CPP_auto_fun(get)(
0120 forward_tuple_interface<TupleLike> const &wb)
0121 (
0122 return detail::adl_get<T>(static_cast<U const &>(wb))
0123 )
0124 template<typename T, typename U = TupleLike>
0125 friend constexpr auto CPP_auto_fun(get)(
0126 forward_tuple_interface<TupleLike> &&wb)
0127 (
0128 return detail::adl_get<T>(static_cast<U &&>(wb))
0129 )
0130 template<typename T, typename U = TupleLike>
0131 friend constexpr auto CPP_auto_fun(get)(
0132 forward_tuple_interface<TupleLike> const &&wb)
0133 (
0134 return detail::adl_get<T>(static_cast<U const &&>(wb))
0135 )
0136
0137 };
0138 }
0139
0140 }
0141
0142 #include <range/v3/detail/epilogue.hpp>
0143
0144 #endif