9#include <unordered_map>
21template <
typename SolverInterface,
22 template <
typename ShapeFunction>
class SolverImplementationTplTpl>
27 static std::unordered_map<std::type_index, SolverIntfPtr>
initSolvers()
29 std::unordered_map<std::type_index, SolverIntfPtr> solvers;
31 auto at_least_1D = []<
typename ET>(ET*)
32 {
return ET::Element::dimension >= 1; };
34 auto create_and_insert_solver = [&solvers]<
typename ET>(ET*)
36 using SolverImplementation =
37 SolverImplementationTplTpl<typename ET::ShapeFunction>;
39 solvers[std::type_index(
typeid(
typename ET::Element))] =
40 std::make_unique<SolverImplementation>();
43 using ElementTraitsFiltered =
52 static const std::unordered_map<std::type_index, SolverIntfPtr>
solvers_;
57 auto const type_idx = std::type_index(
typeid(e));
58 auto const it_type_solver =
solvers_.find(type_idx);
60 if (it_type_solver !=
solvers_.end())
62 return *it_type_solver->second;
65 "You are trying to get a solver for an unknown mesh element "
72template <
typename SolverInterface,
73 template <
typename >
class SolverImplementationTplTpl>
74const std::unordered_map<std::type_index, std::unique_ptr<SolverInterface>>
75 SolverByElementTypeRegistry<SolverInterface,
78 SolverImplementationTplTpl>::initSolvers()};
static std::unordered_map< std::type_index, SolverIntfPtr > initSolvers()
static SolverInterface const & getFor(MeshLib::Element const &e)
std::unique_ptr< SolverInterface > SolverIntfPtr
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)
decltype(auto) filter(Pred pred)
std::string demangle(const char *mangled_name)