Dune-Functions 2.11
Loading...
Searching...
No Matches
containerfactory.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
5#ifndef DUNE_FUNCTIONS_BACKENDS_CONTAINERFACTORY_HH
6#define DUNE_FUNCTIONS_BACKENDS_CONTAINERFACTORY_HH
7
8#include <type_traits>
9#include <array>
10#include <vector>
11
12#include <dune/common/exceptions.hh>
13#include <dune/common/fvector.hh>
14#include <dune/common/indices.hh>
15#include <dune/common/tuplevector.hh>
16
18
19namespace Dune::Functions {
21namespace Impl {
22
23template<class T>
24struct ContainerFactory
25{
26 void operator() (const Unknown& descriptor, const T& defaultValue) const
27 {
28 DUNE_THROW(Dune::NotImplemented, "Cannot create a vector. The container descriptor is unknown.");
29 }
30
31 template<class... ChildDescriptor>
32 auto operator() (const Tuple<ChildDescriptor...>& descriptor, const T& defaultValue) const
33 {
34 return unpackIntegerSequence([&](auto... ii) {
35 return Dune::TupleVector<decltype((*this)(descriptor[ii], defaultValue))...>{(*this)(descriptor[ii], defaultValue)...};
36 }, std::make_index_sequence<sizeof...(ChildDescriptor)>());
37 }
38
39 template<class ChildDescriptor, std::size_t n>
40 auto operator() (const Array<ChildDescriptor,n>& descriptor, const T& defaultValue) const
41 {
42 using ChildContainer = decltype((*this)(descriptor[0], defaultValue));
43 return unpackIntegerSequence([&](auto... ii) {
44 return std::array<ChildContainer, n>{(*this)(descriptor[ii], defaultValue)...};
45 }, std::make_index_sequence<n>());
46 }
47
48 template<class ChildDescriptor>
49 auto operator() (const Vector<ChildDescriptor>& descriptor, const T& defaultValue) const
50 {
51 using ChildContainer = decltype((*this)(descriptor[0], defaultValue));
52 auto result = std::vector<ChildContainer>();
53 result.reserve(descriptor.size());
54 for (std::size_t i = 0; i < descriptor.size(); ++i)
55 result.emplace_back((*this)(descriptor[i], defaultValue));
56 return result;
57 }
58
59 template<class ChildDescriptor, std::size_t n>
60 auto operator() (const UniformArray<ChildDescriptor,n>& descriptor, const T& defaultValue) const
61 {
62 using ChildContainer = decltype((*this)(descriptor[0], defaultValue));
63 auto childContainer = (*this)(descriptor[0], defaultValue);
64 return unpackIntegerSequence([&](auto... ii) {
65 return std::array<ChildContainer, n>{((void)(ii),childContainer)...};
66 }, std::make_index_sequence<n>());
67 }
68
69 template<class ChildDescriptor>
70 auto operator() (const UniformVector<ChildDescriptor>& descriptor, const T& defaultValue) const
71 {
72 using ChildContainer = decltype((*this)(descriptor[0], defaultValue));
73 auto childContainer = (*this)(descriptor[0], defaultValue);
74 return std::vector<ChildContainer>(descriptor.size(), childContainer);
75 }
76
77 // scalar types
78
79 auto operator() (const Value& descriptor, const T& defaultValue) const
80 {
81 return T(defaultValue);
82 }
83
84};
85
86} // end namespace Impl
87} // end namespace ContainerDescriptors
88
89
101template<class T, class ContainerDescriptor>
102auto makeContainer (const ContainerDescriptor& descriptor, const T& defaultValue)
103{
104 auto factory = ContainerDescriptors::Impl::ContainerFactory<T>{};
105 return factory(descriptor, defaultValue);
106}
107
118template<class T, class ContainerDescriptor>
119auto makeContainer (const ContainerDescriptor& descriptor)
120{
121 return makeContainer<T>(descriptor, T());
122}
123
124} // end namespace Dune::Functions
125
126#endif // DUNE_FUNCTIONS_BACKENDS_CONTAINERFACTORY_HH
Lightweight representation of (hierarchical) size and block structure extracted from a basis to descr...
Definition monomialset.hh:19
auto makeContainer(const ContainerDescriptor &descriptor, const T &defaultValue)
Construct a nested random access container compatible with the container descriptor.
Definition containerfactory.hh:102
Definition containerfactory.hh:20
Dune::TupleVector< Children... > Tuple
Descriptor with all children of possibly different type.
Definition containerdescriptors.hh:82
std::vector< Child > Vector
Descriptor for vectors with all children of the same type and dynamic size.
Definition containerdescriptors.hh:112
std::array< Child, n > Array
Descriptor for arrays with all children of the same type and static size.
Definition containerdescriptors.hh:98
Fallback container descriptor if nothing else fits.
Definition containerdescriptors.hh:52
The node in the descriptor tree representing a value placeholder.
Definition containerdescriptors.hh:71
Descriptor for arrays with all children identical and the number of children a static size.
Definition containerdescriptors.hh:117
Uniform descriptor with dynamic size.
Definition containerdescriptors.hh:156