ryujin 2.5.0 revision 3a6c8d57210175dea14d8116e1fe878f349f8c1c
Loading...
Searching...
No Matches
library.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
9
10#include <deal.II/base/exceptions.h>
11#include <deal.II/base/patterns.h>
12
13#include <algorithm>
14#include <concepts>
15#include <functional>
16#include <memory>
17#include <set>
18#include <string>
19#include <vector>
20
21namespace ryujin
22{
47 template <typename Base, typename... Args>
48 class Library final
49 {
50 public:
51 Library() = delete;
52
56 using Creator = std::function<std::unique_ptr<Base>(Args...)>;
57
61 template <typename T>
62 requires std::derived_from<T, Base> && std::constructible_from<T, Args...>
63 static Creator creator();
64
68 static void add(Creator creator);
69
74 template <typename T>
75 requires std::derived_from<T, Base> && std::constructible_from<T, Args...>
76 static void add();
77
82 static std::vector<std::unique_ptr<Base>> create(Args... args);
83
88 static std::vector<std::string> names(Args... args);
89
95 static dealii::Patterns::Selection
96 selection(const std::vector<std::unique_ptr<Base>> &objects);
97
102 static Base &select(const std::vector<std::unique_ptr<Base>> &objects,
103 const std::string &name);
104
105 private:
111 static std::vector<Creator> &creators();
112
116 static std::vector<Creator> defaults();
117 };
118
119
120 // ------------------------------- inline functions --------------------------
121
122
123 template <typename Base, typename... Args>
124 template <typename T>
125 requires std::derived_from<T, Base> && std::constructible_from<T, Args...>
127 {
128 return [](Args... args) -> std::unique_ptr<Base> {
129 return std::make_unique<T>(args...);
130 };
131 }
132
133
134 template <typename Base, typename... Args>
135 template <typename T>
136 requires std::derived_from<T, Base> && std::constructible_from<T, Args...>
138 {
139 add(creator<T>());
140 }
141
142
143 // ----------------------------- member functions ---------------------------
144
145
146 template <typename Base, typename... Args>
147 auto Library<Base, Args...>::creators() -> std::vector<Creator> &
148 {
149 static std::vector<Creator> creators = defaults();
150 return creators;
151 }
152
153
154 template <typename Base, typename... Args>
156 {
157 creators().push_back(std::move(creator));
158 }
159
160
161 template <typename Base, typename... Args>
162 std::vector<std::unique_ptr<Base>>
164 {
165 std::vector<std::unique_ptr<Base>> objects;
166 std::set<std::string> names;
167
168 for (const auto &creator : creators()) {
169 auto object = creator(args...);
170 const auto [it, inserted] = names.insert(object->name());
171 AssertThrow(
172 inserted,
173 dealii::ExcMessage("Two entries of a library share the name »" +
174 object->name() + "«"));
175 objects.push_back(std::move(object));
176 }
177
178 return objects;
179 }
180
181
182 template <typename Base, typename... Args>
183 std::vector<std::string> Library<Base, Args...>::names(Args... args)
184 {
185 std::vector<std::string> names;
186 for (const auto &object : create(args...))
187 names.push_back(object->name());
188 return names;
189 }
190
191
192 template <typename Base, typename... Args>
193 dealii::Patterns::Selection Library<Base, Args...>::selection(
194 const std::vector<std::unique_ptr<Base>> &objects)
195 {
196 std::string names;
197 for (const auto &object : objects)
198 names += (names.empty() ? "" : "|") + object->name();
199 return dealii::Patterns::Selection(names);
200 }
201
202
203 template <typename Base, typename... Args>
205 const std::vector<std::unique_ptr<Base>> &objects,
206 const std::string &name)
207 {
208 const auto it =
209 std::find_if(objects.begin(), objects.end(), [&](const auto &object) {
210 return object->name() == name;
211 });
212
213 AssertThrow(it != objects.end(),
214 dealii::ExcMessage("No entry of the library has the name »" +
215 name + "«"));
216
217 return **it;
218 }
219} // namespace ryujin
static std::vector< std::string > names(Args... args)
Definition library.h:183
Library()=delete
static Base & select(const std::vector< std::unique_ptr< Base > > &objects, const std::string &name)
Definition library.h:204
static std::vector< std::unique_ptr< Base > > create(Args... args)
Definition library.h:163
static Creator creator()
std::function< std::unique_ptr< Base >(Args...)> Creator
Definition library.h:56
static void add()
Definition library.h:137
static dealii::Patterns::Selection selection(const std::vector< std::unique_ptr< Base > > &objects)
Definition library.h:193
DEAL_II_HOST_DEVICE_ALWAYS_INLINE FT add(const FT &flux_left_ij, const FT &flux_right_ij)