/extlibs/Boost/include/boost/mpl/vector/aux_/at.hpp
C++ Header | 116 lines | 81 code | 24 blank | 11 comment | 2 complexity | 9bf06ba435502b514c945c28cbd5a722 MD5 | raw file
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-11 02:19:02 -0400 (Sat, 11 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 27namespace boost { namespace mpl { 28 29#if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES) 30 31template< typename Vector, long n_ > 32struct v_at_impl 33{ 34 typedef long_< (Vector::lower_bound_::value + n_) > index_; 35 typedef __typeof__( Vector::item_(index_()) ) type; 36}; 37 38 39template< typename Vector, long n_ > 40struct v_at 41 : aux::wrapped_type< typename v_at_impl<Vector,n_>::type > 42{ 43}; 44 45template<> 46struct 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 62template< typename Vector, BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at; 63 64template< BOOST_MPL_AUX_NTTP_DECL(long, n_) > 65struct 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 86namespace aux { 87 88template< 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. 94template<> struct v_at_impl<-1> 95{ 96 template< typename V > struct result_ 97 { 98 typedef void_ type; 99 }; 100}; 101 102} // namespace aux 103 104template< typename T, BOOST_MPL_AUX_NTTP_DECL(long, n_) > 105struct 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