Skip to content
Snippets Groups Projects
Commit 53305824 authored by Carsten Gräser's avatar Carsten Gräser
Browse files

Merge branch 'feature/simplify-and-test-tupleentriesmodel' into 'master'

[concept] Simplify tupleEntriesModel()

See merge request !1397
parents ec6c61b1 9d29896d
Branches
Tags
1 merge request!1397[concept] Simplify tupleEntriesModel()
Pipeline #71668 waiting for manual action
......@@ -11,7 +11,7 @@
#include <dune/common/typeutilities.hh>
#include <dune/common/typelist.hh>
#include <dune/common/tupleutility.hh>
#include <dune/common/indices.hh>
#include <dune/common/std/type_traits.hh>
/**
......@@ -190,31 +190,6 @@ constexpr auto models()
namespace Concept {
#ifndef DOXYGEN
namespace Impl {
// #############################################################################
// # All functions following here are implementation details for the
// # for the tupleEntriesModel() function below.
// #############################################################################
template<class C, class Tuple>
struct TupleEntriesModelHelper
{
template<class Accumulated, class T>
struct AccumulateFunctor
{
using type = typename std::integral_constant<bool, Accumulated::value and models<C, T>()>;
};
using Result = typename ReduceTuple<AccumulateFunctor, Tuple, std::true_type>::type;
};
} // namespace Dune::Concept::Impl
#endif // DOXYGEN
// #############################################################################
// # The method tupleEntriesModel() does the actual check if the types in a tuple
// # model a concept using the implementation details above.
......@@ -222,9 +197,10 @@ namespace Impl {
template<class C, class Tuple>
constexpr auto tupleEntriesModel()
-> typename Impl::TupleEntriesModelHelper<C, Tuple>::Result
{
return {};
return Dune::unpackIntegerSequence([&](auto... i) {
return std::conjunction<decltype(Dune::models<C, std::tuple_element_t<decltype(i)::value, Tuple>>())...>();
}, std::make_index_sequence<std::tuple_size_v<Tuple>>());
}
// #############################################################################
......
......@@ -72,6 +72,14 @@ struct HasFooAndBar5
using BaseConceptList = Dune::TypeList<HasFoo, HasBar>;
};
struct AllHaveFoo
{
template<class T>
auto require(const T& t) -> decltype(
Dune::Concept::requireConceptForTupleEntries<HasFoo, T>()
);
};
......@@ -186,7 +194,11 @@ try
test.check(models<HasFooAndBar5, FooBar<int>>())
<< "models<HasFooAndBar5, FooBar<int>>() gives wrong result";
test.check(models<AllHaveFoo, std::tuple<Foo<double>, Foo<int>, FooBar<int>>>())
<< "models<AllHaveFoo, std::tuple<Foo<double>, FooBar<int>>>() gives wrong result";
test.check(not models<AllHaveFoo, std::tuple<Bar<double>, Foo<int>, FooBar<int>>>())
<< "models<AllHaveFoo, std::tuple<Bar<double>, FooBar<int>>>() gives wrong result";
return test.exit();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment