epoc32/include/stdapis/boost/mpl/aux_/begin_end_impl.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     1 
     2 #ifndef BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED
     3 #define BOOST_MPL_AUX_BEGIN_END_IMPL_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 // $Source: /cvsroot/boost/boost/boost/mpl/aux_/begin_end_impl.hpp,v $
    14 // $Date: 2006/07/22 15:08:37 $
    15 // $Revision: 1.8.14.1 $
    16 
    17 #include <boost/mpl/begin_end_fwd.hpp>
    18 #include <boost/mpl/sequence_tag_fwd.hpp>
    19 #include <boost/mpl/void.hpp>
    20 #include <boost/mpl/eval_if.hpp>
    21 #include <boost/mpl/aux_/has_begin.hpp>
    22 #include <boost/mpl/aux_/na.hpp>
    23 #include <boost/mpl/aux_/traits_lambda_spec.hpp>
    24 #include <boost/mpl/aux_/config/eti.hpp>
    25 
    26 namespace boost { namespace mpl {
    27 
    28 namespace aux { 
    29 
    30 template< typename Sequence > 
    31 struct begin_type 
    32 { 
    33     typedef typename Sequence::begin type; 
    34 };
    35 template< typename Sequence > 
    36 struct end_type
    37 { 
    38     typedef typename Sequence::end type; 
    39 };
    40 
    41 }
    42 
    43 // default implementation; conrete sequences might override it by 
    44 // specializing either the 'begin_impl/end_impl' or the primary 
    45 // 'begin/end' templates
    46 
    47 template< typename Tag >
    48 struct begin_impl
    49 {
    50     template< typename Sequence > struct apply
    51     {
    52         typedef typename eval_if<aux::has_begin<Sequence, true_>,
    53                                  aux::begin_type<Sequence>, void_>::type type;
    54     };
    55 };
    56 
    57 template< typename Tag >
    58 struct end_impl
    59 {
    60     template< typename Sequence > struct apply
    61     {
    62         typedef typename eval_if<aux::has_begin<Sequence, true_>,
    63                                  aux::end_type<Sequence>, void_>::type type;
    64     };
    65 };
    66 
    67 // specialize 'begin_trait/end_trait' for two pre-defined tags
    68 
    69 #   define AUX778076_IMPL_SPEC(name, tag, result) \
    70 template<> \
    71 struct name##_impl<tag> \
    72 { \
    73     template< typename Sequence > struct apply \
    74     { \
    75         typedef result type; \
    76     }; \
    77 }; \
    78 /**/
    79 
    80 // a sequence with nested 'begin/end' typedefs; just query them
    81 AUX778076_IMPL_SPEC(begin, nested_begin_end_tag, typename Sequence::begin)
    82 AUX778076_IMPL_SPEC(end, nested_begin_end_tag, typename Sequence::end)
    83 
    84 // if a type 'T' does not contain 'begin/end' or 'tag' members 
    85 // and doesn't specialize either 'begin/end' or 'begin_impl/end_impl' 
    86 // templates, then we end up here
    87 AUX778076_IMPL_SPEC(begin, non_sequence_tag, void_)
    88 AUX778076_IMPL_SPEC(end, non_sequence_tag, void_)
    89 AUX778076_IMPL_SPEC(begin, na, void_)
    90 AUX778076_IMPL_SPEC(end, na, void_)
    91 
    92 #   undef AUX778076_IMPL_SPEC
    93 
    94 
    95 BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1,begin_impl)
    96 BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1,end_impl)
    97 
    98 }}
    99 
   100 #endif // BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED