1 | |
2 | #ifndef BOOST_MPL_VECTOR_AUX_ITEM_HPP_INCLUDED |
3 | #define BOOST_MPL_VECTOR_AUX_ITEM_HPP_INCLUDED |
4 | |
5 | // Copyright Aleksey Gurtovoy 2000-2004 |
6 | // |
7 | // Distributed under the Boost Software License, Version 1.0. |
8 | // (See accompanying file LICENSE_1_0.txt or copy at |
9 | // http://www.boost.org/LICENSE_1_0.txt) |
10 | // |
11 | // See http://www.boost.org/libs/mpl for documentation. |
12 | |
13 | // $Id$ |
14 | // $Date$ |
15 | // $Revision$ |
16 | |
17 | #include <boost/mpl/long.hpp> |
18 | #include <boost/mpl/void.hpp> |
19 | #include <boost/mpl/next_prior.hpp> |
20 | #include <boost/mpl/aux_/type_wrapper.hpp> |
21 | #include <boost/mpl/aux_/config/typeof.hpp> |
22 | #include <boost/mpl/aux_/config/ctps.hpp> |
23 | |
24 | namespace boost { namespace mpl { |
25 | |
26 | #if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES) |
27 | |
28 | template< |
29 | typename T |
30 | , typename Base |
31 | , int at_front = 0 |
32 | > |
33 | struct v_item |
34 | : Base |
35 | { |
36 | typedef typename Base::upper_bound_ index_; |
37 | typedef typename next<index_>::type upper_bound_; |
38 | typedef typename next<typename Base::size>::type size; |
39 | typedef Base base; |
40 | typedef v_item type; |
41 | |
42 | // agurt 10/sep/04: MWCW <= 9.3 workaround here and below; the compiler |
43 | // breaks if using declaration comes _before_ the new overload |
44 | static aux::type_wrapper<T> item_(index_); |
45 | using Base::item_; |
46 | }; |
47 | |
48 | template< |
49 | typename T |
50 | , typename Base |
51 | > |
52 | struct v_item<T,Base,1> |
53 | : Base |
54 | { |
55 | typedef typename prior<typename Base::lower_bound_>::type index_; |
56 | typedef index_ lower_bound_; |
57 | typedef typename next<typename Base::size>::type size; |
58 | typedef Base base; |
59 | typedef v_item type; |
60 | |
61 | static aux::type_wrapper<T> item_(index_); |
62 | using Base::item_; |
63 | }; |
64 | |
65 | // "erasure" item |
66 | template< |
67 | typename Base |
68 | , int at_front |
69 | > |
70 | struct v_mask |
71 | : Base |
72 | { |
73 | typedef typename prior<typename Base::upper_bound_>::type index_; |
74 | typedef index_ upper_bound_; |
75 | typedef typename prior<typename Base::size>::type size; |
76 | typedef Base base; |
77 | typedef v_mask type; |
78 | |
79 | static aux::type_wrapper<void_> item_(index_); |
80 | using Base::item_; |
81 | }; |
82 | |
83 | template< |
84 | typename Base |
85 | > |
86 | struct v_mask<Base,1> |
87 | : Base |
88 | { |
89 | typedef typename Base::lower_bound_ index_; |
90 | typedef typename next<index_>::type lower_bound_; |
91 | typedef typename prior<typename Base::size>::type size; |
92 | typedef Base base; |
93 | typedef v_mask type; |
94 | |
95 | static aux::type_wrapper<void_> item_(index_); |
96 | using Base::item_; |
97 | }; |
98 | |
99 | #endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES |
100 | |
101 | }} |
102 | |
103 | #endif // BOOST_MPL_VECTOR_AUX_ITEM_HPP_INCLUDED |
104 | |