1 #ifndef STAN_MATH_PRIM_META_IS_MATRIX_CL_HPP
2 #define STAN_MATH_PRIM_META_IS_MATRIX_CL_HPP
3 
4 #include <stan/math/prim/meta/require_helpers.hpp>
5 #include <type_traits>
6 
7 namespace stan {
8 namespace math {
9 
10 template <typename T>
11 class arena_matrix_cl;
12 
13 /**
14  * Non-templated base class for `matrix_cl` simplifies checking if something is
15  * matrix_cl.
16  */
17 class matrix_cl_base {};
18 
19 }  // namespace math
20 
21 /** \ingroup type_traits
22  * Checks if the decayed type of T is a matrix_cl.
23  */
24 template <typename T>
25 struct is_matrix_cl
26     : public std::is_base_of<math::matrix_cl_base, std::decay_t<T>> {};
27 
28 STAN_ADD_REQUIRE_UNARY(matrix_cl, is_matrix_cl, matrix_cl_group);
29 STAN_ADD_REQUIRE_CONTAINER(matrix_cl, is_matrix_cl, matrix_cl_group);
30 
31 namespace internal {
32 
33 template <typename T>
34 struct is_arena_matrix_cl_impl : public std::false_type {};
35 
36 template <typename T>
37 struct is_arena_matrix_cl_impl<math::arena_matrix_cl<T>>
38     : public std::true_type {};
39 
40 }  // namespace internal
41 
42 template <typename T>
43 struct is_arena_matrix_cl
44     : public internal::is_arena_matrix_cl_impl<std::decay_t<T>> {};
45 
46 STAN_ADD_REQUIRE_UNARY(arena_matrix_cl, is_arena_matrix_cl, matrix_cl_group);
47 STAN_ADD_REQUIRE_CONTAINER(arena_matrix_cl, is_arena_matrix_cl,
48                            matrix_cl_group);
49 
50 }  // namespace stan
51 #endif
52