-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTupleHelper.h
More file actions
192 lines (163 loc) · 5.63 KB
/
Copy pathTupleHelper.h
File metadata and controls
192 lines (163 loc) · 5.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#ifndef TUPLEHELPER_H
#define TUPLEHELPER_H
#include <optional>
#include <tuple>
#include <type_traits>
#if(defined(_MSVC_LANG) && _MSVC_LANG < 201402L) || ((!defined(_MSVC_LANG)) && __cplusplus < 201402L)
namespace std
{
template<bool B, class T = void>
using enable_if_t = typename enable_if<B, T>::type;
template<class T>
using decay_t = typename decay<T>::type;
template<typename T, T... ints>
struct integer_sequence
{
};
template<typename T, T N, typename = void>
struct make_integer_sequence_impl
{
template<typename>
struct tmp;
template<T... Prev>
struct tmp<integer_sequence<T, Prev...>>
{
using type = integer_sequence<T, Prev..., N - 1>;
};
using type = typename tmp<typename make_integer_sequence_impl<T, N - 1>::type>::type;
};
template<typename T, T N>
struct make_integer_sequence_impl<T, N, typename std::enable_if<N == 0>::type>
{
using type = integer_sequence<T>;
};
template<typename T, T N>
using make_integer_sequence = typename make_integer_sequence_impl<T, N>::type;
template<size_t... _Vals>
using index_sequence = integer_sequence<size_t, _Vals...>;
template<size_t _Size>
using make_index_sequence = make_integer_sequence<size_t, _Size>;
// TEMPLATE CLASS _Cat_base
template<bool _Val>
struct _Cat_base : integral_constant<bool, _Val>
{ // base class for type predicates
};
template<class _Ty>
struct is_null_pointer : _Cat_base<is_same<typename remove_cv<_Ty>::type, nullptr_t>::value>
{ // determine whether _Ty is nullptr_t
};
} // namespace std
#endif // #if __cplusplus != 201402L
//////////////////////////////////////////////////////////////////////////////////////////////////////
template<class tuple_type, class ftype>
constexpr decltype(auto) for_each_tuple(tuple_type&& tuple, ftype&& f)
{
return []<std::size_t... I>(tuple_type && tuple, ftype && f, std::index_sequence<I...>)
{
(f(std::get<I>(tuple)), ...);
return f;
}
(std::forward<tuple_type>(tuple),
std::forward<ftype>(f),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<tuple_type>>::value>{});
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
template<class tuple_type, class ftype>
constexpr decltype(auto) for_each_tuple_index(tuple_type&& tuple, ftype&& f)
{
return []<std::size_t... I>(tuple_type && tuple, ftype && f, std::index_sequence<I...>)
{
(f(std::get<I>(tuple), std::integral_constant<std::size_t, I>()), ...);
return f;
}
(std::forward<tuple_type>(tuple),
std::forward<ftype>(f),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<tuple_type>>::value>{});
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
template<class tuple_type, class ftype>
constexpr decltype(auto) find_if_tuple(tuple_type&& tuple, ftype&& f)
{
return []<std::size_t... I>(tuple_type && tuple, ftype && f, std::index_sequence<I...>)->bool
{
return (f(std::get<I>(tuple)) || ...);
}
(std::forward<tuple_type>(tuple),
std::forward<ftype>(f),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<tuple_type>>::value>{});
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
template<class tuple_type, class ftype>
constexpr decltype(auto) find_if_tuple_index(tuple_type&& tuple, ftype&& f)
{
return []<std::size_t... I>(tuple_type && tuple, ftype && f, std::index_sequence<I...>)->bool
{
return (f(std::get<I>(tuple), std::integral_constant<std::size_t, I>()) || ...);
}
(std::forward<tuple_type>(tuple),
std::forward<ftype>(f),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<tuple_type>>::value>{});
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
template<class... Ts>
struct overloaded_t : Ts...
{
using Ts::operator()...;
};
template<class... Ts>
overloaded_t(Ts...) -> overloaded_t<Ts...>;
/*
overloaded_t overload
{
[&fn, &value, &field_name_tuple](auto member_ptr)
{
// invoke(fn, FieldName, MemberPtr);
fn(field_name_tuple, value.*(member_ptr));
},
[&fn, &value, &field_name_tuple](auto member_ptr, auto tag)
{
// invoke(fn, FieldName, MemberPtr, tag);
fn(field_name_tuple, value.*(member_ptr), tag);
}
};
std::apply(overload, member_ptr_tuple);
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
template<class Tuple>
struct unpack_warp_t
{
Tuple&& tuple;
using count = std::tuple_size<std::remove_reference_t<Tuple>>;
using indexes = std::make_index_sequence<count{}>;
template<class F, std::size_t... Is>
decltype(auto) _unpacker(F&& f, std::index_sequence<Is...>)
{
return f(std::get<Is>(std::forward<Tuple>(tuple))...);
}
template<class F>
decltype(auto) unpack(F&& f)
{
return _unpacker(std::forward<F>(f), indexes{});
}
};
template<class Tuple, class F>
decltype(auto) unpack(Tuple&& tuple, F&& f)
{
unpack_warp_t<Tuple> unpack_warp{std::forward<Tuple>(tuple)};
return unpack_warp.unpack(std::forward<F>(f));
}
/*
for(const auto& pair_v : map_val)
{
unpack(pair_v, [](auto& x, auto&y)
{
});
}
*/
template<class... Args>
auto make_option_tuple(Args&&... args)
{
auto tuple = std::make_tuple(std::forward<Args>(args)...);
return std::optional<decltype(tuple)>(std::move(tuple));
}
#endif /* TUPLEHELPER_H */