From b8cc8995c4dd8bd7831cff212c87ef62ef907867 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Tue, 11 Mar 2025 21:58:43 -0600 Subject: [PATCH] Use 'if constexpr' to avoid many explicit specializations. --- include/deal.II/fe/fe_tools.templates.h | 43 +++++++++- source/fe/fe_tools.cc | 109 ------------------------ 2 files changed, 41 insertions(+), 111 deletions(-) diff --git a/include/deal.II/fe/fe_tools.templates.h b/include/deal.II/fe/fe_tools.templates.h index 5cd3518c77..420be5f268 100644 --- a/include/deal.II/fe/fe_tools.templates.h +++ b/include/deal.II/fe/fe_tools.templates.h @@ -1050,11 +1050,50 @@ namespace FETools - // Not implemented in the general case. template std::unique_ptr> - FEFactory::get(const Quadrature<1> &) const + FEFactory::get(const Quadrature<1> &quad) const { + // Specializations for FE_Q. + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + + // Specializations for FE_Q_DG0. + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + + // Specializations for FE_Q_Bubbles. + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + + // Specializations for FE_DGQArbitraryNodes. + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + + // Specializations for FE_DG. + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + if constexpr (std::is_same_v>) + return std::make_unique>(quad); + DEAL_II_NOT_IMPLEMENTED(); return nullptr; } diff --git a/source/fe/fe_tools.cc b/source/fe/fe_tools.cc index acee0c345e..7d5e2b71ca 100644 --- a/source/fe/fe_tools.cc +++ b/source/fe/fe_tools.cc @@ -36,115 +36,6 @@ namespace FETools // these do not fit into the templates of the dimension in the inst file namespace FETools { - // Specializations for FE_Q. - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - // Specializations for FE_Q_DG0. - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - // Specializations for FE_Q_Bubbles. - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - // Specializations for FE_DGQArbitraryNodes. - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - - template <> - std::unique_ptr> - FEFactory>::get(const Quadrature<1> &quad) const - { - return std::make_unique>(quad); - } - template std::vector hierarchic_to_lexicographic_numbering<0>(unsigned int); -- 2.39.5