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
forward_as.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_META_FORWARD_AS_HPP
2#define STAN_MATH_PRIM_META_FORWARD_AS_HPP
3
5#include <type_traits>
6
7namespace stan {
8namespace math {
9
10namespace internal {
11template <typename T1, typename T2>
12constexpr bool eigen_static_size_match(T1 desired, T2 actual) {
13 return static_cast<int>(desired) == Eigen::Dynamic
14 || static_cast<int>(desired) == static_cast<int>(actual);
15}
16} // namespace internal
17
32template <typename T_desired, typename T_actual,
33 typename
34 = std::enable_if_t<std::is_same<std::decay_t<T_actual>,
35 std::decay_t<T_desired>>::value
37inline T_actual&& forward_as(T_actual&& a) { // NOLINT
38 return std::forward<T_actual>(a);
39}
40
57template <
58 typename T_desired, typename T_actual,
60 typename = std::enable_if_t<
61 !std::is_same<std::decay<T_actual>, std::decay<T_desired>>::value
62 && !(std::is_floating_point_v<std::decay_t<
63 T_desired>> && std::is_integral_v<std::decay_t<T_actual>>)>>
64inline T_desired forward_as(const T_actual& a) {
65 throw std::runtime_error(
66 "Wrong type assumed! Please file a bug report. prim/meta/forward_as.hpp "
67 "line "
68 + std::to_string(__LINE__));
69}
70
86template <typename T_desired, typename T_actual,
87 typename = std::enable_if_t<
88 std::is_floating_point_v<std::decay_t<
89 T_desired>> && std::is_integral_v<std::decay_t<T_actual>>>>
90inline T_desired forward_as(const T_actual& a) {
91 return static_cast<T_desired>(a);
92}
93
108template <
109 typename T_desired, typename T_actual,
111 std::enable_if_t<
112 std::is_same<value_type_t<T_actual>, value_type_t<T_desired>>::value
115 T_desired::RowsAtCompileTime,
116 std::decay_t<T_actual>::RowsAtCompileTime)
118 T_desired::ColsAtCompileTime,
119 std::decay_t<T_actual>::ColsAtCompileTime)>* = nullptr>
120inline T_actual&& forward_as(T_actual&& a) { // NOLINT
121 return std::forward<T_actual>(a);
122}
123
140template <
141 typename T_desired, typename T_actual,
143 std::enable_if_t<
144 !std::is_same<value_type_t<T_actual>, value_type_t<T_desired>>::value
146 T_desired::RowsAtCompileTime,
147 std::decay_t<T_actual>::RowsAtCompileTime)
149 T_desired::ColsAtCompileTime,
150 std::decay_t<T_actual>::ColsAtCompileTime)>* = nullptr>
151inline T_desired forward_as(const T_actual& a) {
152 throw std::runtime_error(
153 "Wrong type assumed! Please file a bug report. prim/meta/forward_as.hpp "
154 "line "
155 + std::to_string(__LINE__));
156}
157
158} // namespace math
159} // namespace stan
160#endif
require_all_t< is_eigen< std::decay_t< Types > >... > require_all_eigen_t
Require all of the types satisfy is_eigen.
Definition is_eigen.hpp:123
require_t< is_eigen< std::decay_t< T > > > require_eigen_t
Require type satisfies is_eigen.
Definition is_eigen.hpp:113
require_any_not_t< is_eigen< std::decay_t< Types > >... > require_any_not_eigen_t
Require at least one of the types do not satisfy is_eigen.
Definition is_eigen.hpp:140
typename value_type< T >::type value_type_t
Helper function for accessing underlying type.
T_actual && forward_as(T_actual &&a)
Assume which type we get.
constexpr bool eigen_static_size_match(T1 desired, T2 actual)
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...
Check if type derives from EigenBase
Definition is_eigen.hpp:21