Publishing R3
[platform/upstream/dldt.git] / inference-engine / thirdparty / ade / common / include / util / tuple.hpp
1 // Copyright (C) 2018 Intel Corporation
2 //
3 // SPDX-License-Identifier: Apache-2.0
4 //
5
6 #ifndef UTIL_TUPLE_HPP
7 #define UTIL_TUPLE_HPP
8
9 #include <tuple>
10 #include <utility>
11 #include <type_traits>
12
13 namespace util
14 {
15
16 namespace details
17 {
18 template<int...>
19 struct Seq { };
20
21 template<int N, int... S>
22 struct Gens : Gens<N-1, N-1, S...> { };
23
24 template<int... S>
25 struct Gens<0, S...>
26 {
27   typedef Seq<S...> type;
28 };
29
30 template<int N>
31 using gen_t = typename Gens<N>::type;
32
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
35 {
36 }
37
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
40 {
41     fun(std::get<I>(tup));
42     tupleForeachImpl<I + 1, F, TupleTypes...>(tup, std::forward<F>(fun));
43 }
44
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
47 {
48     fun(std::get<I>(tup));
49     tupleForeachImpl<I + 1, F, TupleTypes...>(tup, std::forward<F>(fun));
50 }
51
52 template<typename T>
53 struct fix_rval
54 {
55     using type = typename std::remove_reference<T>::type;
56 };
57
58 template<typename T>
59 struct fix_rval<T&>
60 {
61     using type = T&;
62 };
63
64
65 template<typename T>
66 using fix_rval_t = typename fix_rval<T>::type;
67
68 }
69
70 inline namespace Range
71 {
72
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>...>
78 {
79     return std::tuple<details::fix_rval_t<Elements>...>(std::forward<Elements>(args)...);
80 }
81
82 template<typename F, typename... TupleTypes>
83 inline void tupleForeach(const std::tuple<TupleTypes...>& tup, F&& fun)
84 {
85     details::tupleForeachImpl(tup, std::forward<F>(fun));
86 }
87
88 template<typename F, typename... TupleTypes>
89 inline void tupleForeach(std::tuple<TupleTypes...>& tup, F&& fun)
90 {
91     details::tupleForeachImpl(tup, std::forward<F>(fun));
92 }
93
94 }
95 }
96
97 #endif // UTIL_TUPLE_HPP