• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef BOOST_MP11_DETAIL_MPL_COMMON_HPP_INCLUDED
2 #define BOOST_MP11_DETAIL_MPL_COMMON_HPP_INCLUDED
3 
4 // Copyright 2017, 2019 Peter Dimov.
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 //
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt
10 
11 #include <boost/mp11/list.hpp>
12 #include <boost/mp11/algorithm.hpp>
13 
14 namespace boost
15 {
16 namespace mpl
17 {
18 
19 struct forward_iterator_tag;
20 
21 namespace aux
22 {
23 
24 struct mp11_tag {};
25 
26 template<class L> struct mp11_iterator
27 {
28     using category = forward_iterator_tag;
29 
30     using type = mp11::mp_first<L>;
31     using next = mp11_iterator<mp11::mp_rest<L>>;
32 };
33 
34 } // namespace aux
35 
36 // at
37 
38 template< typename Tag > struct at_impl;
39 
40 template<> struct at_impl<aux::mp11_tag>
41 {
42     template<class L, class I> struct apply
43     {
44         using type = mp11::mp_at<L, I>;
45     };
46 };
47 
48 // back
49 
50 template< typename Tag > struct back_impl;
51 
52 template<> struct back_impl<aux::mp11_tag>
53 {
54     template<class L> struct apply
55     {
56         using N = mp11::mp_size<L>;
57         using type = mp11::mp_at_c<L, N::value - 1>;
58     };
59 };
60 
61 // begin
62 
63 template< typename Tag > struct begin_impl;
64 
65 template<> struct begin_impl<aux::mp11_tag>
66 {
67     template<class L> struct apply
68     {
69         using type = aux::mp11_iterator<L>;
70     };
71 };
72 
73 // clear
74 
75 template< typename Tag > struct clear_impl;
76 
77 template<> struct clear_impl<aux::mp11_tag>
78 {
79     template<class L> struct apply
80     {
81         using type = mp11::mp_clear<L>;
82     };
83 };
84 
85 // end
86 
87 template< typename Tag > struct end_impl;
88 
89 template<> struct end_impl<aux::mp11_tag>
90 {
91     template<class L> struct apply
92     {
93         using type = aux::mp11_iterator<mp11::mp_clear<L>>;
94     };
95 };
96 
97 // front
98 
99 template< typename Tag > struct front_impl;
100 
101 template<> struct front_impl<aux::mp11_tag>
102 {
103     template<class L> struct apply
104     {
105         using type = mp11::mp_front<L>;
106     };
107 };
108 
109 // pop_front
110 
111 template< typename Tag > struct pop_front_impl;
112 
113 template<> struct pop_front_impl<aux::mp11_tag>
114 {
115     template<class L> struct apply
116     {
117         using type = mp11::mp_pop_front<L>;
118     };
119 };
120 
121 // push_back
122 
123 template< typename Tag > struct push_back_impl;
124 
125 template<> struct push_back_impl<aux::mp11_tag>
126 {
127     template<class L, class T> struct apply
128     {
129         using type = mp11::mp_push_back<L, T>;
130     };
131 };
132 
133 // push_front
134 
135 template< typename Tag > struct push_front_impl;
136 
137 template<> struct push_front_impl<aux::mp11_tag>
138 {
139     template<class L, class T> struct apply
140     {
141         using type = mp11::mp_push_front<L, T>;
142     };
143 };
144 
145 // size
146 
147 template< typename Tag > struct size_impl;
148 
149 template<> struct size_impl<aux::mp11_tag>
150 {
151     template<class L> struct apply
152     {
153         using type = mp11::mp_size<L>;
154     };
155 };
156 
157 } // namespace mpl
158 } // namespace boost
159 
160 #endif // #ifndef BOOST_MP11_DETAIL_MPL_COMMON_HPP_INCLUDED
161