@@ -29,40 +29,42 @@ template <typename T>
2929inline constexpr decltype (auto ) value_of_rec(T&& x) {
3030 using val_t = std::decay_t <T>;
3131 // ints are cast to doubles, types with base double are passed along
32- if constexpr (std::is_integral_v<val_t > || std::is_floating_point_v<val_t >) {
33- return static_cast <double >(x);
34- } else if constexpr (std::is_floating_point_v<base_type_t <val_t >>) {
35- if constexpr (std::is_rvalue_reference_v<T&&>) {
36- return plain_type_t <T>(std::forward<T>(x));
37- } else {
38- return x;
39- }
40- } else if constexpr (is_complex<val_t >::value) {
41- return std::complex <double >{value_of_rec (x.real ()), value_of_rec (x.imag ())};
42- } else if constexpr (is_std_vector_v<val_t >) {
43- promote_scalar_t <double , val_t > ret;
44- ret.reserve (x.size ());
45- for (auto && x_i : x) {
46- ret.push_back (value_of_rec (std::forward<decltype (x_i)>(x_i)));
47- }
48- return ret;
49- } else if constexpr (is_eigen_v<val_t >) {
50- return make_holder (
51- [](auto & m) {
52- return m.unaryExpr ([](auto x_i) { return value_of_rec (x_i); });
53- },
54- std::forward<T>(x));
55- } else if constexpr (is_tuple_v<val_t >) {
32+ if constexpr (is_tuple_v<val_t >) {
5633 return stan::math::apply (
5734 [](auto &&... args) {
5835 return partially_forward_as_tuple (
5936 value_of_rec (std::forward<decltype (args)>(args))...);
6037 },
6138 std::forward<T>(x));
62- } else if constexpr (is_var_v<val_t >) {
63- return x.vi_ ->val_ ;
64- } else if constexpr (is_fvar<val_t >::value) {
65- return value_of_rec (x.val ());
39+ } else {
40+ if constexpr (std::is_integral_v<val_t > || std::is_floating_point_v<val_t >) {
41+ return static_cast <double >(x);
42+ } else if constexpr (std::is_floating_point_v<base_type_t <val_t >>) {
43+ if constexpr (std::is_rvalue_reference_v<T&&>) {
44+ return plain_type_t <T>(std::forward<T>(x));
45+ } else {
46+ return x;
47+ }
48+ } else if constexpr (is_complex<val_t >::value) {
49+ return std::complex <double >{value_of_rec (x.real ()), value_of_rec (x.imag ())};
50+ } else if constexpr (is_std_vector_v<val_t >) {
51+ promote_scalar_t <double , val_t > ret;
52+ ret.reserve (x.size ());
53+ for (auto && x_i : x) {
54+ ret.push_back (value_of_rec (std::forward<decltype (x_i)>(x_i)));
55+ }
56+ return ret;
57+ } else if constexpr (is_eigen_v<val_t >) {
58+ return make_holder (
59+ [](auto & m) {
60+ return m.unaryExpr ([](auto x_i) { return value_of_rec (x_i); });
61+ },
62+ std::forward<T>(x));
63+ } else if constexpr (is_var_v<val_t >) {
64+ return x.vi_ ->val_ ;
65+ } else if constexpr (is_fvar<val_t >::value) {
66+ return value_of_rec (x.val ());
67+ }
6668 }
6769}
6870
0 commit comments