Loading [MathJax]/extensions/TeX/AMSsymbols.js
Automatic Differentiation
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Loading...
Searching...
No Matches
plain_type.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_META_PLAIN_TYPE_HPP
2#define STAN_MATH_PRIM_META_PLAIN_TYPE_HPP
3
8#include <type_traits>
9
10namespace stan {
11
17template <typename T, typename Enable = void>
18struct plain_type {
19 using type = std::decay_t<T>;
20};
21
22template <typename T>
24
35template <typename T>
38 using type = std::conditional_t<std::is_same<std::decay_t<T>, T1>::value,
39 const T1&, T1>;
40};
41
42template <typename T>
44
45namespace internal {
46// primary template handles types that have no nested ::type member:
47template <class, class = void>
48struct has_plain_object : std::false_type {};
49
50// specialization recognizes types that do have a nested ::type member:
51template <class T>
52struct has_plain_object<T, void_t<typename std::decay_t<T>::PlainObject>>
53 : std::true_type {};
54
55// primary template handles types that have no nested ::type member:
56template <class, class = void>
57struct has_eval : std::false_type {};
58
59// specialization recognizes types that do have a nested ::type member:
60template <class T>
61struct has_eval<T, void_t<decltype(std::declval<std::decay_t<T>&>().eval())>>
62 : std::true_type {};
63
64} // namespace internal
65
71template <typename T>
72struct plain_type<T, require_t<bool_constant<internal::has_eval<T>::value
73 && is_eigen<T>::value>>> {
74 using type = std::decay_t<decltype(std::declval<T&>().eval())>;
75};
76
77template <typename T>
79 T, require_t<bool_constant<!internal::has_eval<T>::value
81 && is_eigen<T>::value>>> {
82 using type = typename std::decay_t<T>::PlainObject;
83};
84
85template <typename... Types>
86struct plain_type<std::tuple<Types...>> {
87 using type = std::tuple<typename plain_type<std::decay_t<Types>>::type...>;
88};
89
90} // namespace stan
91
92#endif // STAN_MATH_PRIM_META_PLAIN_TYPE_HPP
std::integral_constant< bool, B > bool_constant
Alias for structs used for wraps a static constant of bool.
typename eval_return_type< T >::type eval_return_type_t
typename plain_type< std::decay_t< T > >::type plain_type_t
std::enable_if_t< Check::value > require_t
If condition is true, template is enabled.
typename make_void< Ts... >::type void_t
Utility metafunction that maps a sequence of any types to the type void This metafunction is used in ...
Definition void_t.hpp:21
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...
STL namespace.
std::conditional_t< std::is_same< std::decay_t< T >, T1 >::value, const T1 &, T1 > type
plain_type_t< T > T1
Determines return type of calling .eval() on Eigen expression.
Check if type derives from EigenBase
Definition is_eigen.hpp:21
std::tuple< typename plain_type< std::decay_t< Types > >::type... > type
std::decay_t< T > type
Determines plain (non expression) type associated with T.