diff --git a/core/config/factorization_config.cpp b/core/config/factorization_config.cpp index ae700750be2..2fb102b798d 100644 --- a/core/config/factorization_config.cpp +++ b/core/config/factorization_config.cpp @@ -17,111 +17,22 @@ #include "core/config/config_helper.hpp" #include "core/config/dispatch.hpp" +#include "core/config/parse_marco.hpp" namespace gko { namespace config { -template <> -deferred_factory_parameter -parse(const pnode& config, - const registry& context, - const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter -parse(const pnode& config, - const registry& context, - const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} +PARSE_VALUE_AND_INDEX_TYPE(Factorization_Ic, gko::factorization::Ic); +PARSE_VALUE_AND_INDEX_TYPE(Factorization_Ilu, gko::factorization::Ilu); +PARSE_VALUE_AND_INDEX_TYPE(Cholesky, + gko::experimental::factorization::Cholesky); +PARSE_VALUE_AND_INDEX_TYPE(Lu, gko::experimental::factorization::Lu); +PARSE_VALUE_AND_INDEX_TYPE(ParIlu, gko::factorization::ParIlu); +PARSE_VALUE_AND_INDEX_TYPE(ParIlut, gko::factorization::ParIlut); +PARSE_VALUE_AND_INDEX_TYPE(ParIc, gko::factorization::ParIc); +PARSE_VALUE_AND_INDEX_TYPE(ParIct, gko::factorization::ParIct); } // namespace config diff --git a/core/config/parse_marco.hpp b/core/config/parse_marco.hpp new file mode 100644 index 00000000000..16df5c2a603 --- /dev/null +++ b/core/config/parse_marco.hpp @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors +// +// SPDX-License-Identifier: BSD-3-Clause + +#ifndef GKO_CORE_CONFIG_PARSE_MARCO_HPP_ +#define GKO_CORE_CONFIG_PARSE_MARCO_HPP_ + + +#include +#include +#include + + +#include "core/config/config_helper.hpp" +#include "core/config/dispatch.hpp" +#include "core/config/type_descriptor_helper.hpp" + + +// for value_type only +#define PARSE_VALUE_TYPE(_type, _configurator) \ + template <> \ + deferred_factory_parameter \ + parse( \ + const gko::config::pnode& config, \ + const gko::config::registry& context, \ + const gko::config::type_descriptor& td) \ + { \ + auto updated = gko::config::update_type(config, td); \ + return gko::config::dispatch( \ + config, context, updated, \ + gko::config::make_type_selector(updated.get_value_typestr(), \ + gko::config::value_type_list())); \ + } \ + static_assert(true, \ + "This assert is used to counter the false positive extra " \ + "semi-colon warnings") + + +// for value_type and index_type +#define PARSE_VALUE_AND_INDEX_TYPE(_type, _configurator) \ + template <> \ + deferred_factory_parameter \ + parse( \ + const gko::config::pnode& config, \ + const gko::config::registry& context, \ + const gko::config::type_descriptor& td) \ + { \ + auto updated = gko::config::update_type(config, td); \ + return gko::config::dispatch( \ + config, context, updated, \ + gko::config::make_type_selector(updated.get_value_typestr(), \ + gko::config::value_type_list()), \ + gko::config::make_type_selector(updated.get_index_typestr(), \ + gko::config::index_type_list())); \ + } \ + static_assert(true, \ + "This assert is used to counter the false positive extra " \ + "semi-colon warnings") + + +#endif // GKO_CORE_CONFIG_PARSE_MARCO_HPP_ diff --git a/core/config/preconditioner_config.cpp b/core/config/preconditioner_config.cpp index d0bc7e17067..274ba4c5430 100644 --- a/core/config/preconditioner_config.cpp +++ b/core/config/preconditioner_config.cpp @@ -16,6 +16,7 @@ #include "core/config/config_helper.hpp" #include "core/config/dispatch.hpp" +#include "core/config/parse_marco.hpp" #include "core/config/type_descriptor_helper.hpp" @@ -287,16 +288,7 @@ deferred_factory_parameter parse( } -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} +PARSE_VALUE_AND_INDEX_TYPE(Jacobi, gko::preconditioner::Jacobi); } // namespace config diff --git a/core/config/solver_config.cpp b/core/config/solver_config.cpp index 43b00965a48..39c6cc219d0 100644 --- a/core/config/solver_config.cpp +++ b/core/config/solver_config.cpp @@ -21,72 +21,27 @@ #include "core/config/config_helper.hpp" #include "core/config/dispatch.hpp" +#include "core/config/parse_marco.hpp" #include "core/config/solver_config.hpp" namespace gko { namespace config { -// for valuetype only -#define PARSE(_type) \ - template <> \ - deferred_factory_parameter \ - parse(const pnode& config, \ - const registry& context, \ - const type_descriptor& td) \ - { \ - auto updated = update_type(config, td); \ - return dispatch( \ - config, context, updated, \ - make_type_selector(updated.get_value_typestr(), \ - value_type_list())); \ - } -PARSE(Cg) -PARSE(Bicg) -PARSE(Bicgstab) -PARSE(Cgs) -PARSE(Fcg) -PARSE(Ir) -PARSE(Idr) -PARSE(Gcr) -PARSE(Gmres) -PARSE(CbGmres) - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} - -template <> -deferred_factory_parameter parse( - const pnode& config, const registry& context, const type_descriptor& td) -{ - auto updated = update_type(config, td); - return dispatch( - config, context, updated, - make_type_selector(updated.get_value_typestr(), value_type_list()), - make_type_selector(updated.get_index_typestr(), index_type_list())); -} +PARSE_VALUE_TYPE(Cg, gko::solver::Cg); +PARSE_VALUE_TYPE(Bicg, gko::solver::Bicg); +PARSE_VALUE_TYPE(Bicgstab, gko::solver::Bicgstab); +PARSE_VALUE_TYPE(Cgs, gko::solver::Cgs); +PARSE_VALUE_TYPE(Fcg, gko::solver::Fcg); +PARSE_VALUE_TYPE(Ir, gko::solver::Ir); +PARSE_VALUE_TYPE(Idr, gko::solver::Idr); +PARSE_VALUE_TYPE(Gcr, gko::solver::Gcr); +PARSE_VALUE_TYPE(Gmres, gko::solver::Gmres); +PARSE_VALUE_TYPE(CbGmres, gko::solver::CbGmres); +PARSE_VALUE_AND_INDEX_TYPE(Direct, gko::experimental::solver::Direct); +PARSE_VALUE_AND_INDEX_TYPE(LowerTrs, gko::solver::LowerTrs); +PARSE_VALUE_AND_INDEX_TYPE(UpperTrs, gko::solver::UpperTrs); } // namespace config