From: Wolfgang Bangerth Date: Wed, 12 Mar 2025 03:58:43 +0000 (-0600) Subject: Use 'if constexpr' to avoid many explicit specializations. X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F18230%2Fhead;p=dealii.git Use 'if constexpr' to avoid many explicit specializations. --- 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);