12#ifndef RANGES_V3_DETAIL_ADL_GET_HPP
13#define RANGES_V3_DETAIL_ADL_GET_HPP
21#include <range/v3/detail/prologue.hpp>
33 template<std::
size_t I,
typename TupleLike>
34 constexpr auto adl_get(TupleLike && t)
noexcept
35 ->
decltype(get<I>(
static_cast<TupleLike &&
>(t)))
37 return get<I>(
static_cast<TupleLike &&
>(t));
39 template<
typename T,
typename TupleLike>
40 constexpr auto adl_get(TupleLike && t)
noexcept
41 ->
decltype(get<T>(
static_cast<TupleLike &&
>(t)))
43 return get<T>(
static_cast<TupleLike &&
>(t));
46 using _adl_get_::adl_get;
49 namespace _tuple_wrapper_
51 template<
typename TupleLike>
52 struct forward_tuple_interface : TupleLike
54 forward_tuple_interface() =
default;
55 using TupleLike::TupleLike;
56#if !defined(__clang__) || __clang_major__ > 3
58 constexpr CPP_ctor(forward_tuple_interface)(TupleLike && base)(
59 noexcept(std::is_nothrow_move_constructible<TupleLike>::value)
60 requires move_constructible<TupleLike>)
61 : TupleLike(static_cast<TupleLike &&>(base))
64 constexpr CPP_ctor(forward_tuple_interface)(TupleLike
const & base)(
65 noexcept(std::is_nothrow_copy_constructible<TupleLike>::value)
66 requires copy_constructible<TupleLike>)
73 template(
typename B = TupleLike)(
74 requires move_constructible<B>)
75 constexpr forward_tuple_interface(TupleLike && base)
noexcept(
76 std::is_nothrow_move_constructible<TupleLike>::value)
77 : TupleLike(static_cast<TupleLike &&>(base))
79 template(
typename B = TupleLike)(
80 requires copy_constructible<B>)
81 constexpr forward_tuple_interface(TupleLike
const & base)
noexcept(
82 std::is_nothrow_copy_constructible<TupleLike>::value)
88 template<std::
size_t I,
typename U = TupleLike>
89 friend constexpr auto CPP_auto_fun(get)(
90 forward_tuple_interface<TupleLike> &wb)
92 return detail::adl_get<I>(
static_cast<U &
>(wb))
94 template<std::size_t I, typename U = TupleLike>
95 friend constexpr auto CPP_auto_fun(get)(
96 forward_tuple_interface<TupleLike>
const &wb)
98 return detail::adl_get<I>(
static_cast<U
const &
>(wb))
100 template<std::
size_t I,
typename U = TupleLike>
101 friend constexpr auto CPP_auto_fun(get)(
102 forward_tuple_interface<TupleLike> &&wb)
104 return detail::adl_get<I>(
static_cast<U &&
>(wb))
106 template<std::size_t I, typename U = TupleLike>
107 friend constexpr auto CPP_auto_fun(get)(
108 forward_tuple_interface<TupleLike>
const &&wb)
110 return detail::adl_get<I>(
static_cast<U
const &&
>(wb))
112 template<
typename T,
typename U = TupleLike>
113 friend constexpr auto CPP_auto_fun(get)(
114 forward_tuple_interface<TupleLike> &wb)
116 return detail::adl_get<T>(
static_cast<U &
>(wb))
118 template<typename T, typename U = TupleLike>
119 friend constexpr auto CPP_auto_fun(get)(
120 forward_tuple_interface<TupleLike>
const &wb)
122 return detail::adl_get<T>(
static_cast<U
const &
>(wb))
124 template<
typename T,
typename U = TupleLike>
125 friend constexpr auto CPP_auto_fun(get)(
126 forward_tuple_interface<TupleLike> &&wb)
128 return detail::adl_get<T>(
static_cast<U &&
>(wb))
130 template<typename T, typename U = TupleLike>
131 friend constexpr auto CPP_auto_fun(get)(
132 forward_tuple_interface<TupleLike>
const &&wb)
134 return detail::adl_get<T>(
static_cast<U
const &&
>(wb))
142#include <range/v3/detail/epilogue.hpp>