blob: 89eaa4b67dc0fd7397e0f3cea301e1246985ac2b [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIB_FXL_FUNCTIONAL_APPLY_H_
#define LIB_FXL_FUNCTIONAL_APPLY_H_
#include <tuple>
#include <type_traits>
#include <utility>
namespace fxl {
namespace internal {
template <class F, class Tuple, size_t... I>
constexpr decltype(auto) ApplyImpl(F&& f, Tuple&& t,
std::integer_sequence<size_t, I...>) {
return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...);
}
} // namespace internal
// Invoke the callable object |f| with |t| as arguments.
template <typename F, typename Tuple>
decltype(auto) Apply(F&& f, Tuple&& t) {
return internal::ApplyImpl(
std::forward<F>(f), std::forward<Tuple>(t),
std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>{});
}
} // namespace fxl
#endif // LIB_FXL_FUNCTIONAL_APPLY_H_