OGS
SolverByElementTypeRegistry.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <functional>
7#include <memory>
8#include <typeindex>
9#include <unordered_map>
10
11#include "BaseLib/Logging.h"
13
14namespace ApplicationUtils
15{
21template <typename SolverInterface,
22 template <typename ShapeFunction> class SolverImplementationTplTpl>
24{
25 using SolverIntfPtr = std::unique_ptr<SolverInterface>;
26
27 static std::unordered_map<std::type_index, SolverIntfPtr> initSolvers()
28 {
29 std::unordered_map<std::type_index, SolverIntfPtr> solvers;
30
31 auto at_least_1D = []<typename ET>(ET*)
32 { return ET::Element::dimension >= 1; };
33
34 auto create_and_insert_solver = [&solvers]<typename ET>(ET*)
35 {
36 using SolverImplementation =
37 SolverImplementationTplTpl<typename ET::ShapeFunction>;
38
39 solvers[std::type_index(typeid(typename ET::Element))] =
40 std::make_unique<SolverImplementation>();
41 };
42
43 using ElementTraitsFiltered =
45 at_least_1D));
46
47 BaseLib::TMP::foreach<ElementTraitsFiltered>(create_and_insert_solver);
48
49 return solvers;
50 }
51
52 static const std::unordered_map<std::type_index, SolverIntfPtr> solvers_;
53
54public:
55 static SolverInterface const& getFor(MeshLib::Element const& e)
56 {
57 auto const type_idx = std::type_index(typeid(e));
58 auto const it_type_solver = solvers_.find(type_idx);
59
60 if (it_type_solver != solvers_.end())
61 {
62 return *it_type_solver->second;
63 }
65 "You are trying to get a solver for an unknown mesh element "
66 "type "
67 "({:s}).",
68 BaseLib::demangle(type_idx.name()));
69 }
70};
71
72template <typename SolverInterface,
73 template <typename /* shp fct */> class SolverImplementationTplTpl>
74const std::unordered_map<std::type_index, std::unique_ptr<SolverInterface>>
75 SolverByElementTypeRegistry<SolverInterface,
76 SolverImplementationTplTpl>::solvers_{
77 SolverByElementTypeRegistry<SolverInterface,
78 SolverImplementationTplTpl>::initSolvers()};
79
80} // namespace ApplicationUtils
#define OGS_FATAL(...)
Definition Error.h:19
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_
const std::unordered_map< std::type_index, std::unique_ptr< SolverInterface > > SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >::solvers_
void foreach(Function &&f)
Definition TMP.h:150
decltype(auto) filter(Pred pred)
Definition TMP.h:71
std::string demangle(const char *mangled_name)