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
for_each.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_FUNCTOR_FOR_EACH_HPP
2#define STAN_MATH_PRIM_FUNCTOR_FOR_EACH_HPP
3
5#include <functional>
6#include <tuple>
7#include <utility>
8
9namespace stan {
10namespace math {
11namespace internal {
12
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)))),
23 0)...});
24}
25
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)))),
38 0)...});
39}
40
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)))),
54 0)...});
55}
56
57// TODO(Steve) This should be variadic
58template <typename F, typename T1, typename T2, typename T3, typename T4,
59 size_t... Is>
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)))),
68 0)...});
69}
70} // namespace internal
71
79template <typename F, typename T>
80constexpr inline void for_each(F&& f, const std::tuple<>& /* t */) {
81 return;
82}
83
91template <typename F, typename T>
92constexpr inline auto for_each(F&& f, T&& t) {
93 return internal::for_each(
94 std::forward<F>(f), std::forward<T>(t),
95 std::make_index_sequence<std::tuple_size<std::decay_t<T>>::value>());
96}
97
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");
113 return internal::for_each(std::forward<F>(f), std::forward<T1>(t1),
114 std::forward<T2>(t2),
115 std::make_index_sequence<t1_size>());
116}
117
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");
138 return internal::for_each(std::forward<F>(f), std::forward<T1>(t1),
139 std::forward<T2>(t2), std::forward<T3>(t3),
140 std::make_index_sequence<t1_size>());
141}
142
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");
155 return internal::for_each(std::forward<F>(f), std::forward<T1>(t1),
156 std::forward<T2>(t2), std::forward<T3>(t3),
157 std::forward<T4>(t4),
158 std::make_index_sequence<t1_size>());
159}
160
161} // namespace math
162} // namespace stan
163
164#endif
constexpr auto for_each(F &&f, T &&t, std::index_sequence< Is... >)
Implementation of for_each.
Definition for_each.hpp:19
constexpr void for_each(F &&f, const std::tuple<> &)
Apply a function to each element of a tuple.
Definition for_each.hpp:80
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...