epoc32/include/stdapis/boost/variant/recursive_variant.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
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.
williamr@2
     1
//-----------------------------------------------------------------------------
williamr@2
     2
// boost variant/recursive_variant.hpp header file
williamr@2
     3
// See http://www.boost.org for updates, documentation, and revision history.
williamr@2
     4
//-----------------------------------------------------------------------------
williamr@2
     5
//
williamr@2
     6
// Copyright (c) 2003
williamr@2
     7
// Eric Friedman
williamr@2
     8
//
williamr@2
     9
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
    10
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
    11
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
    12
williamr@2
    13
#ifndef BOOST_VARIANT_RECURSIVE_VARIANT_HPP
williamr@2
    14
#define BOOST_VARIANT_RECURSIVE_VARIANT_HPP
williamr@2
    15
williamr@2
    16
#include "boost/variant/variant_fwd.hpp"
williamr@2
    17
#include "boost/variant/detail/enable_recursive.hpp"
williamr@2
    18
#include "boost/variant/detail/substitute_fwd.hpp"
williamr@2
    19
#include "boost/variant/detail/make_variant_list.hpp"
williamr@2
    20
#include "boost/variant/detail/over_sequence.hpp"
williamr@2
    21
williamr@2
    22
#include "boost/mpl/aux_/lambda_arity_param.hpp"
williamr@2
    23
williamr@2
    24
#if !defined(BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT)
williamr@2
    25
#   include "boost/mpl/eval_if.hpp"
williamr@2
    26
#   include "boost/mpl/identity.hpp"
williamr@2
    27
#   include "boost/mpl/protect.hpp"
williamr@2
    28
#   include "boost/mpl/transform.hpp"
williamr@2
    29
#else
williamr@2
    30
#   include "boost/preprocessor/cat.hpp"
williamr@2
    31
#   include "boost/preprocessor/repeat.hpp"
williamr@2
    32
#endif
williamr@2
    33
williamr@2
    34
#include "boost/mpl/bool.hpp"
williamr@2
    35
#include "boost/mpl/is_sequence.hpp"
williamr@2
    36
#include "boost/variant/variant.hpp"
williamr@2
    37
williamr@2
    38
namespace boost {
williamr@2
    39
williamr@2
    40
namespace detail { namespace variant {
williamr@2
    41
williamr@2
    42
///////////////////////////////////////////////////////////////////////////////
williamr@2
    43
// (detail) metafunction specialization substitute
williamr@2
    44
//
williamr@2
    45
// Handles embedded variant types when substituting for recursive_variant_.
williamr@2
    46
//
williamr@2
    47
williamr@2
    48
#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
williamr@2
    49
williamr@2
    50
template <
williamr@2
    51
      BOOST_VARIANT_ENUM_PARAMS(typename T)
williamr@2
    52
    , typename RecursiveVariant
williamr@2
    53
      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
williamr@2
    54
    >
williamr@2
    55
struct substitute<
williamr@2
    56
      ::boost::variant<
williamr@2
    57
          recursive_flag< T0 >
williamr@2
    58
        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
williamr@2
    59
        >
williamr@2
    60
    , RecursiveVariant
williamr@2
    61
    , ::boost::recursive_variant_
williamr@2
    62
      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
williamr@2
    63
    >
williamr@2
    64
{
williamr@2
    65
    typedef ::boost::variant<
williamr@2
    66
          recursive_flag< T0 >
williamr@2
    67
        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
williamr@2
    68
        > type;
williamr@2
    69
};
williamr@2
    70
williamr@2
    71
template <
williamr@2
    72
      BOOST_VARIANT_ENUM_PARAMS(typename T)
williamr@2
    73
    , typename RecursiveVariant
williamr@2
    74
      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
williamr@2
    75
    >
williamr@2
    76
struct substitute<
williamr@2
    77
      ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >
williamr@2
    78
    , RecursiveVariant
williamr@2
    79
    , ::boost::recursive_variant_
williamr@2
    80
      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
williamr@2
    81
    >
williamr@2
    82
{
williamr@2
    83
williamr@2
    84
#if !defined(BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT)
williamr@2
    85
williamr@2
    86
private: // helpers, for metafunction result (below)
williamr@2
    87
williamr@2
    88
    typedef typename mpl::eval_if<
williamr@2
    89
          ::boost::detail::variant::is_over_sequence<T0>
williamr@2
    90
        , mpl::identity< T0 >
williamr@2
    91
        , make_variant_list< BOOST_VARIANT_ENUM_PARAMS(T) >
williamr@2
    92
        >::type initial_types;
williamr@2
    93
williamr@2
    94
    typedef typename mpl::transform<
williamr@2
    95
          initial_types
williamr@2
    96
        , mpl::protect< quoted_enable_recursive<RecursiveVariant,mpl::true_> >
williamr@2
    97
        >::type types;
williamr@2
    98
williamr@2
    99
public: // metafunction result
williamr@2
   100
williamr@2
   101
    typedef ::boost::variant< types > type;
williamr@2
   102
williamr@2
   103
#else // defined(BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT)
williamr@2
   104
williamr@2
   105
private: // helpers, for metafunction result (below)
williamr@2
   106
williamr@2
   107
    #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS(z,N,_)  \
williamr@2
   108
        typedef typename enable_recursive<   \
williamr@2
   109
              BOOST_PP_CAT(T,N)              \
williamr@2
   110
            , RecursiveVariant               \
williamr@2
   111
            , mpl::true_                     \
williamr@2
   112
            >::type BOOST_PP_CAT(wknd_T,N);  \
williamr@2
   113
        /**/
williamr@2
   114
williamr@2
   115
    BOOST_PP_REPEAT(
williamr@2
   116
          BOOST_VARIANT_LIMIT_TYPES
williamr@2
   117
        , BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
williamr@2
   118
        , _
williamr@2
   119
        )
williamr@2
   120
williamr@2
   121
    #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
williamr@2
   122
williamr@2
   123
public: // metafunction result
williamr@2
   124
williamr@2
   125
    typedef ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(wknd_T) > type;
williamr@2
   126
williamr@2
   127
#endif // BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT workaround
williamr@2
   128
williamr@2
   129
};
williamr@2
   130
williamr@2
   131
#else // defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
williamr@2
   132
williamr@2
   133
//
williamr@2
   134
// no specializations: embedded variants unsupported on these compilers!
williamr@2
   135
//
williamr@2
   136
williamr@2
   137
#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
williamr@2
   138
williamr@2
   139
}} // namespace detail::variant
williamr@2
   140
williamr@2
   141
///////////////////////////////////////////////////////////////////////////////
williamr@2
   142
// metafunction make_recursive_variant
williamr@2
   143
//
williamr@2
   144
// See docs and boost/variant/variant_fwd.hpp for more information.
williamr@2
   145
//
williamr@2
   146
template < BOOST_VARIANT_ENUM_PARAMS(typename T) >
williamr@2
   147
struct make_recursive_variant
williamr@2
   148
{
williamr@2
   149
public: // metafunction result
williamr@2
   150
williamr@2
   151
    typedef boost::variant<
williamr@2
   152
          detail::variant::recursive_flag< T0 >
williamr@2
   153
        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
williamr@2
   154
        > type;
williamr@2
   155
williamr@2
   156
};
williamr@2
   157
williamr@2
   158
///////////////////////////////////////////////////////////////////////////////
williamr@2
   159
// metafunction make_recursive_variant_over
williamr@2
   160
//
williamr@2
   161
// See docs and boost/variant/variant_fwd.hpp for more information.
williamr@2
   162
//
williamr@2
   163
template <typename Types>
williamr@2
   164
struct make_recursive_variant_over
williamr@2
   165
{
williamr@2
   166
private: // precondition assertions
williamr@2
   167
williamr@2
   168
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
williamr@2
   169
    BOOST_STATIC_ASSERT(( ::boost::mpl::is_sequence<Types>::value ));
williamr@2
   170
#endif
williamr@2
   171
williamr@2
   172
public: // metafunction result
williamr@2
   173
williamr@2
   174
    typedef typename make_recursive_variant<
williamr@2
   175
          detail::variant::over_sequence< Types >
williamr@2
   176
        >::type type;
williamr@2
   177
williamr@2
   178
};
williamr@2
   179
williamr@2
   180
} // namespace boost
williamr@2
   181
williamr@2
   182
#endif // BOOST_VARIANT_RECURSIVE_VARIANT_HPP