williamr@4: williamr@4: #ifndef BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED williamr@4: #define BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED williamr@4: williamr@4: // Copyright Aleksey Gurtovoy 2000-2004 williamr@4: // williamr@4: // Distributed under the Boost Software License, Version 1.0. williamr@4: // (See accompanying file LICENSE_1_0.txt or copy at williamr@4: // http://www.boost.org/LICENSE_1_0.txt) williamr@4: // williamr@4: // See http://www.boost.org/libs/mpl for documentation. williamr@4: williamr@4: // $Source: /cvsroot/boost/boost/boost/mpl/vector/aux_/at.hpp,v $ williamr@4: // $Date: 2004/12/20 19:35:33 $ williamr@4: // $Revision: 1.6 $ williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: williamr@4: namespace boost { namespace mpl { williamr@4: williamr@4: #if defined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES) williamr@4: williamr@4: template< typename Vector, long n_ > williamr@4: struct v_at_impl williamr@4: { williamr@4: typedef long_< (Vector::lower_bound_::value + n_) > index_; williamr@4: typedef __typeof__( Vector::item_(index_()) ) type; williamr@4: }; williamr@4: williamr@4: williamr@4: template< typename Vector, long n_ > williamr@4: struct v_at williamr@4: : aux::wrapped_type< typename v_at_impl::type > williamr@4: { williamr@4: }; williamr@4: williamr@4: template<> williamr@4: struct at_impl< aux::vector_tag > williamr@4: { williamr@4: template< typename Vector, typename N > struct apply williamr@4: : v_at< williamr@4: Vector williamr@4: , BOOST_MPL_AUX_VALUE_WKND(N)::value williamr@4: > williamr@4: { williamr@4: }; williamr@4: }; williamr@4: williamr@4: #else williamr@4: williamr@4: # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ williamr@4: && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC) williamr@4: williamr@4: template< typename Vector, BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at; williamr@4: williamr@4: template< BOOST_MPL_AUX_NTTP_DECL(long, n_) > williamr@4: struct at_impl< aux::vector_tag > williamr@4: { williamr@4: template< typename Vector, typename N > struct apply williamr@4: #if !defined(__BORLANDC__) williamr@4: : v_at< williamr@4: Vector williamr@4: , BOOST_MPL_AUX_VALUE_WKND(N)::value williamr@4: > williamr@4: { williamr@4: #else williamr@4: { williamr@4: typedef typename v_at< williamr@4: Vector williamr@4: , BOOST_MPL_AUX_VALUE_WKND(N)::value williamr@4: >::type type; williamr@4: #endif williamr@4: }; williamr@4: }; williamr@4: williamr@4: # else williamr@4: williamr@4: namespace aux { williamr@4: williamr@4: template< BOOST_MPL_AUX_NTTP_DECL(long, n_) > struct v_at_impl williamr@4: { williamr@4: template< typename V > struct result_; williamr@4: }; williamr@4: williamr@4: // to work around ETI, etc. williamr@4: template<> struct v_at_impl<-1> williamr@4: { williamr@4: template< typename V > struct result_ williamr@4: { williamr@4: typedef void_ type; williamr@4: }; williamr@4: }; williamr@4: williamr@4: } // namespace aux williamr@4: williamr@4: template< typename T, BOOST_MPL_AUX_NTTP_DECL(long, n_) > williamr@4: struct v_at williamr@4: : aux::v_at_impl::template result_ williamr@4: { williamr@4: }; williamr@4: williamr@4: # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@4: williamr@4: #endif // BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES williamr@4: williamr@4: }} williamr@4: williamr@4: #endif // BOOST_MPL_VECTOR_AUX_AT_HPP_INCLUDED