1 2 #ifndef BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED 3 #define BOOST_MPL_VECTOR_AUX_AT_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: at.hpp 49267 2008-10-11 06:19:02Z agurtovoy $ 14 // $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $ 15 // $Revision: 49267 $ 16 17 #include <boost/mpl/at_fwd.hpp> 18 #include <boost/mpl/vector/aux_/tag.hpp> 19 #include <boost/mpl/long.hpp> 20 #include <boost/mpl/void.hpp> 21 #include <boost/mpl/aux_/nttp_decl.hpp> 22 #include <boost/mpl/aux_/type_wrapper.hpp> 23 #include <boost/mpl/aux_/value_wknd.hpp> 24 #include <boost/mpl/aux_/config/typeof.hpp> 25 #include <boost/mpl/aux_/config/ctps.hpp> 26 27 namespace boost { namespace mpl { 28 29 #if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES) 30 31 template< typename Vector, long n_ > 32 struct v_at_impl 33 { 34 typedef long_< (Vector::lower_bound_::value + n_) > index_; 35 typedef __typeof__( Vector::item_(index_()) ) type; 36 }; 37 38 39 template< typename Vector, long n_ > 40 struct v_at 41 : aux::wrapped_type< typename v_at_impl<Vector,n_>::type > 42 { 43 }; 44 45 template<> 46 struct at_impl< aux::vector_tag > 47 { 48 template< typename Vector, typename N > struct apply 49 : v_at< 50 Vector 51 , BOOST_MPL_AUX_VALUE_WKND(N)::value 52 > 53 { 54 }; 55 }; 56 57 #else 58 59 # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ 60 && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC) 61 62 template< typename Vector, BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at; 63 64 template< BOOST_MPL_AUX_NTTP_DECL(long, n_) > 65 struct at_impl< aux::vector_tag<n_> > 66 { 67 template< typename Vector, typename N > struct apply 68 #if !defined(__BORLANDC__) 69 : v_at< 70 Vector 71 , BOOST_MPL_AUX_VALUE_WKND(N)::value 72 > 73 { 74 #else 75 { 76 typedef typename v_at< 77 Vector 78 , BOOST_MPL_AUX_VALUE_WKND(N)::value 79 >::type type; 80 #endif 81 }; 82 }; 83 84 # else 85 86 namespace aux { 87 88 template< BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at_impl 89 { 90 template< typename V > struct result_; 91 }; 92 93 // to work around ETI, etc. 94 template<> struct v_at_impl<-1> 95 { 96 template< typename V > struct result_ 97 { 98 typedef void_ type; 99 }; 100 }; 101 102 } // namespace aux 103 104 template< typename T, BOOST_MPL_AUX_NTTP_DECL(long, n_) > 105 struct v_at 106 : aux::v_at_impl<n_>::template result_<T> 107 { 108 }; 109 110 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 111 112 #endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES 113 114 }} 115 116 #endif // BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED 117