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