18 #ifndef SCN_DETAIL_TUPLE_RETURN_H
19 #define SCN_DETAIL_TUPLE_RETURN_H
31 template <
typename Fn,
33 typename std::enable_if<std::is_member_pointer<
36 constexpr
auto invoke(Fn&& f, Args&&... args) noexcept(
37 noexcept(std::mem_fn(f)(std::forward<Args>(args)...)))
38 -> decltype(std::mem_fn(f)(std::forward<Args>(args)...))
40 return std::mem_fn(f)(std::forward<Args>(args)...);
43 template <
typename Fn,
45 typename std::enable_if<!std::is_member_pointer<
47 constexpr
auto invoke(Fn&& f, Args&&... args) noexcept(
48 noexcept(std::forward<Fn>(f)(std::forward<Args>(args)...)))
49 -> decltype(std::forward<Fn>(f)(std::forward<Args>(args)...))
51 return std::forward<Fn>(f)(std::forward<Args>(args)...);
55 template <
typename T, T... I>
60 template <
bool C,
typename T,
typename E>
63 template <
typename T,
typename E>
68 template <
typename T,
typename E>
73 template <
bool C,
typename T,
typename E>
82 template <
typename S1,
typename S2>
85 template <
typename T, T... I, T... J>
91 template <
typename T, T N>
94 template <
typename T, T N>
99 "make_integer_sequence<T, N>: N must not be negative");
101 static T
const M = N / 2;
102 static T
const R = N % 2;
113 template <
typename T, T N>
116 iseq_identity<integer_sequence<T>>,
118 iseq_identity<integer_sequence<T, 0>>,
119 make_integer_sequence_impl_<T, N>>> {
123 template <
typename T, T N>
128 template <std::size_t... I>
132 template <std::
size_t N>
136 template <
typename... T>
141 template <
class F,
class Tuple, std::size_t... I>
144 noexcept(detail::
invoke(std::forward<F>(f),
145 std::
get<I>(std::forward<Tuple>(t))...)))
146 -> decltype(detail::
invoke(std::forward<F>(f),
147 std::
get<I>(std::forward<Tuple>(t))...))
150 std::get<I>(std::forward<Tuple>(t))...);
153 template <
class F,
class Tuple>
154 constexpr
auto apply(F&& f, Tuple&& t) noexcept(
157 std::forward<Tuple>(t),
159 typename std::remove_reference<Tuple>::
type>::
value>{})))
162 std::forward<Tuple>(t),
167 std::forward<F>(f), std::forward<Tuple>(t),
173 template <
typename... Args,
typename Range,
typename Format>
175 -> std::tuple<detail::scan_result_for_range_t<const Range&>, Args...>
179 std::tuple<Args...> values{Args{}...};
181 return std::tuple_cat(std::tuple<result>{std::move(ret)},
184 template <
typename... Args,
typename Range,
typename Format>
186 typename std::enable_if<
187 !std::is_reference<Range>::value,
188 std::tuple<detail::scan_result_for_range_t<Range>, Args...>>
::type
191 auto scanfn = [&r, &f](Args&... a) {
194 std::tuple<Args...> values{Args{}...};
196 return std::tuple_cat(std::tuple<result>{std::move(ret)},
200 template <
typename... Args,
typename Range>
202 -> std::tuple<detail::scan_result_for_range_t<const Range&>, Args...>
205 auto scanfn = [&r](Args&... a) {
208 std::tuple<Args...> values{Args{}...};
210 return std::tuple_cat(std::tuple<result>{std::move(ret)},
213 template <
typename... Args,
typename Range>
215 typename std::enable_if<
216 !std::is_reference<Range>::value,
217 std::tuple<detail::scan_result_for_range_t<Range>, Args...>>
::type
220 auto scanfn = [&r](Args&... a) {
223 std::tuple<Args...> values{Args{}...};
225 return std::tuple_cat(std::tuple<result>{std::move(ret)},
typename iseq_if_c_impl< C, T, E >::type iseq_if_c
#define SCN_END_NAMESPACE
typename detail::make_integer_sequence_impl< T, N >::type make_integer_sequence
constexpr auto apply(F &&f, Tuple &&t) noexcept(noexcept(detail::apply_impl(std::forward< F >(f), std::forward< Tuple >(t), make_index_sequence< std::tuple_size< typename std::remove_reference< Tuple >::type >::value >{}))) -> decltype(detail::apply_impl(std::forward< F >(f), std::forward< Tuple >(t), make_index_sequence< std::tuple_size< typename std::remove_reference< Tuple >::type >::value >
SCN_NODISCARD auto scan_tuple(const Range &r, Format f) -> std::tuple< detail::scan_result_for_range_t< const Range & >, Args...>
typename scan_result_for_range< Range, E >::type scan_result_for_range_t
make_integer_sequence< std::size_t, sizeof...(T)> index_sequence_for
#define SCN_BEGIN_NAMESPACE
auto scan(Range &&r, const Format &f, Args &...a) -> detail::scan_result_for_range_t< Range >
The most fundamental part of the scanning API.
make_integer_sequence< std::size_t, N > make_index_sequence
auto get(const subrange< I, S, K > &s) -> decltype(_subrange_get_impl< N >::get(s))
constexpr auto invoke(Fn &&f, Args &&...args) noexcept(noexcept(std::mem_fn(f)(std::forward< Args >(args)...))) -> decltype(std::mem_fn(f)(std::forward< Args >(args)...))
constexpr auto apply_impl(F &&f, Tuple &&t, index_sequence< I...>) noexcept(noexcept(detail::invoke(std::forward< F >(f), std::get< I >(std::forward< Tuple >(t))...))) -> decltype(detail::invoke(std::forward< F >(f), std::get< I >(std::forward< Tuple >(t))...))