aboutsummaryrefslogtreecommitdiff
path: root/MoonParser/pegtl/internal/integer_sequence.hpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--MoonParser/pegtl/internal/integer_sequence.hpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/MoonParser/pegtl/internal/integer_sequence.hpp b/MoonParser/pegtl/internal/integer_sequence.hpp
new file mode 100644
index 0000000..cdcf20d
--- /dev/null
+++ b/MoonParser/pegtl/internal/integer_sequence.hpp
@@ -0,0 +1,85 @@
1// Copyright (c) 2017 Dr. Colin Hirsch and Daniel Frey
2// Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/
3
4#ifndef TAOCPP_PEGTL_INCLUDE_INTERNAL_INTEGER_SEQUENCE_HPP
5#define TAOCPP_PEGTL_INCLUDE_INTERNAL_INTEGER_SEQUENCE_HPP
6
7#include <cstddef>
8#include <type_traits>
9#include <utility>
10
11namespace tao
12{
13 namespace TAOCPP_PEGTL_NAMESPACE
14 {
15 namespace internal
16 {
17 template< typename T, T... Ns >
18 struct integer_sequence
19 {
20 using value_type = T;
21
22 static constexpr std::size_t size() noexcept
23 {
24 return sizeof...( Ns );
25 }
26 };
27
28 template< std::size_t... Ns >
29 using index_sequence = integer_sequence< std::size_t, Ns... >;
30
31 template< typename, std::size_t, bool >
32 struct double_up;
33
34 template< typename T, T... Ns, std::size_t N >
35 struct double_up< integer_sequence< T, Ns... >, N, false >
36 {
37 using type = integer_sequence< T, Ns..., ( N + Ns )... >;
38 };
39
40 template< typename T, T... Ns, std::size_t N >
41 struct double_up< integer_sequence< T, Ns... >, N, true >
42 {
43 using type = integer_sequence< T, Ns..., ( N + Ns )..., 2 * N >;
44 };
45
46 template< typename T, T N, typename = void >
47 struct generate_sequence;
48
49 template< typename T, T N >
50 using generate_sequence_t = typename generate_sequence< T, N >::type;
51
52 template< typename T, T N, typename >
53 struct generate_sequence
54 : double_up< generate_sequence_t< T, N / 2 >, N / 2, N % 2 == 1 >
55 {
56 };
57
58 template< typename T, T N >
59 struct generate_sequence< T, N, typename std::enable_if< ( N == 0 ) >::type >
60 {
61 using type = integer_sequence< T >;
62 };
63
64 template< typename T, T N >
65 struct generate_sequence< T, N, typename std::enable_if< ( N == 1 ) >::type >
66 {
67 using type = integer_sequence< T, 0 >;
68 };
69
70 template< typename T, T N >
71 using make_integer_sequence = generate_sequence_t< T, N >;
72
73 template< std::size_t N >
74 using make_index_sequence = make_integer_sequence< std::size_t, N >;
75
76 template< typename... Ts >
77 using index_sequence_for = make_index_sequence< sizeof...( Ts ) >;
78
79 } // namespace internal
80
81 } // namespace TAOCPP_PEGTL_NAMESPACE
82
83} // namespace tao
84
85#endif