1 #ifndef STAN_MATH_OPENCL_KERNEL_GENERATOR_COMPOUND_ASSIGNMENTS_HPP
2 #define STAN_MATH_OPENCL_KERNEL_GENERATOR_COMPOUND_ASSIGNMENTS_HPP
3 
4 #include <stan/math/prim/meta.hpp>
5 
6 namespace stan {
7 namespace math {
8 
9 /**
10  * Adds a compound assignment operator for kernel generator expressions.
11  * @param independent independent (non-compound) operator
12  * @param compound compound operator
13  */
14 #define ADD_KG_COMPOUND_ASSIGMENT_OPERATOR(independent, compound) \
15   template <typename T1, typename T2,                             \
16             require_kernel_expression_lhs_t<T1>* = nullptr,       \
17             require_all_kernel_expressions_t<T2>* = nullptr>      \
18   T1 operator compound(T1&& a, T2&& b) {                          \
19     return a = a independent b;                                   \
20   }
21 
22 ADD_KG_COMPOUND_ASSIGMENT_OPERATOR(+, +=)
23 ADD_KG_COMPOUND_ASSIGMENT_OPERATOR(-, -=)
24 ADD_KG_COMPOUND_ASSIGMENT_OPERATOR(*, *=)
25 
26 #undef ADD_KG_COMPOUND_ASSIGMENT_OPERATOR
27 
28 }  // namespace math
29 }  // namespace stan
30 
31 #endif  // COMPOUND_ASSIGNMENTS_HPP
32