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