9#include <unordered_map>
21template <
typename SolverInterface,
22 template <
typename ShapeFunction>
23 class SolverImplementationTplTpl>
28 static std::unordered_map<std::type_index, SolverIntfPtr>
initSolvers()
30 std::unordered_map<std::type_index, SolverIntfPtr> solvers;
32 auto at_least_1D = []<
typename ET>(ET*)
33 {
return ET::Element::dimension >= 1; };
35 auto create_and_insert_solver = [&solvers]<
typename ET>(ET*)
37 using SolverImplementation =
38 SolverImplementationTplTpl<typename ET::ShapeFunction>;
40 solvers[std::type_index(
typeid(
typename ET::Element))] =
41 std::make_unique<SolverImplementation>();
44 using ElementTraitsFiltered =
53 static const std::unordered_map<std::type_index, SolverIntfPtr>
solvers_;
58 auto const type_idx = std::type_index(
typeid(e));
59 auto const it_type_solver =
solvers_.find(type_idx);
61 if (it_type_solver !=
solvers_.end())
63 return *it_type_solver->second;
66 "You are trying to get a solver for an unknown mesh element "
73template <
typename SolverInterface,
75 class SolverImplementationTplTpl>
76const std::unordered_map<std::type_index, std::unique_ptr<SolverInterface>>
77 SolverByElementTypeRegistry<SolverInterface,
80 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)