OGS
SolverByElementTypeRegistry.h
Go to the documentation of this file.
1
10#pragma once
11
12#include <functional>
13#include <memory>
14#include <typeindex>
15#include <unordered_map>
16
17#include "BaseLib/Logging.h"
19
20namespace ApplicationUtils
21{
27template <typename SolverInterface,
28 template <typename ShapeFunction>
29 class SolverImplementationTplTpl>
31{
32 using SolverIntfPtr = std::unique_ptr<SolverInterface>;
33
34 static std::unordered_map<std::type_index, SolverIntfPtr> initSolvers()
35 {
36 std::unordered_map<std::type_index, SolverIntfPtr> solvers;
37
38 auto at_least_1D = []<typename ET>(ET*)
39 { return ET::Element::dimension >= 1; };
40
41 auto create_and_insert_solver = [&solvers]<typename ET>(ET*)
42 {
43 using SolverImplementation =
44 SolverImplementationTplTpl<typename ET::ShapeFunction>;
45
46 solvers[std::type_index(typeid(typename ET::Element))] =
47 std::make_unique<SolverImplementation>();
48 };
49
50 using ElementTraitsFiltered =
52 at_least_1D));
53
54 BaseLib::TMP::foreach<ElementTraitsFiltered>(create_and_insert_solver);
55
56 return solvers;
57 }
58
59 static const std::unordered_map<std::type_index, SolverIntfPtr> solvers_;
60
61public:
62 static SolverInterface const& getFor(MeshLib::Element const& e)
63 {
64 auto const type_idx = std::type_index(typeid(e));
65 auto const it_type_solver = solvers_.find(type_idx);
66
67 if (it_type_solver != solvers_.end())
68 {
69 return *it_type_solver->second;
70 }
72 "You are trying to get a solver for an unknown mesh element "
73 "type "
74 "({:s}).",
75 type_idx.name());
76 }
77};
78
79template <typename SolverInterface,
80 template <typename /* shp fct */>
81 class SolverImplementationTplTpl>
82const std::unordered_map<std::type_index, std::unique_ptr<SolverInterface>>
83 SolverByElementTypeRegistry<SolverInterface,
84 SolverImplementationTplTpl>::solvers_{
85 SolverByElementTypeRegistry<SolverInterface,
86 SolverImplementationTplTpl>::initSolvers()};
87
88} // namespace ApplicationUtils
#define OGS_FATAL(...)
Definition Error.h:26
static std::unordered_map< std::type_index, SolverIntfPtr > initSolvers()
static SolverInterface const & getFor(MeshLib::Element const &e)
static const std::unordered_map< std::type_index, SolverIntfPtr > solvers_
void foreach(Function &&f)
Definition TMP.h:157
decltype(auto) filter(Pred pred)
Definition TMP.h:78