1#ifndef STAN_MATH_PRIM_FUNCTOR_FOR_EACH_HPP
2#define STAN_MATH_PRIM_FUNCTOR_FOR_EACH_HPP
18template <
typename F,
typename T,
size_t... Is>
19constexpr inline auto for_each(F&& f, T&& t, std::index_sequence<Is...>) {
20 using Swallow =
int[];
21 static_cast<void>(Swallow{
22 (
static_cast<void>(std::forward<F>(f)(std::get<Is>(std::forward<T>(t)))),
31template <
typename F,
typename T1,
typename T2,
size_t... Is>
32constexpr inline auto for_each(F&& f, T1&& t1, T2&& t2,
33 std::index_sequence<Is...>) {
34 using Swallow =
int[];
35 static_cast<void>(Swallow{(
36 static_cast<void>(std::forward<F>(f)(std::get<Is>(std::forward<T1>(t1)),
37 std::get<Is>(std::forward<T2>(t2)))),
46template <
typename F,
typename T1,
typename T2,
typename T3,
size_t... Is>
47constexpr inline auto for_each(F&& f, T1&& t1, T2&& t2, T3&& t3,
48 std::index_sequence<Is...>) {
49 using Swallow =
int[];
50 static_cast<void>(Swallow{(
51 static_cast<void>(std::forward<F>(f)(std::get<Is>(std::forward<T1>(t1)),
52 std::get<Is>(std::forward<T2>(t2)),
53 std::get<Is>(std::forward<T3>(t3)))),
58template <
typename F,
typename T1,
typename T2,
typename T3,
typename T4,
60constexpr inline auto for_each(F&& f, T1&& t1, T2&& t2, T3&& t3, T4&& t4,
61 std::index_sequence<Is...>) {
62 using Swallow =
int[];
63 static_cast<void>(Swallow{(
64 static_cast<void>(std::forward<F>(f)(std::get<Is>(std::forward<T1>(t1)),
65 std::get<Is>(std::forward<T2>(t2)),
66 std::get<Is>(std::forward<T3>(t3)),
67 std::get<Is>(std::forward<T4>(t4)))),
79template <
typename F,
typename T>
80constexpr inline void for_each(F&& f,
const std::tuple<>& ) {
91template <
typename F,
typename T>
94 std::forward<F>(f), std::forward<T>(t),
95 std::make_index_sequence<std::tuple_size<std::decay_t<T>>::value>());
107template <
typename F,
typename T1,
typename T2>
108constexpr inline auto for_each(F&& f, T1&& t1, T2&& t2) {
109 constexpr auto t1_size = std::tuple_size<std::decay_t<T1>>::value;
110 constexpr auto t2_size = std::tuple_size<std::decay_t<T2>>::value;
111 static_assert(t1_size == t2_size,
112 "Size Mismatch between t1 and t2 in for_each");
114 std::forward<T2>(t2),
115 std::make_index_sequence<t1_size>());
129template <
typename F,
typename T1,
typename T2,
typename T3>
130constexpr inline auto for_each(F&& f, T1&& t1, T2&& t2, T3&& t3) {
131 constexpr auto t1_size = std::tuple_size<std::decay_t<T1>>::value;
132 constexpr auto t2_size = std::tuple_size<std::decay_t<T2>>::value;
133 constexpr auto t3_size = std::tuple_size<std::decay_t<T3>>::value;
134 static_assert(t1_size == t2_size,
135 "Size Mismatch between t1 and t2 in for_each");
136 static_assert(t1_size == t3_size,
137 "Size Mismatch between t1 and t3 in for_each");
139 std::forward<T2>(t2), std::forward<T3>(t3),
140 std::make_index_sequence<t1_size>());
143template <
typename F,
typename T1,
typename T2,
typename T3,
typename T4>
144constexpr inline auto for_each(F&& f, T1&& t1, T2&& t2, T3&& t3, T4&& t4) {
145 constexpr auto t1_size = std::tuple_size<std::decay_t<T1>>::value;
146 constexpr auto t2_size = std::tuple_size<std::decay_t<T2>>::value;
147 constexpr auto t3_size = std::tuple_size<std::decay_t<T3>>::value;
148 constexpr auto t4_size = std::tuple_size<std::decay_t<T4>>::value;
149 static_assert(t1_size == t2_size,
150 "Size Mismatch between t1 and t2 in for_each");
151 static_assert(t1_size == t3_size,
152 "Size Mismatch between t1 and t3 in for_each");
153 static_assert(t1_size == t4_size,
154 "Size Mismatch between t1 and t3 in for_each");
156 std::forward<T2>(t2), std::forward<T3>(t3),
157 std::forward<T4>(t4),
158 std::make_index_sequence<t1_size>());
constexpr auto for_each(F &&f, T &&t, std::index_sequence< Is... >)
Implementation of for_each.
constexpr void for_each(F &&f, const std::tuple<> &)
Apply a function to each element of a tuple.
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...