Skip to content
Snippets Groups Projects
Commit 53d4b4a8 authored by Simon Praetorius's avatar Simon Praetorius
Browse files

Merge branch 'feature/integer-sequence-filter' into 'master'

Add a filter function for integer_sequences

See merge request !1369
parents 04812a71 b341090a
Branches
Tags
1 merge request!1369Add a filter function for integer_sequences
Pipeline #70685 waiting for manual action
......@@ -176,6 +176,35 @@ constexpr std::bool_constant<false>
equal (std::integer_sequence<S,II...>, std::integer_sequence<T,JJ...>) { return {}; }
template <template <auto> class Filter, class T>
constexpr auto filter (std::integer_sequence<T> jSeq) { return jSeq; }
//! Return the elements from the sequence [JJ...) which are accepted by the Filter,
//! i.e., for which `Filter<JJ>::value == true`
template <template <auto> class Filter, class T, T J0, T... JJ>
constexpr auto filter (std::integer_sequence<T,J0,JJ...> jSeq)
{
if constexpr(Filter<J0>::value)
return push_front(filter<Filter>(tail(jSeq)), head(jSeq));
else
return filter<Filter>(tail(jSeq));
}
template <class Filter, class T>
constexpr auto filter (Filter, std::integer_sequence<T> jSeq) { return jSeq; }
//! Return the elements from the sequence [JJ...) which are accepted by the Filter,
//! i.e., for which `f(integral_constant<JJ>) == true`
template <class Filter, class T, T J0, T... JJ>
constexpr auto filter (Filter f, std::integer_sequence<T,J0,JJ...> jSeq)
{
constexpr auto jHead = head(jSeq);
if constexpr(f(jHead))
return push_front(filter(f, tail(jSeq)), jHead);
else
return filter(f, tail(jSeq));
}
} // end namespace Dune
#endif // DUNE_COMMON_INTEGERSEQUENCE_HH
......@@ -6,9 +6,14 @@
#include "config.h"
#endif
#include <type_traits>
#include <utility>
#include <dune/common/indices.hh>
#include <dune/common/integersequence.hh>
template <int I>
using IsEven = std::bool_constant<(I % 2 == 0)>;
int main()
{
......@@ -56,5 +61,9 @@ int main()
static_assert(empty(difference(seq3,seq3a)));
static_assert(empty(difference(seq3a,seq3)));
auto seq3even = std::integer_sequence<int, 2,14>{};
static_assert(equal(filter<IsEven>(seq3), seq3even));
static_assert(equal(filter([](auto i) { return i % 2 == 0; }, seq3), seq3even));
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment