AMDiS  0.1
The Adaptive Multi-Dimensional Simulation Toolbox
Concepts.hpp
1 #pragma once
2 
3 #include <type_traits>
4 
5 #include <dune/functions/common/functionconcepts.hh>
6 #include <dune/functions/functionspacebases/concepts.hh>
7 
8 #include <amdis/common/ConceptsBase.hpp>
9 #include <amdis/common/Logical.hpp>
10 #include <amdis/common/TypeTraits.hpp>
11 
12 namespace AMDiS
13 {
20  namespace Traits
21  {
22  template <class A, class B>
23  struct IsSimilar
24  : std::is_same<remove_cvref_t<A>, remove_cvref_t<B>> {};
25 
26  template <class A, class B>
27  struct IsSimilar<Types<A>, Types<B>>
28  : IsSimilar<A,B> {};
29 
30  template <>
31  struct IsSimilar<Types<>, Types<>> : std::true_type {};
32 
33  template <class A0, class... As, class B0, class... Bs>
34  struct IsSimilar<Types<A0,As...>, Types<B0,Bs...>>
35  : and_t<IsSimilar<A0, B0>::value, IsSimilar<Types<As...>, Types<Bs...>>::value> {};
36 
37 
38  template <class... Ts>
39  struct IsSame;
40 
41  template <class T0, class... Ts>
42  struct IsSame<T0, Ts...>
43  : std::is_same<Types<T0,Ts...>, Types<Ts...,T0>> {};
44 
45  template <>
46  struct IsSame<> : std::true_type {};
47 
48 
49  template <class T>
51  : std::false_type {};
52 
53  template <class T>
54  struct IsReferenceWrapper<std::reference_wrapper<T>>
55  : std::true_type {};
56 
57  } // end namespace Traits
58 
59 
60  namespace Concepts
61  {
62 #ifndef DOXYGEN
63  namespace Definition
64  {
65  // f(args...)
66  struct Callable
67  {
68  template <class F, class... Args>
69  auto require(F&& f, Args&&... args) -> decltype(
70  f(FWD(args)...)
71  );
72  };
73 
74  // idx[0]
75  struct MultiIndex
76  {
77  template <class MI>
78  auto require(MI&& idx) -> decltype(
79  idx[0],
80  idx.size(),
81  idx.max_size()
82  );
83  };
84 
85  template <class MultiIndex>
87  {
88  template <class PBF, class GV>
89  auto require(PBF const& pbf, GV const& gridView) -> decltype(
90  pbf.template makePreBasis<MultiIndex>(gridView)
91  );
92  };
93 
94  } // end namespace Definition
95 #endif // DOXYGEN
96 
97 
99  template <class... Ts>
100  constexpr bool Same = Traits::IsSame<Ts...>::value;
101 
102  template <class... Ts>
103  using Same_t = Traits::IsSame<Ts...>;
104 
105 
107  template <class A, class B>
109 
110  template <class A, class B>
112 
113 
115 
120  template <class F, class... Args>
121  constexpr bool Callable = models<Definition::Callable(F, Args...)>;
122 
123  template <class F, class... Args>
124  using Callable_t = models_t<Definition::Callable(F, Args...)>;
125 
126 
128 
133  template <class F, class Signature> // F, Signature=Return(Arg)
134  constexpr bool Functor = Dune::Functions::Concept::isFunction<F, Signature>();
135 
136  template <class F, class Signature> // F, Signature=Return(Arg)
137  using Functor_t = bool_t<Functor<F,Signature>>;
138 
139 
141  template <class F, class... Args>
142  constexpr bool Predicate = Functor<F, bool(Args...)>;
143 
144  template <class F, class... Args>
145  using Predicate_t = Functor_t<F, bool(Args...)>;
146 
147 
149  template <class MI>
150  constexpr bool MultiIndex = models<Definition::MultiIndex(MI)>;
151 
152  template <class MI>
153  using MultiIndex_t = models_t<Definition::MultiIndex(MI)>;
154 
155 
157  template <class Range, class Index>
158  constexpr bool HasIndexAccess = models<Dune::Functions::Concept::HasIndexAccess(Range, Index)>;
159 
160  template <class Range, class Index>
161  using HasIndexAccess_t = models_t<Dune::Functions::Concept::HasIndexAccess(Range, Index)>;
162 
163 
165  template <class N>
166  constexpr bool BasisNode = models<Dune::Functions::Concept::BasisNode(N)>;
167 
168  template <class N>
169  using BasisNode_t = models_t<Dune::Functions::Concept::BasisNode(N)>;
170 
171 
173  template <class Tree, class GV>
174  constexpr bool BasisTree = models<Dune::Functions::Concept::BasisTree<GV>(Tree)>;
175 
176  template <class Tree, class GV>
177  using BasisTree_t = models_t<Dune::Functions::Concept::BasisTree<GV>(Tree)>;
178 
179 
181  template <class LV, class GB = typename LV::GlobalBasis>
182  constexpr bool LocalView = models<Dune::Functions::Concept::LocalView<GB>(LV)>;
183 
184  template <class LV, class GB = typename LV::GlobalBasis>
185  using LocalView_t = models_t<Dune::Functions::Concept::LocalView<GB>(LV)>;
186 
187 
189  template <class GB, class GV = typename GB::GridView>
190  constexpr bool GlobalBasis = models<Dune::Functions::Concept::GlobalBasis<GV>(GB)>;
191 
192  template <class GB, class GV = typename GB::GridView>
193  using GlobalBasis_t = models_t<Dune::Functions::Concept::GlobalBasis<GV>(GB)>;
194 
195  template <class PBF, class GV, class MI = std::array<std::size_t,1>>
196  constexpr bool PreBasisFactory = models<Definition::PreBasisFactory<MI>(PBF,GV)>;
197 
198  template <class PBF, class GV, class MI = std::array<std::size_t,1>>
199  using PreBasisFactory_t = models_t<Definition::PreBasisFactory<MI>(PBF,GV)>;
200 
203  } // end namespace Concepts
204 } // end namespace AMDiS
constexpr bool BasisTree
A Dune::Functions::BasisTree type.
Definition: Concepts.hpp:174
constexpr bool MultiIndex
A multi-index type.
Definition: Concepts.hpp:150
Definition: Concepts.hpp:39
Definition: Concepts.hpp:66
constexpr bool Functor
A Functor is a function F with signature Signature.
Definition: Concepts.hpp:134
A variadic type list.
Definition: TypeTraits.hpp:88
Global basis defined on a pre-basis.
Definition: GlobalBasis.hpp:53
Definition: FieldMatVec.hpp:12
constexpr bool Predicate
A predicate is a function that returns a boolean.
Definition: Concepts.hpp:142
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
constexpr bool HasIndexAccess
A Dune::Functions::HasIndexAccess type.
Definition: Concepts.hpp:158
The restriction of a finite element basis to a single element.
Definition: LocalView.hpp:19
constexpr bool Similar
Types are the same, up to decay of qualifiers.
Definition: Concepts.hpp:108
Definition: Concepts.hpp:23
Definition: Concepts.hpp:50
constexpr bool Callable
A Collable is a function F that can be called with arguments of type Args....
Definition: Concepts.hpp:121
std::integral_constant< bool, B > bool_t
A wrapper for bool types.
Definition: Logical.hpp:12
constexpr bool BasisNode
A Dune::Functions::BasisNode type.
Definition: Concepts.hpp:166
Definition: Concepts.hpp:75
constexpr bool Same
Types are the same.
Definition: Concepts.hpp:100