diff --git a/cuda/test/base/lin_op.cu b/cuda/test/base/lin_op.cu index ca3357f85bc..82016f87816 100644 --- a/cuda/test/base/lin_op.cu +++ b/cuda/test/base/lin_op.cu @@ -44,8 +44,8 @@ protected: FactoryParameter() {} public: - std::vector GKO_FACTORY_PARAMETER_VECTOR(parameter, 10, 11); - int GKO_FACTORY_PARAMETER_SCALAR(parameter2, -4); + std::vector GKO_FACTORY_PARAMETER_VECTOR(vector_parameter, 10, 11); + int GKO_FACTORY_PARAMETER_SCALAR(scalar_parameter, -4); }; @@ -53,8 +53,8 @@ TEST_F(FactoryParameter, WorksOnCudaDefault) { std::vector expected{10, 11}; - ASSERT_EQ(parameter, expected); - ASSERT_EQ(parameter2, -4); + ASSERT_EQ(vector_parameter, expected); + ASSERT_EQ(scalar_parameter, -4); } @@ -62,9 +62,9 @@ TEST_F(FactoryParameter, WorksOnCuda0) { std::vector expected{}; - auto result = &this->with_parameter(); + auto result = &this->with_vector_parameter(); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); ASSERT_EQ(result, this); } @@ -73,10 +73,10 @@ TEST_F(FactoryParameter, WorksOnCuda1) { std::vector expected{2}; - this->with_parameter(2).with_parameter2(3); + this->with_vector_parameter(2).with_scalar_parameter(3); - ASSERT_EQ(parameter, expected); - ASSERT_EQ(parameter2, 3); + ASSERT_EQ(vector_parameter, expected); + ASSERT_EQ(scalar_parameter, 3); } @@ -84,9 +84,9 @@ TEST_F(FactoryParameter, WorksOnCuda2) { std::vector expected{8, 3}; - this->with_parameter(8, 3); + this->with_vector_parameter(8, 3); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } @@ -94,9 +94,9 @@ TEST_F(FactoryParameter, WorksOnCuda3) { std::vector expected{1, 7, 2}; - this->with_parameter(1, 7, 2); + this->with_vector_parameter(1, 7, 2); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } @@ -104,9 +104,9 @@ TEST_F(FactoryParameter, WorksOnCuda4) { std::vector expected{4, 5, 4, 2}; - this->with_parameter(4, 5, 4, 2); + this->with_vector_parameter(4, 5, 4, 2); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } @@ -114,9 +114,9 @@ TEST_F(FactoryParameter, WorksOnCuda5) { std::vector expected{9, 3, 4, 2, 7}; - this->with_parameter(9, 3, 4, 2, 7); + this->with_vector_parameter(9, 3, 4, 2, 7); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } diff --git a/hip/test/base/lin_op.hip.cpp b/hip/test/base/lin_op.hip.cpp index a55d06b166e..1977912be9e 100644 --- a/hip/test/base/lin_op.hip.cpp +++ b/hip/test/base/lin_op.hip.cpp @@ -44,8 +44,8 @@ class FactoryParameter : public ::testing::Test { FactoryParameter() {} public: - std::vector GKO_FACTORY_PARAMETER_VECTOR(parameter, 10, 11); - int GKO_FACTORY_PARAMETER_SCALAR(parameter2, -4); + std::vector GKO_FACTORY_PARAMETER_VECTOR(vector_parameter, 10, 11); + int GKO_FACTORY_PARAMETER_SCALAR(scalar_parameter, -4); }; @@ -53,8 +53,8 @@ TEST_F(FactoryParameter, WorksOnHipDefault) { std::vector expected{10, 11}; - ASSERT_EQ(parameter, expected); - ASSERT_EQ(parameter2, -4); + ASSERT_EQ(vector_parameter, expected); + ASSERT_EQ(scalar_parameter, -4); } @@ -62,9 +62,9 @@ TEST_F(FactoryParameter, WorksOnHip0) { std::vector expected{}; - auto result = &this->with_parameter(); + auto result = &this->with_vector_parameter(); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); ASSERT_EQ(result, this); } @@ -73,10 +73,10 @@ TEST_F(FactoryParameter, WorksOnHip1) { std::vector expected{2}; - this->with_parameter(2).with_parameter2(3); + this->with_vector_parameter(2).with_scalar_parameter(3); - ASSERT_EQ(parameter, expected); - ASSERT_EQ(parameter2, 3); + ASSERT_EQ(vector_parameter, expected); + ASSERT_EQ(scalar_parameter, 3); } @@ -84,9 +84,9 @@ TEST_F(FactoryParameter, WorksOnHip2) { std::vector expected{8, 3}; - this->with_parameter(8, 3); + this->with_vector_parameter(8, 3); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } @@ -94,9 +94,9 @@ TEST_F(FactoryParameter, WorksOnHip3) { std::vector expected{1, 7, 2}; - this->with_parameter(1, 7, 2); + this->with_vector_parameter(1, 7, 2); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } @@ -104,9 +104,9 @@ TEST_F(FactoryParameter, WorksOnHip4) { std::vector expected{4, 5, 4, 2}; - this->with_parameter(4, 5, 4, 2); + this->with_vector_parameter(4, 5, 4, 2); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } @@ -114,9 +114,9 @@ TEST_F(FactoryParameter, WorksOnHip5) { std::vector expected{9, 3, 4, 2, 7}; - this->with_parameter(9, 3, 4, 2, 7); + this->with_vector_parameter(9, 3, 4, 2, 7); - ASSERT_EQ(parameter, expected); + ASSERT_EQ(vector_parameter, expected); } diff --git a/include/ginkgo/core/base/lin_op.hpp b/include/ginkgo/core/base/lin_op.hpp index 48567f8fd7c..9e8e04fd54c 100644 --- a/include/ginkgo/core/base/lin_op.hpp +++ b/include/ginkgo/core/base/lin_op.hpp @@ -754,6 +754,9 @@ public: \ * // a factory parameter named "my_value", of type int and default * // value of 5 * int GKO_FACTORY_PARAMETER_SCALAR(my_value, 5); + * // a factory parameter named `my_pair` of type `std::pair` + * // and default value {5, 5} + * std::pair GKO_FACTORY_PARAMETER_VECTOR(my_pair, 5, 5); * }; * // constructor needed by EnableLinOp * explicit MyLinOp(std::shared_ptr exec) { @@ -888,6 +891,7 @@ public: \ static_assert(true, \ "This assert is used to counter the false positive extra " \ "semi-colon warnings") + /** * Creates a scalar factory parameter in the factory parameters structure. * @@ -903,6 +907,7 @@ public: \ */ #define GKO_FACTORY_PARAMETER_SCALAR(_name, _default) \ GKO_FACTORY_PARAMETER(_name, _default) + /** * Creates a vector factory parameter in the factory parameters structure. * @@ -921,7 +926,8 @@ public: \ #else // defined(__CUDACC__) || defined(__HIPCC__) // A workaround for the NVCC compiler - parameter pack expansion does not work // properly, because while the assignment to a scalar value is translated by -// cudafe without parameter pack expansion, the corresponding parameter is not. +// cudafe into a C-style cast, the parameter pack expansion is not removed and +// `Args&&... args` is still kept as a parameter pack. #define GKO_FACTORY_PARAMETER(_name, ...) \ mutable _name{__VA_ARGS__}; \ \ @@ -935,12 +941,13 @@ public: \ static_assert(true, \ "This assert is used to counter the false positive extra " \ "semi-colon warnings") + #define GKO_FACTORY_PARAMETER_SCALAR(_name, _default) \ mutable _name{_default}; \ \ template \ auto with_##_name(Arg &&_value) \ - const->const ::gko::xstd::decay_t & \ + const->const std::decay_t & \ { \ using type = decltype(this->_name); \ this->_name = type{std::forward(_value)}; \ @@ -949,12 +956,13 @@ public: \ static_assert(true, \ "This assert is used to counter the false positive extra " \ "semi-colon warnings") + #define GKO_FACTORY_PARAMETER_VECTOR(_name, ...) \ mutable _name{__VA_ARGS__}; \ \ template \ auto with_##_name(Args &&... _value) \ - const->const ::gko::xstd::decay_t & \ + const->const std::decay_t & \ { \ using type = decltype(this->_name); \ this->_name = type{std::forward(_value)...}; \ diff --git a/include/ginkgo/core/preconditioner/jacobi.hpp b/include/ginkgo/core/preconditioner/jacobi.hpp index 518ce199872..be82373c37c 100644 --- a/include/ginkgo/core/preconditioner/jacobi.hpp +++ b/include/ginkgo/core/preconditioner/jacobi.hpp @@ -338,7 +338,7 @@ class Jacobi : public EnableLinOp>, * has to be respected when setting this parameter. Failure to do * so will lead to undefined behavior. */ - gko::Array GKO_FACTORY_PARAMETER_SCALAR(block_pointers, + gko::Array GKO_FACTORY_PARAMETER_VECTOR(block_pointers, nullptr); private: @@ -436,7 +436,7 @@ class Jacobi : public EnableLinOp>, * If the non-adaptive version of Jacobi is used, the * `storage_optimization.block_wise` Array will be empty. */ - storage_optimization_type GKO_FACTORY_PARAMETER_SCALAR( + storage_optimization_type GKO_FACTORY_PARAMETER_VECTOR( storage_optimization, precision_reduction(0, 0)); /**