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>
23 class SolverImplementationTplTpl>
25{
26 using SolverIntfPtr = std::unique_ptr<SolverInterface>;
27
28 static std::unordered_map<std::type_index, SolverIntfPtr> initSolvers()
29 {
30 std::unordered_map<std::type_index, SolverIntfPtr> solvers;
31
32 auto at_least_1D = []<typename ET>(ET*)
33 { return ET::Element::dimension >= 1; };
34
35 auto create_and_insert_solver = [&solvers]<typename ET>(ET*)
36 {
37 using SolverImplementation =
38 SolverImplementationTplTpl<typename ET::ShapeFunction>;
39
40 solvers[std::type_index(typeid(typename ET::Element))] =
41 std::make_unique<SolverImplementation>();
42 };
43
44 using ElementTraitsFiltered =
46 at_least_1D));
47
48 BaseLib::TMP::foreach<ElementTraitsFiltered>(create_and_insert_solver);
49
50 return solvers;
51 }
52
53 static const std::unordered_map<std::type_index, SolverIntfPtr> solvers_;
54
55public:
56 static SolverInterface const& getFor(MeshLib::Element const& e)
57 {
58 auto const type_idx = std::type_index(typeid(e));
59 auto const it_type_solver = solvers_.find(type_idx);
60
61 if (it_type_solver != solvers_.end())
62 {
63 return *it_type_solver->second;
64 }
66 "You are trying to get a solver for an unknown mesh element "
67 "type "
68 "({:s}).",
69 type_idx.name());
70 }
71};
72
73template <typename SolverInterface,
74 template <typename /* shp fct */>
75 class SolverImplementationTplTpl>
76const std::unordered_map<std::type_index, std::unique_ptr<SolverInterface>>
77 SolverByElementTypeRegistry<SolverInterface,
78 SolverImplementationTplTpl>::solvers_{
79 SolverByElementTypeRegistry<SolverInterface,
80 SolverImplementationTplTpl>::initSolvers()};
81
82} // 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