40 #ifndef ABSL_UTILITY_UTILITY_H_
41 #define ABSL_UTILITY_UTILITY_H_
48 #include "absl/base/config.h"
49 #include "absl/base/internal/inline_variable.h"
50 #include "absl/base/internal/invoke.h"
51 #include "absl/meta/type_traits.h"
75 template <
typename T,
T... Ints>
76 struct integer_sequence {
78 static constexpr
size_t size() noexcept {
return sizeof...(Ints); }
86 template <
size_t... Ints>
89 namespace utility_internal {
91 template <
typename Seq,
size_t SeqSize,
size_t Rem>
95 template <
typename T,
T... Ints,
size_t SeqSize>
96 struct Extend<integer_sequence<
T, Ints...>, SeqSize, 0> {
100 template <
typename T,
T... Ints,
size_t SeqSize>
107 template <
typename T,
size_t N>
113 template <
typename T>
118 template <
typename T>
126 struct InPlaceIndexTag {
141 template <
typename T, T N>
157 template <
typename... Ts>
162 #ifdef ABSL_USES_STD_OPTIONAL
164 using std::in_place_t;
167 #else // ABSL_USES_STD_OPTIONAL
174 struct in_place_t {};
178 #endif // ABSL_USES_STD_OPTIONAL
180 #if defined(ABSL_USES_STD_ANY) || defined(ABSL_USES_STD_VARIANT)
190 template <
typename T>
193 template <
typename T>
195 #endif // ABSL_USES_STD_ANY || ABSL_USES_STD_VARIANT
197 #ifdef ABSL_USES_STD_VARIANT
212 #endif // ABSL_USES_STD_VARIANT
220 template <
typename T>
229 template <
typename T>
232 return static_cast<T&&
>(
t);
235 namespace utility_internal {
237 template <
typename Functor,
typename Tuple, std::size_t... Indexes>
238 auto apply_helper(Functor&& functor, Tuple&& t, index_sequence<Indexes...>)
240 absl::forward<Functor>(functor),
241 std::get<Indexes>(absl::forward<Tuple>(t))...)) {
243 absl::forward<Functor>(functor),
244 std::get<Indexes>(absl::forward<Tuple>(t))...);
288 template <
typename Functor,
typename Tuple>
289 auto apply(Functor&& functor, Tuple&& t)
291 absl::forward<Functor>(functor), absl::forward<Tuple>(t),
295 absl::forward<Functor>(functor), absl::forward<Tuple>(t),
313 template <
typename T,
typename U = T>
316 obj = absl::forward<U>(new_value);
320 namespace utility_internal {
321 template <
typename T,
typename Tuple,
size_t...
I>
323 return T(std::get<I>(std::forward<Tuple>(tup))...);
339 template <
typename T,
typename Tuple>
341 return utility_internal::make_from_tuple_impl<T>(
342 std::forward<Tuple>(tup),
350 #endif // ABSL_UTILITY_UTILITY_H_