@@ -23,36 +23,42 @@ namespace stdsharp
23
23
24
24
namespace stdsharp ::details
25
25
{
26
- struct value_indexer
26
+ template <std::size_t Size, template <typename , typename > typename Impl>
27
+ struct seq_insert_trait
27
28
{
28
- template <auto V>
29
- struct filter
29
+ template <std::size_t Index, auto ... I, auto ... J>
30
+ static consteval auto
31
+ impl (std::index_sequence<I...> /* unused*/ , std::index_sequence<J...> /* unused*/ )
30
32
{
31
- [[nodiscard]] consteval decltype (V) get() const noexcept { return V; }
32
- };
33
+ return typename Impl<std::index_sequence<I...>, std::index_sequence<(J + Index)...>>::
34
+ type{};
35
+ }
33
36
34
- template <std::size_t >
35
- struct invalid
36
- {
37
- };
37
+ template <std::size_t Index>
38
+ using type = decltype ( //
39
+ impl<Index>(std::make_index_sequence<Index>{}, std::make_index_sequence<Size - Index>{})
40
+ );
41
+ };
38
42
39
- public:
40
- template <std:: size_t I, std:: size_t ... J, auto ... V>
41
- static consteval decltype ( auto ) impl(
42
- const std::index_sequence<J ...> /* unused */ ,
43
- const regular_value_sequence<V...> /* unused */
44
- )
43
+ template <std:: size_t Size, template < typename , typename > typename Impl>
44
+ struct seq_rmv_trait
45
+ {
46
+ template < std::size_t Index, auto ... I, auto ... J>
47
+ static consteval auto
48
+ impl (std::index_sequence<I...> /* unused */ , std::index_sequence<J...> /* unused */ )
45
49
{
46
- constexpr struct STDSHARP_EBO : std::conditional_t <I == J, filter<V>, invalid<J>>...
47
- {
48
- } f{};
49
-
50
- return f.get ();
50
+ return
51
+ typename Impl<std::index_sequence<I...>, std::index_sequence<(J + Index + 1 )...>>::
52
+ type{};
51
53
}
52
54
53
- template <std::size_t I, auto ... V>
54
- static constexpr decltype (auto ) value =
55
- impl<I>(std::make_index_sequence<sizeof ...(V)>{}, regular_value_sequence<V...>{});
55
+ template <std::size_t Index>
56
+ using type = decltype ( //
57
+ impl<Index>(
58
+ std::make_index_sequence<Index>{},
59
+ std::make_index_sequence<Size - Index - 1 >{}
60
+ )
61
+ );
56
62
};
57
63
}
58
64
@@ -70,7 +76,7 @@ namespace stdsharp
70
76
requires requires { requires I < size (); }
71
77
[[nodiscard]] static constexpr value_type<I> get () noexcept
72
78
{
73
- return details::value_indexer:: template value <I, Values...>;
79
+ return type_at <I, constant< Values> ...>::value ;
74
80
}
75
81
76
82
template <std::size_t I>
@@ -102,56 +108,17 @@ namespace stdsharp
102
108
static consteval void predicate_test()
103
109
noexcept ((nothrow_predicate<Func&, const decltype (Values)&> && ...));
104
110
105
- template <std::size_t Index>
106
- struct insert
107
- {
108
- template <auto ... Others, auto ... I, auto ... J>
109
- static consteval auto impl ( //
110
- std::index_sequence<I...> /* unused*/ ,
111
- std::index_sequence<J...> /* unused*/
112
- )
113
- {
114
- return regular_value_sequence<get<I>()..., Others..., get<J + Index>()...>{};
115
- }
116
-
117
- template <auto ... Others>
118
- using type = decltype ( //
119
- impl<Others...>(
120
- std::make_index_sequence<Index>{},
121
- std::make_index_sequence<size() - Index>{}
122
- )
123
- );
124
- };
125
-
126
- template <std::size_t Index>
127
- struct remove_at
128
- {
129
- template <auto ... I, auto ... J>
130
- static consteval regular_value_sequence<get<I>()..., get<J + Index + 1 >()...>
131
- impl (std::index_sequence<I...>, std::index_sequence<J...>);
132
-
133
- using type = decltype ( //
134
- impl (
135
- std::make_index_sequence<Index>{},
136
- std::make_index_sequence<size() - Index - 1 >{}
137
- )
138
- );
139
- };
111
+ template <typename , typename >
112
+ struct seq_traits ;
140
113
141
- template <std:: size_t Index >
142
- struct replace_at
114
+ template <auto ... I, auto ... J >
115
+ struct seq_traits <std::index_sequence<I...>, std::index_sequence<J...>>
143
116
{
144
- template <auto Other, auto ... I, auto ... J>
145
- static consteval regular_value_sequence<get<I>()..., Other, get<J + Index + 1 >()...>
146
- impl (std::index_sequence<I...>, std::index_sequence<J...>);
147
-
148
- template <auto Other>
149
- using type = decltype ( //
150
- impl<Other>(
151
- std::make_index_sequence<Index>{},
152
- std::make_index_sequence<size() - Index - 1 >{}
153
- )
154
- );
117
+ struct type
118
+ {
119
+ template <auto ... Others>
120
+ using apply = regular_value_sequence<get<I>()..., Others..., get<J>()...>;
121
+ };
155
122
};
156
123
157
124
public:
@@ -224,13 +191,15 @@ namespace stdsharp
224
191
using append_front_t = regular_value_sequence<Others..., Values...>;
225
192
226
193
template <std::size_t Index, auto ... Other>
227
- using insert_t = insert<Index>::template type<Other...>;
194
+ using insert_t = details::seq_insert_trait<size(), seq_traits>:: //
195
+ template type<Index>::template apply<Other...>;
228
196
229
- template <std::size_t Index>
230
- using remove_at_t = remove_at<Index>::type;
197
+ template <std::size_t Index, auto ... Other>
198
+ using replace_t = details::seq_rmv_trait<size(), seq_traits>:: //
199
+ template type<Index>::template apply<Other...>;
231
200
232
- template <std::size_t Index, auto Other >
233
- using replace_t = replace_at <Index>:: template type<Other >;
201
+ template <std::size_t Index>
202
+ using remove_at_t = replace_t <Index>;
234
203
};
235
204
}
236
205
0 commit comments