summaryrefslogtreecommitdiff
path: root/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp')
-rw-r--r--deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp b/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp
new file mode 100644
index 0000000000..23a4e97180
--- /dev/null
+++ b/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp
@@ -0,0 +1,84 @@
+// The Art of C++ / Sequences
+// Copyright (c) 2015 Daniel Frey
+
+#ifndef TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP
+#define TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP
+
+#include <cstddef>
+#include <utility>
+#include <type_traits>
+
+#include "config.hpp"
+#include "integer_sequence.hpp"
+
+namespace tao
+{
+ namespace seq
+ {
+
+#ifdef TAOCPP_USE_STD_MAKE_INTEGER_SEQUENCE
+
+ using std::make_integer_sequence;
+ using std::make_index_sequence;
+ using std::index_sequence_for;
+
+#else
+
+ // idea from http://stackoverflow.com/a/13073076
+
+ namespace impl
+ {
+ template< typename, std::size_t, bool >
+ struct double_up;
+
+ template< typename T, T... Ns, std::size_t N >
+ struct double_up< integer_sequence< T, Ns... >, N, false >
+ {
+ using type = integer_sequence< T, Ns..., ( N + Ns )... >;
+ };
+
+ template< typename T, T... Ns, std::size_t N >
+ struct double_up< integer_sequence< T, Ns... >, N, true >
+ {
+ using type = integer_sequence< T, Ns..., ( N + Ns )..., 2 * N >;
+ };
+
+ template< typename T, T N, typename = void >
+ struct generate;
+
+ template< typename T, T N >
+ using generate_t = typename generate< T, N >::type;
+
+ template< typename T, T N, typename >
+ struct generate
+ : double_up< generate_t< T, N / 2 >, N / 2, N % 2 == 1 >
+ {};
+
+ template< typename T, T N >
+ struct generate< T, N, typename std::enable_if< ( N == 0 ) >::type >
+ {
+ using type = integer_sequence< T >;
+ };
+
+ template< typename T, T N >
+ struct generate< T, N, typename std::enable_if< ( N == 1 ) >::type >
+ {
+ using type = integer_sequence< T, 0 >;
+ };
+ }
+
+ template< typename T, T N >
+ using make_integer_sequence = impl::generate_t< T, N >;
+
+ template< std::size_t N >
+ using make_index_sequence = make_integer_sequence< std::size_t, N >;
+
+ template< typename... Ts >
+ using index_sequence_for = make_index_sequence< sizeof...( Ts ) >;
+
+#endif
+
+ }
+}
+
+#endif // TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP