5 #ifndef DUNE_COMMON_CONCEPT_HH 6 #define DUNE_COMMON_CONCEPT_HH 51 template<
class... BaseConcepts>
68 template<
class C,
class... T>
85 template<
class C,
class... T,
86 decltype(std::declval<C>().require(std::declval<T>()...), 0) =0>
93 template<
class C,
class... T>
101 constexpr
bool modelsConceptList(TypeList<>)
107 template<
class...T,
class C0,
class... CC>
108 constexpr
bool modelsConceptList(TypeList<C0, CC...>)
109 {
return models<C0, T...>() and modelsConceptList<T...>(TypeList<CC...>()); }
115 template<
class C,
class... T>
116 constexpr
bool modelsConcept(PriorityTag<0>)
117 {
return matchesRequirement<C, T...>(PriorityTag<42>()); }
125 template<
class C,
class... T,
126 decltype(
typename C::BaseConceptList(), 0) = 0>
127 constexpr
bool modelsConcept(PriorityTag<1>)
128 {
return matchesRequirement<C, T...>(PriorityTag<42>()) and modelsConceptList<T...>(
typename C::BaseConceptList()); }
139 template<
class C,
class... T>
142 return modelsConcept<C, T...>(PriorityTag<42>());
182 template<
class C,
class... T>
197 template<
class C,
class Tuple>
201 return std::conjunction<decltype(Dune::models<C, std::tuple_element_t<decltype(i)::value, Tuple>>())...>();
202 }, std::make_index_sequence<std::tuple_size_v<Tuple>>());
213 template<bool b, typename std::enable_if<b, int>::type = 0>
220 template<
class C,
class... T,
typename std::enable_if<
models<C, T...>(),
int>::type = 0>
228 template<
class C,
class... T,
typename std::enable_if<
models<C, T...>(),
int>::type = 0>
236 template<
class C,
class Tuple,
typename std::enable_if<tupleEntriesModel<C, Tuple>(),
int>::type = 0>
244 template<
class From,
class To,
245 typename std::enable_if< std::is_convertible<From, To>::value,
int>::type = 0>
253 template<
class To,
class From,
254 typename std::enable_if< std::is_convertible<From, To>::value,
int>::type = 0>
272 template<
class Base,
class Derived,
273 typename std::enable_if< std::is_base_of<Base, Derived>::value,
int>::type = 0>
281 template<
class Base,
class Derived,
282 typename std::enable_if< std::is_base_of<Base, Derived>::value,
int>::type = 0>
290 template<
class A,
class B,
291 typename std::enable_if< std::is_same<A, B>::value,
int>::type = 0>
306 #endif // DUNE_COMMON_CONCEPT_HH constexpr bool requireSameType()
Definition: concept.hh:292
constexpr auto tupleEntriesModel()
Definition: concept.hh:198
constexpr auto models()
Check if concept is modeled by given types.
Definition: concept.hh:183
decltype(auto) constexpr unpackIntegerSequence(F &&f, [[maybe_unused]] std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition: indices.hh:124
constexpr bool requireTrue()
Definition: concept.hh:214
I i
Definition: hybridmultiindex.hh:328
constexpr bool requireConcept()
Definition: concept.hh:221
Dune namespace
Definition: alignedallocator.hh:12
Utilities for type computations, constraining overloads, ...
std::tuple< MetaType< T >... > TypeList
A simple type list.
Definition: typelist.hh:87
Helper class for tagging priorities.
Definition: typeutilities.hh:86
constexpr bool requireConceptForTupleEntries()
Definition: concept.hh:237
Base class for refined concepts.
Definition: concept.hh:52
constexpr bool requireType()
Definition: concept.hh:265
Helper class for tagging priorities.
Definition: typeutilities.hh:72
constexpr bool requireBaseOf()
Definition: concept.hh:274
TypeList< BaseConcepts... > BaseConceptList
Definition: concept.hh:54
constexpr bool requireConvertible()
Definition: concept.hh:246