[c++] Whitelist std::integer_sequence and replace base::IndexSequence with std::index_sequence.

The helper base::MakeIndexSequenceForTuple doesn't have a drop-in replacement
in the STL (std::index_sequence_for takes a parameter pack), so it has been
kept.

Bug: 554717
Change-Id: Ib38ea21855cd5c0f913727282a3603dc05287000
Tbr: [email protected]
Reviewed-on: https://chromium-review.googlesource.com/616082
Reviewed-by: Jeremy Roman <[email protected]>
Reviewed-by: Nico Weber <[email protected]>
Commit-Queue: Jeremy Roman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#494802}
diff --git a/base/tuple.h b/base/tuple.h
index e13afaf..049b505d 100644
--- a/base/tuple.h
+++ b/base/tuple.h
@@ -27,36 +27,15 @@
 
 #include <stddef.h>
 #include <tuple>
+#include <utility>
 
 #include "build/build_config.h"
 
 namespace base {
 
-// Index sequences
-//
-// Minimal clone of the similarly-named C++14 functionality.
-
-template <size_t...>
-struct IndexSequence {};
-
-template <size_t... Ns>
-struct MakeIndexSequenceImpl;
-
-template <size_t... Ns>
-struct MakeIndexSequenceImpl<0, Ns...> {
-  using Type = IndexSequence<Ns...>;
-};
-
-template <size_t N, size_t... Ns>
-struct MakeIndexSequenceImpl<N, Ns...>
-    : MakeIndexSequenceImpl<N - 1, N - 1, Ns...> {};
-
-template <size_t N>
-using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::Type;
-
 template <typename T>
-using MakeIndexSequenceForTuple =
-    MakeIndexSequence<std::tuple_size<typename std::decay<T>::type>::value>;
+using MakeIndexSequenceForTuple = std::make_index_sequence<
+    std::tuple_size<typename std::decay<T>::type>::value>;
 
 // Dispatchers ----------------------------------------------------------------
 //
@@ -73,7 +52,7 @@
 inline void DispatchToMethodImpl(const ObjT& obj,
                                  Method method,
                                  Tuple&& args,
-                                 IndexSequence<Ns...>) {
+                                 std::index_sequence<Ns...>) {
   (obj->*method)(std::get<Ns>(std::forward<Tuple>(args))...);
 }
 
@@ -90,7 +69,7 @@
 template <typename Function, typename Tuple, size_t... Ns>
 inline void DispatchToFunctionImpl(Function function,
                                    Tuple&& args,
-                                   IndexSequence<Ns...>) {
+                                   std::index_sequence<Ns...>) {
   (*function)(std::get<Ns>(std::forward<Tuple>(args))...);
 }
 
@@ -112,8 +91,8 @@
                                  Method method,
                                  InTuple&& in,
                                  OutTuple* out,
-                                 IndexSequence<InNs...>,
-                                 IndexSequence<OutNs...>) {
+                                 std::index_sequence<InNs...>,
+                                 std::index_sequence<OutNs...>) {
   (obj->*method)(std::get<InNs>(std::forward<InTuple>(in))...,
                  &std::get<OutNs>(*out)...);
 }