1 // Copyright (C) 2018 Intel Corporation
3 // SPDX-License-Identifier: Apache-2.0
11 #include <type_traits>
21 template<int N, int... S>
22 struct Gens : Gens<N-1, N-1, S...> { };
27 typedef Seq<S...> type;
31 using gen_t = typename Gens<N>::type;
33 template<std::size_t I = 0, typename F, typename... TupleTypes>
34 inline auto tupleForeachImpl(const std::tuple<TupleTypes...>& /*tup*/, F&& /*fun*/) -> typename std::enable_if<(I == sizeof...(TupleTypes))>::type
38 template<std::size_t I = 0, typename F, typename... TupleTypes>
39 inline auto tupleForeachImpl(const std::tuple<TupleTypes...>& tup, F&& fun) -> typename std::enable_if<(I < sizeof...(TupleTypes))>::type
41 fun(std::get<I>(tup));
42 tupleForeachImpl<I + 1, F, TupleTypes...>(tup, std::forward<F>(fun));
45 template<std::size_t I = 0, typename F, typename... TupleTypes>
46 inline auto tupleForeachImpl(std::tuple<TupleTypes...>& tup, F&& fun) -> typename std::enable_if<(I < sizeof...(TupleTypes))>::type
48 fun(std::get<I>(tup));
49 tupleForeachImpl<I + 1, F, TupleTypes...>(tup, std::forward<F>(fun));
55 using type = typename std::remove_reference<T>::type;
66 using fix_rval_t = typename fix_rval<T>::type;
70 inline namespace Range
73 /// Converts rvalue refs to values
74 /// but preserves lvalue refs
75 template<typename... Elements>
76 inline auto tuple_remove_rvalue_refs(Elements&&... args)->
77 std::tuple<details::fix_rval_t<Elements>...>
79 return std::tuple<details::fix_rval_t<Elements>...>(std::forward<Elements>(args)...);
82 template<typename F, typename... TupleTypes>
83 inline void tupleForeach(const std::tuple<TupleTypes...>& tup, F&& fun)
85 details::tupleForeachImpl(tup, std::forward<F>(fun));
88 template<typename F, typename... TupleTypes>
89 inline void tupleForeach(std::tuple<TupleTypes...>& tup, F&& fun)
91 details::tupleForeachImpl(tup, std::forward<F>(fun));
97 #endif // UTIL_TUPLE_HPP