18 #ifndef OTABSL_UTILITY_UTILITY_H_
19 #define OTABSL_UTILITY_UTILITY_H_
26 #include "../base/config.h"
27 #include "../base/internal/inline_variable.h"
28 #include "../base/internal/invoke.h"
29 #include "../meta/type_traits.h"
53 template <
typename T, T... Ints>
56 static constexpr
size_t size() noexcept {
return sizeof...(Ints); }
64 template <
size_t... Ints>
67 namespace utility_internal {
69 template <
typename Seq,
size_t SeqSize,
size_t Rem>
73 template <
typename T, T... Ints,
size_t SeqSize>
78 template <
typename T, T... Ints,
size_t SeqSize>
85 template <
typename T,
size_t N>
119 template <
typename T, T N>
135 template <
typename... Ts>
140 #ifdef OTABSL_USES_STD_OPTIONAL
142 using std::in_place_t;
145 #else // OTABSL_USES_STD_OPTIONAL
156 #endif // OTABSL_USES_STD_OPTIONAL
158 #if defined(OTABSL_USES_STD_ANY) || defined(OTABSL_USES_STD_VARIANT)
168 template <
typename T>
171 template <
typename T>
173 #endif // OTABSL_USES_STD_ANY || OTABSL_USES_STD_VARIANT
175 #ifdef OTABSL_USES_STD_VARIANT
190 #endif // OTABSL_USES_STD_VARIANT
198 template <
typename T>
199 constexpr absl::OTABSL_OPTION_NAMESPACE_NAME::remove_reference_t<T>&&
move(T&& t) noexcept {
200 return static_cast<absl::OTABSL_OPTION_NAMESPACE_NAME::remove_reference_t<T>&&
>(t);
207 template <
typename T>
209 absl::OTABSL_OPTION_NAMESPACE_NAME::remove_reference_t<T>& t) noexcept {
210 return static_cast<T&&
>(t);
213 namespace utility_internal {
215 template <
typename Functor,
typename Tuple, std::size_t... Indexes>
218 absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Functor>(functor),
219 std::get<Indexes>(absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Tuple>(t))...)) {
221 absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Functor>(functor),
222 std::get<Indexes>(absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Tuple>(t))...);
266 template <
typename Functor,
typename Tuple>
267 auto apply(Functor&& functor, Tuple&& t)
269 absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Functor>(functor), absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Tuple>(t),
271 typename std::remove_reference<Tuple>::type>::value>{})) {
273 absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Functor>(functor), absl::OTABSL_OPTION_NAMESPACE_NAME::forward<Tuple>(t),
275 typename std::remove_reference<Tuple>::type>::value>{});
291 template <
typename T,
typename U = T>
294 obj = absl::OTABSL_OPTION_NAMESPACE_NAME::forward<U>(new_value);
298 namespace utility_internal {
299 template <
typename T,
typename Tuple,
size_t... I>
301 return T(std::get<I>(std::forward<Tuple>(tup))...);
317 template <
typename T,
typename Tuple>
319 return utility_internal::make_from_tuple_impl<T>(
320 std::forward<Tuple>(tup),
322 std::tuple_size<absl::OTABSL_OPTION_NAMESPACE_NAME::decay_t<Tuple>>::value>{});
328 #endif // OTABSL_UTILITY_UTILITY_H_