diff options
Diffstat (limited to '')
-rw-r--r-- | MoonParser/pegtl/internal/integer_sequence.hpp | 85 |
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 | |||
11 | namespace 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 | ||