/*============================================================================= Copyright (c) 2001-2011 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #if !defined(FUSION_AT_IMPL_07172005_0726) #define FUSION_AT_IMPL_07172005_0726 #include #include #include #include #include namespace boost { namespace fusion { namespace detail { template struct cons_deref { typedef typename Cons::car_type type; }; template struct cons_advance { typedef typename cons_advance::type::cdr_type type; }; template struct cons_advance { typedef Cons type; }; template struct cons_advance { typedef typename Cons::cdr_type type; }; template struct cons_advance { #if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above typedef typename Cons::cdr_type::cdr_type type; #else typedef typename Cons::cdr_type _a; typedef typename _a::cdr_type type; #endif }; template struct cons_advance { #if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above typedef typename Cons::cdr_type::cdr_type::cdr_type type; #else typedef typename Cons::cdr_type _a; typedef typename _a::cdr_type _b; typedef typename _b::cdr_type type; #endif }; template struct cons_advance { #if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above typedef typename Cons::cdr_type::cdr_type::cdr_type::cdr_type type; #else typedef typename Cons::cdr_type _a; typedef typename _a::cdr_type _b; typedef typename _b::cdr_type _c; typedef typename _c::cdr_type type; #endif }; } struct cons_tag; namespace extension { template struct at_impl; template <> struct at_impl { template struct apply { typedef typename detail::cons_deref< typename detail::cons_advance::type>::type element; typedef typename mpl::if_< is_const , typename detail::cref_result::type , typename detail::ref_result::type >::type type; template static type call(Cons& s, mpl::int_) { return call(s.cdr, mpl::int_()); } template static type call(Cons& s, mpl::int_<0>) { return s.car; } static type call(Sequence& s) { return call(s, mpl::int_()); } }; }; } }} #endif