|
| 1 | +#ifndef RCPP_NT2_VARIADIC_TOOLS_H |
| 2 | +#define RCPP_NT2_VARIADIC_TOOLS_H |
| 3 | + |
| 4 | +namespace RcppNT2 { |
| 5 | +namespace variadic { |
| 6 | + |
| 7 | +template <typename F, typename... Args> |
| 8 | +inline auto apply(F&& f, Args&&... args) -> decltype(std::forward<F>(f)(std::forward<Args>(args)...)) |
| 9 | +{ |
| 10 | + return std::forward<F>(f)(std::forward<Args>(args)...); |
| 11 | +} |
| 12 | + |
| 13 | +template <typename F, typename T> |
| 14 | +inline auto min(F&& f, T&& t) -> decltype(std::forward<T>(t)) |
| 15 | +{ |
| 16 | + return std::forward<T>(t); |
| 17 | +} |
| 18 | + |
| 19 | +template <typename F, typename T, typename... Ts> |
| 20 | +inline auto min(F&& f, T&& t, Ts&&... ts) -> decltype(std::forward<T>(t)) |
| 21 | +{ |
| 22 | + auto&& lhs = min(std::forward<F>(f), std::forward<T>(t)); |
| 23 | + auto&& rhs = min(std::forward<F>(f), std::forward<Ts>(ts)...); |
| 24 | + return lhs < rhs ? lhs : rhs; |
| 25 | +} |
| 26 | + |
| 27 | +template <typename F, typename T> |
| 28 | +inline auto max(F&& f, T&& t) -> decltype(std::forward<T>(t)) |
| 29 | +{ |
| 30 | + return std::forward<T>(t); |
| 31 | +} |
| 32 | + |
| 33 | +template <typename F, typename T, typename... Ts> |
| 34 | +inline auto max(F&& f, T&& t, Ts&&... ts) -> decltype(std::forward<T>(t)) |
| 35 | +{ |
| 36 | + auto&& lhs = max(std::forward<F>(f), std::forward<T>(t)); |
| 37 | + auto&& rhs = max(std::forward<F>(f), std::forward<Ts>(ts)...); |
| 38 | + return lhs < rhs ? rhs : lhs; |
| 39 | +} |
| 40 | + |
| 41 | +template <int Size, typename... Ts> |
| 42 | +void increment(Ts&&... ts) {} |
| 43 | + |
| 44 | +template <int Size, typename T, typename... Ts> |
| 45 | +void increment(T&& t, Ts&&... ts) |
| 46 | +{ |
| 47 | + std::forward<T>(t) += Size; |
| 48 | + increment<Size>(std::forward<Ts>(ts)...); |
| 49 | +} |
| 50 | + |
| 51 | +} // namespace variadic |
| 52 | +} // namespace RcppNT2 |
| 53 | + |
| 54 | +#endif /* RCPP_NT2_VARIADIC_TOOLS_H */ |
0 commit comments