38 template <auto GetTuple, auto Predicate>
40 static constexpr auto tuple = GetTuple();
42 template <std::
size_t I>
43 static consteval auto do_single()
noexcept {
44 constexpr auto value = std::get<I>(tuple);
46 if constexpr (Predicate(value)) {
47 return std::tuple{value};
49 return std::tuple<>{};
53 static consteval auto do_filter()
noexcept {
54 return []<std::size_t... Is>(std::index_sequence<Is...>) {
return std::tuple_cat(do_single<Is>()...); }(
55 std::make_index_sequence<std::tuple_size_v<
decltype(tuple)>>{});
58 static constexpr auto value = do_filter();
66 template <auto GetTuple, auto Predicate>
77 template <
typename... Ts, std::predicate<Ts...> Callable>
78 constexpr std::size_t get_index_if(
const std::tuple<Ts...>& tuple, Callable&& predicate)
noexcept(
79 (
noexcept(std::declval<Callable>()(std::declval<Ts>())) && ...)) {
80 return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
81 auto index = std::numeric_limits<std::size_t>::max();
83 auto handler = [&]<std::size_t I>(std::integral_constant<std::size_t, I>) {
84 if (index == std::numeric_limits<std::size_t>::max()
85 && std::forward<Callable>(predicate)(std::get<I>(tuple))) {
90 (handler(std::integral_constant<std::size_t, Is>{}), ...);
93 }(std::make_index_sequence<
sizeof...(Ts)>{});
Filters a tuple given a predicate.
Definition tuple.hpp:39