ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
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...>
64 {
65 return [](Args... args) -> std::unique_ptr<Base> {
66 return std::make_unique<T>(args...);
67 };
68 }
69
73 static void add(Creator creator);
74
79 template <typename T>
80 requires std::derived_from<T, Base> && std::constructible_from<T, Args...>
81 static void add()
82 {
83 add(creator<T>());
84 }
85
90 static std::vector<std::unique_ptr<Base>> create(Args... args);
91
96 static std::vector<std::string> names(Args... args);
97
103 static dealii::Patterns::Selection
104 selection(const std::vector<std::unique_ptr<Base>> &objects);
105
110 static Base &select(const std::vector<std::unique_ptr<Base>> &objects,
111 const std::string &name);
112
113 private:
119 static std::vector<Creator> &creators();
120
124 static std::vector<Creator> defaults();
125 };
126
127
128 // ----------------------------- member functions ---------------------------
129
130
131 template <typename Base, typename... Args>
132 auto Library<Base, Args...>::creators() -> std::vector<Creator> &
133 {
134 static std::vector<Creator> creators = defaults();
135 return creators;
136 }
137
138
139 template <typename Base, typename... Args>
141 {
142 creators().push_back(std::move(creator));
143 }
144
145
146 template <typename Base, typename... Args>
147 std::vector<std::unique_ptr<Base>>
149 {
150 std::vector<std::unique_ptr<Base>> objects;
151 std::set<std::string> names;
152
153 for (const auto &creator : creators()) {
154 auto object = creator(args...);
155 const auto [it, inserted] = names.insert(object->name());
156 AssertThrow(
157 inserted,
158 dealii::ExcMessage("Two entries of a library share the name »" +
159 object->name() + "«"));
160 objects.push_back(std::move(object));
161 }
162
163 return objects;
164 }
165
166
167 template <typename Base, typename... Args>
168 std::vector<std::string> Library<Base, Args...>::names(Args... args)
169 {
170 std::vector<std::string> names;
171 for (const auto &object : create(args...))
172 names.push_back(object->name());
173 return names;
174 }
175
176
177 template <typename Base, typename... Args>
178 dealii::Patterns::Selection Library<Base, Args...>::selection(
179 const std::vector<std::unique_ptr<Base>> &objects)
180 {
181 std::string names;
182 for (const auto &object : objects)
183 names += (names.empty() ? "" : "|") + object->name();
184 return dealii::Patterns::Selection(names);
185 }
186
187
188 template <typename Base, typename... Args>
190 const std::vector<std::unique_ptr<Base>> &objects,
191 const std::string &name)
192 {
193 const auto it =
194 std::find_if(objects.begin(), objects.end(), [&](const auto &object) {
195 return object->name() == name;
196 });
197
198 AssertThrow(it != objects.end(),
199 dealii::ExcMessage("No entry of the library has the name »" +
200 name + "«"));
201
202 return **it;
203 }
204} // namespace ryujin
static std::vector< std::string > names(Args... args)
Definition library.h:168
Library()=delete
static Base & select(const std::vector< std::unique_ptr< Base > > &objects, const std::string &name)
Definition library.h:189
static std::vector< std::unique_ptr< Base > > create(Args... args)
Definition library.h:148
static Creator creator()
Definition library.h:63
std::function< std::unique_ptr< Base >(Args...)> Creator
Definition library.h:56
static dealii::Patterns::Selection selection(const std::vector< std::unique_ptr< Base > > &objects)
Definition library.h:178
static void add()
Definition library.h:81