VCCC  2024.05
VisualCamp Common C++ library
sequence_for_each.hpp
Go to the documentation of this file.
1 //
2 // Created by YongGyu Lee on 2024. 5. 17.
3 //
4 
5 #ifndef VCCC_UTILITY_SEQUENCE_FOR_EACH_HPP_
6 #define VCCC_UTILITY_SEQUENCE_FOR_EACH_HPP_
7 
8 #include <cstddef>
9 #include <type_traits>
10 #include <utility>
11 
16 
17 namespace vccc {
18 namespace detail {
19 
20 template<typename Seq, typename F>
21 struct sequence_for_each_invocable : std::false_type {};
22 
23 template<typename T, T... v, typename F>
24 struct sequence_for_each_invocable<std::integer_sequence<T, v...>, F>
25  : conjunction<
26  is_invocable<F, std::integral_constant<T, v>>...
27  > {};
28 
29 } // namespace detail
30 
33 
35 template<typename T, T... v, typename F>
36 constexpr std::enable_if_t<detail::sequence_for_each_invocable<std::integer_sequence<T, v...>, F>::value>
37 sequence_for_each(std::integer_sequence<T, v...>, F&& f) {
38  int dummy[] = {
39  (vccc::invoke(f, std::integral_constant<T, v>{}), 0)...
40  };
41  (void)dummy;
42 }
43 
45 template<typename T, T N, typename F>
46 constexpr std::enable_if_t<detail::sequence_for_each_invocable<std::make_integer_sequence<T, N>, F>::value>
48  return vccc::sequence_for_each(std::make_integer_sequence<T, N>{}, std::forward<F>(f));
49 }
50 
52 template<std::size_t N, typename F>
53 constexpr std::enable_if_t<detail::sequence_for_each_invocable<std::make_index_sequence<N>, F>::value>
55  return vccc::sequence_for_each(std::make_index_sequence<N>{}, std::forward<F>(f));
56 }
57 
59 
60 } // namespace vccc
61 
62 #endif // VCCC_UTILITY_SEQUENCE_FOR_EACH_HPP_
constexpr invoke_result_t< F, Args... > invoke(F &&f, Args &&... args) noexcept(is_nothrow_invocable< F, Args... >::value)
Definition: invoke.hpp:38
constexpr std::enable_if_t< detail::sequence_for_each_invocable< std::integer_sequence< T, v... >, F >::value > sequence_for_each(std::integer_sequence< T, v... >, F &&f)
performs f(std::integral_constant<T, i>{}) for i in v...
Definition: sequence_for_each.hpp:37
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35