|
1 | | -/* Copyright 2019 Rene Rivera |
| 1 | +/* Copyright 2019-2026 Rene Rivera |
2 | 2 | * Distributed under the Boost Software License, Version 1.0. |
3 | | - * (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt) |
| 3 | + * (See accompanying file LICENSE.txt or |
| 4 | + * https://www.bfgroup.xyz/b2/LICENSE.txt) |
4 | 5 | */ |
5 | 6 |
|
6 | 7 | #ifndef B2_MP_H |
7 | 8 | #define B2_MP_H |
8 | 9 |
|
9 | | -namespace b2 |
10 | | -{ |
11 | | -namespace mp |
12 | | -{ |
| 10 | +#include <cstddef> |
| 11 | +#include <type_traits> |
| 12 | +#include <utility> |
| 13 | + |
| 14 | +namespace b2 { namespace mp { |
13 | 15 |
|
14 | 16 | // Simulate C++14 (make_)index_sequence.. |
15 | 17 |
|
16 | 18 | template <std::size_t... Ns> |
17 | 19 | struct index_sequence |
18 | 20 | { |
19 | | - using type = index_sequence; |
| 21 | + using type = index_sequence; |
20 | 22 | }; |
21 | 23 |
|
22 | 24 | template <typename A, typename B> |
23 | 25 | struct merge_index_sequence; |
24 | 26 | template <std::size_t... A, std::size_t... B> |
25 | | -struct merge_index_sequence< |
26 | | - index_sequence<A...>, index_sequence<B...>> |
27 | | - : index_sequence<A..., (sizeof...(A) + B)...> |
28 | | -{ |
29 | | -}; |
| 27 | +struct merge_index_sequence<index_sequence<A...>, index_sequence<B...>> |
| 28 | + : index_sequence<A..., (sizeof...(A) + B)...> |
| 29 | +{ }; |
30 | 30 |
|
31 | 31 | template <std::size_t N> |
32 | 32 | struct make_index_sequence |
33 | | - : merge_index_sequence< |
34 | | - typename make_index_sequence<N / 2>::type, |
35 | | - typename make_index_sequence<N - (N / 2)>::type> |
36 | | -{ |
37 | | -}; |
| 33 | + : merge_index_sequence<typename make_index_sequence<N / 2>::type, |
| 34 | + typename make_index_sequence<N - (N / 2)>::type> |
| 35 | +{ }; |
38 | 36 | template <> |
39 | 37 | struct make_index_sequence<0> : index_sequence<> |
40 | | -{ |
41 | | -}; |
| 38 | +{ }; |
42 | 39 | template <> |
43 | 40 | struct make_index_sequence<1> : index_sequence<0> |
44 | | -{ |
45 | | -}; |
| 41 | +{ }; |
46 | 42 |
|
47 | 43 | // Shallow, simulated, invoke.. |
48 | 44 |
|
49 | 45 | template <typename Return, typename Call, typename ArgsTuple, std::size_t... I> |
50 | | -Return invoke(Call &&call, ArgsTuple &&args, index_sequence<I...>) |
| 46 | +Return invoke(Call && call, ArgsTuple && args, index_sequence<I...>) |
51 | 47 | { |
52 | | - using std::get; |
53 | | - return call(get<I>(args)...); |
| 48 | + using std::get; |
| 49 | + return call(get<I>(args)...); |
54 | 50 | } |
55 | 51 |
|
56 | 52 | // Simulate C++ 20 remove_cvref.. |
57 | 53 |
|
58 | 54 | template <typename T> |
59 | 55 | struct remove_cvref |
60 | 56 | { |
61 | | - using type = typename std::remove_cv< |
62 | | - typename std::remove_reference<T>::type>::type; |
| 57 | + using type = |
| 58 | + typename std::remove_cv<typename std::remove_reference<T>::type>::type; |
63 | 59 | }; |
64 | 60 |
|
65 | 61 | // Fusion style for_each.. |
66 | 62 |
|
67 | 63 | template <typename Call, typename... Args> |
68 | | -void for_each_arg(Call &&call, Args &&... args) |
| 64 | +void for_each_arg(Call && call, Args &&... args) |
69 | 65 | { |
70 | | - using x = int[]; |
71 | | - (void)x{0, ((void)call(std::forward<Args>(args)), 0)...}; |
| 66 | + using x = int[]; |
| 67 | + (void)x { 0, ((void)call(std::forward<Args>(args)), 0)... }; |
72 | 68 | } |
73 | 69 |
|
74 | 70 | template <typename Call, typename Tuple, std::size_t... I> |
75 | | -void for_each(Tuple &&tuple, Call &&call, index_sequence<I...>) |
| 71 | +void for_each(Tuple && tuple, Call && call, index_sequence<I...>) |
76 | 72 | { |
77 | | - using std::get; |
78 | | - for_each_arg( |
79 | | - std::forward<Call>(call), |
80 | | - get<I>(std::forward<Tuple>(tuple))...); |
| 73 | + using std::get; |
| 74 | + for_each_arg(std::forward<Call>(call), get<I>(std::forward<Tuple>(tuple))...); |
81 | 75 | } |
82 | 76 |
|
83 | 77 | template <typename Call, typename Tuple> |
84 | | -void for_each(Tuple &&tuple, Call &&call) |
| 78 | +void for_each(Tuple && tuple, Call && call) |
85 | 79 | { |
86 | | - using std::get; |
87 | | - for_each( |
88 | | - std::forward<Tuple>(tuple), |
89 | | - std::forward<Call>(call), |
90 | | - make_index_sequence<std::tuple_size<Tuple>::value>{}); |
| 80 | + using std::get; |
| 81 | + for_each(std::forward<Tuple>(tuple), std::forward<Call>(call), |
| 82 | + make_index_sequence<std::tuple_size<Tuple>::value> { }); |
91 | 83 | } |
92 | 84 |
|
93 | | -} // namespace mp |
94 | | -} // namespace b2 |
| 85 | +}} // namespace b2::mp |
95 | 86 |
|
96 | 87 | #endif |
0 commit comments