Add an implementation of std::index_sequence from C++14
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Sep 2013 21:58:46 +0000 (21:58 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Sep 2013 21:58:46 +0000 (21:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121718

Reviewed by Ryosuke Niwa.

This will make it easier to do things like pack expansion of tuple elements.

* wtf/StdLibExtras.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@156204 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/StdLibExtras.h

index 0d8f97b..c339475 100644 (file)
@@ -1,3 +1,14 @@
+2013-09-20  Anders Carlsson  <andersca@apple.com>
+
+        Add an implementation of std::index_sequence from C++14
+        https://bugs.webkit.org/show_bug.cgi?id=121718
+
+        Reviewed by Ryosuke Niwa.
+
+        This will make it easier to do things like pack expansion of tuple elements.
+
+        * wtf/StdLibExtras.h:
+
 2013-09-20  Allan Sandfeld Jensen  <allan.jensen@digia.com>
 
         Atomics.h does not build on MinGW
index 35c1d4b..7746d9a 100644 (file)
@@ -306,12 +306,8 @@ inline void* operator new(size_t, NotNullTag, void* location)
 }
 
 
-// For standard libraries that do not yet include it, this adds the std::make_unique
-// type. It is defined in the same namespaces as it would be in library that had the
-// support.
-
+// This adds various C++14 features for versions of the STL that may not yet have them.
 namespace std {
-
     template<class T> struct _Unique_if {
         typedef unique_ptr<T> _Single_object;
     };
@@ -362,6 +358,26 @@ namespace std {
     make_unique(Args&&...) = delete;
 #endif
 
+#if COMPILER_SUPPORTS(CXX_VARIADIC_TEMPLATES)
+    // Compile-time integer sequences
+    // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3658.html
+    // (Note that we only implement index_sequence, and not the more generic integer_sequence).
+    template<size_t... indexes> struct index_sequence {
+        static size_t size() { return sizeof...(indexes); }
+    };
+
+    template<size_t currentIndex, size_t...indexes> struct make_index_sequence_helper;
+
+    template<size_t...indexes> struct make_index_sequence_helper<0, indexes...> {
+        typedef std::index_sequence<indexes...> type;
+    };
+
+    template<size_t currentIndex, size_t...indexes> struct make_index_sequence_helper {
+        typedef typename make_index_sequence_helper<currentIndex - 1, currentIndex - 1, indexes...>::type type;
+    };
+
+    template<size_t length> struct make_index_sequence : public make_index_sequence_helper<length>::type { };
+#endif
 }
 
 using WTF::KB;