]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/fusion/container/list/detail/at_impl.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / fusion / container / list / detail / at_impl.hpp
1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
3
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #if !defined(FUSION_AT_IMPL_07172005_0726)
8 #define FUSION_AT_IMPL_07172005_0726
9
10 #include <boost/fusion/support/config.hpp>
11 #include <boost/fusion/support/detail/access.hpp>
12 #include <boost/type_traits/is_const.hpp>
13 #include <boost/type_traits/add_const.hpp>
14 #include <boost/mpl/if.hpp>
15 #include <boost/mpl/bool.hpp>
16
17 namespace boost { namespace fusion
18 {
19 namespace detail
20 {
21 template <typename Cons>
22 struct cons_deref
23 {
24 typedef typename Cons::car_type type;
25 };
26
27 template <typename Cons, int I>
28 struct cons_advance
29 {
30 typedef typename
31 cons_advance<Cons, I-1>::type::cdr_type
32 type;
33 };
34
35 template <typename Cons>
36 struct cons_advance<Cons, 0>
37 {
38 typedef Cons type;
39 };
40
41 template <typename Cons>
42 struct cons_advance<Cons, 1>
43 {
44 typedef typename Cons::cdr_type type;
45 };
46
47 template <typename Cons>
48 struct cons_advance<Cons, 2>
49 {
50 #if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above
51 typedef typename Cons::cdr_type::cdr_type type;
52 #else
53 typedef typename Cons::cdr_type _a;
54 typedef typename _a::cdr_type type;
55 #endif
56 };
57
58 template <typename Cons>
59 struct cons_advance<Cons, 3>
60 {
61 #if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above
62 typedef typename Cons::cdr_type::cdr_type::cdr_type type;
63 #else
64 typedef typename Cons::cdr_type _a;
65 typedef typename _a::cdr_type _b;
66 typedef typename _b::cdr_type type;
67 #endif
68 };
69
70 template <typename Cons>
71 struct cons_advance<Cons, 4>
72 {
73 #if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above
74 typedef typename Cons::cdr_type::cdr_type::cdr_type::cdr_type type;
75 #else
76 typedef typename Cons::cdr_type _a;
77 typedef typename _a::cdr_type _b;
78 typedef typename _b::cdr_type _c;
79 typedef typename _c::cdr_type type;
80 #endif
81 };
82 }
83
84 struct cons_tag;
85
86 namespace extension
87 {
88 template <typename Tag>
89 struct at_impl;
90
91 template <>
92 struct at_impl<cons_tag>
93 {
94 template <typename Sequence, typename N>
95 struct apply
96 {
97 typedef typename detail::cons_deref<
98 typename detail::cons_advance<Sequence, N::value>::type>::type
99 element;
100
101 typedef typename
102 mpl::if_<
103 is_const<Sequence>
104 , typename detail::cref_result<element>::type
105 , typename detail::ref_result<element>::type
106 >::type
107 type;
108
109 template <typename Cons, int N2>
110 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
111 static type
112 call(Cons& s, mpl::int_<N2>)
113 {
114 return call(s.cdr, mpl::int_<N2-1>());
115 }
116
117 template <typename Cons>
118 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
119 static type
120 call(Cons& s, mpl::int_<0>)
121 {
122 return s.car;
123 }
124
125 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
126 static type
127 call(Sequence& s)
128 {
129 return call(s, mpl::int_<N::value>());
130 }
131 };
132 };
133 }
134 }}
135
136 #endif