DUNE PDELab (git)

containerdescriptors.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
5
6#include <array>
7#include <cassert>
8#include <functional>
9#include <type_traits>
10#include <vector>
11
15
16#include <dune/functions/common/type_traits.hh>
17#include <dune/functions/functionspacebases/basistags.hh>
18
42namespace Dune::Functions {
43namespace ContainerDescriptors {
44
46struct Unknown {};
47
48} // end namespace ContainerDescriptors
49
50namespace Impl {
51
52template<class PreBasis>
53auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<1>)
54 -> decltype(preBasis.containerDescriptor())
55{
56 return preBasis.containerDescriptor();
57}
58
59template<class PreBasis>
60auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<0>)
61{
62 return ContainerDescriptors::Unknown{};
63}
64
65} // end namespace Impl
66
68template<class PreBasis>
69auto containerDescriptor(const PreBasis& preBasis)
70{
71 return Impl::containerDescriptorImpl(preBasis, Dune::PriorityTag<2>{});
72}
73
74
75namespace ContainerDescriptors {
76
78struct Value
79{
81 template<class Index>
82 Value operator[] (const Index&) const { return {}; }
83
85 static constexpr std::size_t size () { return 0; }
86};
87
89template<class... Children>
90using Tuple = Dune::TupleVector<Children...>;
91
94template<class Child0, class... Children,
95 std::enable_if_t<(sizeof...(Children) > 0), int> = 0,
96 std::enable_if_t<(...|| (not std::is_same_v<Child0, Children>)), int> = 0>
97auto makeDescriptor (Child0 child0, Children... children)
98{
99 using Descriptor = Tuple<Child0,Children...>;
100 return Descriptor{std::move(child0),std::move(children)...};
101}
102
103
105template<class Child, std::size_t n>
106using Array = std::array<Child, n>;
107
109template<class Child0, class... Children,
110 std::enable_if_t<(std::is_same_v<Child0, Children> &&...), int> = 0>
111auto makeDescriptor (Child0 child, Children... children)
112{
113 using Descriptor = Array<Child0,1+sizeof...(Children)>;
114 return Descriptor{std::move(child),std::move(children)...};
115}
116
117
119template<class Child>
120using Vector = std::vector<Child>;
121
123template<class Child, std::size_t n>
125{
127 template<class C = Child,
128 std::enable_if_t<std::is_default_constructible_v<C>, int> = 0>
130 : child_{}
131 {}
132
135 : child_{std::move(child)}
136 {}
137
139 template<class Index>
140 const Child& operator[] (const Index& /*i*/) const { return child_; }
141
143 static constexpr std::size_t size () { return n; }
144
145private:
146 Child child_;
147};
148
150template<std::size_t n>
151using FlatArray = UniformArray<Value,n>;
152
154template<class Child, std::size_t n>
155auto makeUniformDescriptor (std::integral_constant<std::size_t,n>, Child child)
156{
157 return UniformArray<Child,n>{std::move(child)};
158}
159
160
162template<class Child>
164{
166 template<class C = Child,
167 std::enable_if_t<std::is_default_constructible_v<C>, int> = 0>
168 explicit UniformVector (std::size_t size)
169 : size_{size}
170 , child_{}
171 {}
172
175 : size_{size}
176 , child_{std::move(child)}
177 {}
178
180 template<class Index>
181 const Child& operator[] (const Index& /*i*/) const { return child_; }
182
184 std::size_t size () const { return size_; }
185
186private:
187 std::size_t size_;
188 Child child_;
189};
190
192using FlatVector = UniformVector<Value>;
193
195template<class Child>
196auto makeUniformDescriptor (std::size_t n, Child child)
197{
198 return UniformVector<Child>{n,std::move(child)};
199}
200
201} // end namespace ContainerDescriptors
202} // end namespace Dune::Functions
203
204#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
A class augmenting std::tuple by element access via operator[].
Definition: tuplevector.hh:35
Utility to generate an array with a certain value.
typename impl::_Child< Node, indices... >::type Child
Template alias for the type of a child node given by a list of child indices.
Definition: childextraction.hh:225
ImplementationDefined child(Node &&node, Indices... indices)
Extracts the child of a node given by a sequence of compile-time and run-time indices.
Definition: childextraction.hh:128
STL namespace.
Descriptor for arrays with all children identical and the number of children a static size.
Definition: containerdescriptors.hh:125
static constexpr std::size_t size()
The static size information, i.e., number of children.
Definition: containerdescriptors.hh:143
UniformArray()
Default constructor. Is enable if the child-type is default constructible.
Definition: containerdescriptors.hh:129
UniformArray(Child child)
Constructor that stores a single child only.
Definition: containerdescriptors.hh:134
const Child & operator[](const Index &) const
Access the i'th child that is always the same, i.e., child_.
Definition: containerdescriptors.hh:140
Uniform descriptor with dynamic size.
Definition: containerdescriptors.hh:164
UniformVector(std::size_t size, Child child)
Constructor that stores the size and a single child only.
Definition: containerdescriptors.hh:174
std::size_t size() const
The dynamic size information, i.e., number of children.
Definition: containerdescriptors.hh:184
UniformVector(std::size_t size)
Default constructor with size. Is enable if the child-type is default constructible.
Definition: containerdescriptors.hh:168
const Child & operator[](const Index &) const
Access the i'th child that is always the same, i.e., child_.
Definition: containerdescriptors.hh:181
Fallback container descriptor if nothing else fits.
Definition: containerdescriptors.hh:46
The node in the descriptor tree representing a value placeholder.
Definition: containerdescriptors.hh:79
static constexpr std::size_t size()
A value placeholder does not have any sub-descriptors, thus its size is zero.
Definition: containerdescriptors.hh:85
Value operator[](const Index &) const
The child access method is only available for the interface, but should not be called.
Definition: containerdescriptors.hh:82
Helper class for tagging priorities.
Definition: typeutilities.hh:87
Helper class for tagging priorities.
Definition: typeutilities.hh:73
Provides the TupleVector class that augments std::tuple by operator[].
Utilities for type computations, constraining overloads, ...
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)