epoc32/include/stdapis/boost/variant/variant_fwd.hpp
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
williamr@2
     1
//-----------------------------------------------------------------------------
williamr@2
     2
// boost variant/variant_fwd.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, Itay Maman
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_VARIANT_FWD_HPP
williamr@2
    14
#define BOOST_VARIANT_VARIANT_FWD_HPP
williamr@2
    15
williamr@2
    16
#include "boost/variant/detail/config.hpp"
williamr@2
    17
williamr@2
    18
#include "boost/blank_fwd.hpp"
williamr@2
    19
#include "boost/mpl/arg.hpp"
williamr@2
    20
#include "boost/mpl/limits/arity.hpp"
williamr@2
    21
#include "boost/mpl/aux_/na.hpp"
williamr@2
    22
#include "boost/preprocessor/cat.hpp"
williamr@2
    23
#include "boost/preprocessor/enum.hpp"
williamr@2
    24
#include "boost/preprocessor/enum_params.hpp"
williamr@2
    25
#include "boost/preprocessor/enum_shifted_params.hpp"
williamr@2
    26
#include "boost/preprocessor/repeat.hpp"
williamr@2
    27
williamr@2
    28
///////////////////////////////////////////////////////////////////////////////
williamr@2
    29
// macro BOOST_VARIANT_LIMIT_TYPES
williamr@2
    30
//
williamr@2
    31
// Implementation-defined preprocessor symbol describing the actual
williamr@2
    32
// length of variant's pseudo-variadic template parameter list.
williamr@2
    33
//
williamr@2
    34
#include "boost/mpl/limits/list.hpp"
williamr@2
    35
#define BOOST_VARIANT_LIMIT_TYPES \
williamr@2
    36
    BOOST_MPL_LIMIT_LIST_SIZE
williamr@2
    37
williamr@2
    38
///////////////////////////////////////////////////////////////////////////////
williamr@2
    39
// macro BOOST_VARIANT_NO_REFERENCE_SUPPORT
williamr@2
    40
//
williamr@2
    41
// Defined if variant does not support references as bounded types. 
williamr@2
    42
//
williamr@2
    43
#if defined(BOOST_VARIANT_AUX_BROKEN_CONSTRUCTOR_TEMPLATE_ORDERING) \
williamr@2
    44
 && !defined(BOOST_VARIANT_AUX_HAS_CONSTRUCTOR_TEMPLATE_ORDERING_SFINAE_WKND) \
williamr@2
    45
 && !defined(BOOST_VARIANT_NO_REFERENCE_SUPPORT)
williamr@2
    46
#   define BOOST_VARIANT_NO_REFERENCE_SUPPORT
williamr@2
    47
#endif
williamr@2
    48
williamr@2
    49
///////////////////////////////////////////////////////////////////////////////
williamr@2
    50
// macro BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT
williamr@2
    51
//
williamr@2
    52
// Defined if variant does not support make_variant_over (see below). 
williamr@2
    53
//
williamr@2
    54
#if defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
williamr@2
    55
#   define BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT
williamr@2
    56
#endif
williamr@2
    57
williamr@2
    58
///////////////////////////////////////////////////////////////////////////////
williamr@2
    59
// macro BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT
williamr@2
    60
//
williamr@2
    61
// Defined if make_recursive_variant cannot be supported as documented.
williamr@2
    62
//
williamr@2
    63
// Note: Currently, MPL lambda facility is used as workaround if defined, and
williamr@2
    64
// so only types declared w/ MPL lambda workarounds will work.
williamr@2
    65
//
williamr@2
    66
williamr@2
    67
#include "boost/variant/detail/substitute_fwd.hpp"
williamr@2
    68
williamr@2
    69
#if defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE) \
williamr@2
    70
 && !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT)
williamr@2
    71
#   define BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT
williamr@2
    72
#endif
williamr@2
    73
williamr@2
    74
///////////////////////////////////////////////////////////////////////////////
williamr@2
    75
// macro BOOST_VARIANT_RECURSIVE_VARIANT_MAX_ARITY
williamr@2
    76
//
williamr@2
    77
// Exposes maximum allowed arity of class templates with recursive_variant
williamr@2
    78
// arguments. That is,
williamr@2
    79
//   make_recursive_variant< ..., T<[1], recursive_variant_, ... [N]> >.
williamr@2
    80
//
williamr@2
    81
#include "boost/mpl/limits/arity.hpp"
williamr@2
    82
#define BOOST_VARIANT_RECURSIVE_VARIANT_MAX_ARITY \
williamr@2
    83
    BOOST_MPL_LIMIT_METAFUNCTION_ARITY
williamr@2
    84
williamr@2
    85
///////////////////////////////////////////////////////////////////////////////
williamr@2
    86
// macro BOOST_VARIANT_ENUM_PARAMS
williamr@2
    87
//
williamr@2
    88
// Convenience macro for enumeration of BOOST_VARIANT_LIMIT_TYPES params.
williamr@2
    89
//
williamr@2
    90
// Rationale: Cleaner, simpler code for clients of variant library.
williamr@2
    91
//
williamr@2
    92
#define BOOST_VARIANT_ENUM_PARAMS( param )  \
williamr@2
    93
    BOOST_PP_ENUM_PARAMS(BOOST_VARIANT_LIMIT_TYPES, param)
williamr@2
    94
williamr@2
    95
///////////////////////////////////////////////////////////////////////////////
williamr@2
    96
// macro BOOST_VARIANT_ENUM_SHIFTED_PARAMS
williamr@2
    97
//
williamr@2
    98
// Convenience macro for enumeration of BOOST_VARIANT_LIMIT_TYPES-1 params.
williamr@2
    99
//
williamr@2
   100
#define BOOST_VARIANT_ENUM_SHIFTED_PARAMS( param )  \
williamr@2
   101
    BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_VARIANT_LIMIT_TYPES, param)
williamr@2
   102
williamr@2
   103
williamr@2
   104
namespace boost {
williamr@2
   105
williamr@2
   106
namespace detail { namespace variant {
williamr@2
   107
williamr@2
   108
///////////////////////////////////////////////////////////////////////////////
williamr@2
   109
// (detail) class void_ and class template convert_void
williamr@2
   110
// 
williamr@2
   111
// Provides the mechanism by which void(NN) types are converted to
williamr@2
   112
// mpl::void_ (and thus can be passed to mpl::list).
williamr@2
   113
//
williamr@2
   114
// Rationale: This is particularly needed for the using-declarations
williamr@2
   115
// workaround (below), but also to avoid associating mpl namespace with
williamr@2
   116
// variant in argument dependent lookups (which used to happen because of
williamr@2
   117
// defaulting of template parameters to mpl::void_).
williamr@2
   118
//
williamr@2
   119
williamr@2
   120
struct void_;
williamr@2
   121
williamr@2
   122
template <typename T>
williamr@2
   123
struct convert_void
williamr@2
   124
{
williamr@2
   125
    typedef T type;
williamr@2
   126
};
williamr@2
   127
williamr@2
   128
template <>
williamr@2
   129
struct convert_void< void_ >
williamr@2
   130
{
williamr@2
   131
    typedef mpl::na type;
williamr@2
   132
};
williamr@2
   133
williamr@2
   134
///////////////////////////////////////////////////////////////////////////////
williamr@2
   135
// (workaround) BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE
williamr@2
   136
//
williamr@2
   137
// Needed to work around compilers that don't support using-declaration
williamr@2
   138
// overloads. (See the variant::initializer workarounds below.)
williamr@2
   139
//
williamr@2
   140
williamr@2
   141
#if defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
williamr@2
   142
williamr@2
   143
// (detail) tags voidNN -- NN defined on [0, BOOST_VARIANT_LIMIT_TYPES)
williamr@2
   144
//
williamr@2
   145
// Defines void types that are each unique and specializations of
williamr@2
   146
// convert_void that yields mpl::na for each voidNN type.
williamr@2
   147
//
williamr@2
   148
williamr@2
   149
#define BOOST_VARIANT_DETAIL_DEFINE_VOID_N(z,N,_)          \
williamr@2
   150
    struct BOOST_PP_CAT(void,N);                           \
williamr@2
   151
                                                           \
williamr@2
   152
    template <>                                            \
williamr@2
   153
    struct convert_void< BOOST_PP_CAT(void,N) >            \
williamr@2
   154
    {                                                      \
williamr@2
   155
        typedef mpl::na type;                              \
williamr@2
   156
    };                                                     \
williamr@2
   157
    /**/
williamr@2
   158
williamr@2
   159
BOOST_PP_REPEAT(
williamr@2
   160
      BOOST_VARIANT_LIMIT_TYPES
williamr@2
   161
    , BOOST_VARIANT_DETAIL_DEFINE_VOID_N
williamr@2
   162
    , _
williamr@2
   163
    )
williamr@2
   164
williamr@2
   165
#undef BOOST_VARIANT_DETAIL_DEFINE_VOID_N
williamr@2
   166
williamr@2
   167
#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround
williamr@2
   168
williamr@2
   169
}} // namespace detail::variant
williamr@2
   170
williamr@2
   171
///////////////////////////////////////////////////////////////////////////////
williamr@2
   172
// (detail) macro BOOST_VARIANT_AUX_DECLARE_PARAM
williamr@2
   173
//
williamr@2
   174
// Template parameter list for variant and recursive_variant declarations.
williamr@2
   175
//
williamr@2
   176
williamr@2
   177
#if !defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
williamr@2
   178
williamr@2
   179
#   define BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL(z, N, T) \
williamr@2
   180
    typename BOOST_PP_CAT(T,N) = detail::variant::void_ \
williamr@2
   181
    /**/
williamr@2
   182
williamr@2
   183
#else // defined(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE)
williamr@2
   184
williamr@2
   185
#   define BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL(z, N, T) \
williamr@2
   186
    typename BOOST_PP_CAT(T,N) = BOOST_PP_CAT(detail::variant::void,N) \
williamr@2
   187
    /**/
williamr@2
   188
williamr@2
   189
#endif // BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE workaround
williamr@2
   190
williamr@2
   191
#define BOOST_VARIANT_AUX_DECLARE_PARAMS \
williamr@2
   192
    BOOST_PP_ENUM( \
williamr@2
   193
          BOOST_VARIANT_LIMIT_TYPES \
williamr@2
   194
        , BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL \
williamr@2
   195
        , T \
williamr@2
   196
        ) \
williamr@2
   197
    /**/
williamr@2
   198
williamr@2
   199
///////////////////////////////////////////////////////////////////////////////
williamr@2
   200
// class template variant (concept inspired by Andrei Alexandrescu)
williamr@2
   201
//
williamr@2
   202
// Efficient, type-safe bounded discriminated union.
williamr@2
   203
//
williamr@2
   204
// Preconditions:
williamr@2
   205
//  - Each type must be unique.
williamr@2
   206
//  - No type may be const-qualified.
williamr@2
   207
//
williamr@2
   208
// Proper declaration form:
williamr@2
   209
//   variant<types>    (where types is a type-sequence)
williamr@2
   210
// or
williamr@2
   211
//   variant<T0,T1,...,Tn>  (where T0 is NOT a type-sequence)
williamr@2
   212
//
williamr@2
   213
template < BOOST_VARIANT_AUX_DECLARE_PARAMS > class variant;
williamr@2
   214
williamr@2
   215
///////////////////////////////////////////////////////////////////////////////
williamr@2
   216
// metafunction make_recursive_variant
williamr@2
   217
//
williamr@2
   218
// Exposes a boost::variant with recursive_variant_ tags (below) substituted
williamr@2
   219
// with the variant itself (wrapped as needed with boost::recursive_wrapper).
williamr@2
   220
//
williamr@2
   221
template < BOOST_VARIANT_AUX_DECLARE_PARAMS > struct make_recursive_variant;
williamr@2
   222
williamr@2
   223
#undef BOOST_VARIANT_AUX_DECLARE_PARAMS_IMPL
williamr@2
   224
#undef BOOST_VARIANT_AUX_DECLARE_PARAMS
williamr@2
   225
williamr@2
   226
///////////////////////////////////////////////////////////////////////////////
williamr@2
   227
// type recursive_variant_
williamr@2
   228
//
williamr@2
   229
// Tag type indicates where recursive variant substitution should occur.
williamr@2
   230
//
williamr@2
   231
#if !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT)
williamr@2
   232
    struct recursive_variant_;
williamr@2
   233
#else
williamr@2
   234
    typedef mpl::arg<1> recursive_variant_;
williamr@2
   235
#endif
williamr@2
   236
williamr@2
   237
///////////////////////////////////////////////////////////////////////////////
williamr@2
   238
// metafunction make_variant_over
williamr@2
   239
//
williamr@2
   240
// Result is a variant w/ types of the specified type sequence.
williamr@2
   241
//
williamr@2
   242
template <typename Types> struct make_variant_over;
williamr@2
   243
williamr@2
   244
///////////////////////////////////////////////////////////////////////////////
williamr@2
   245
// metafunction make_recursive_variant_over
williamr@2
   246
//
williamr@2
   247
// Result is a recursive variant w/ types of the specified type sequence.
williamr@2
   248
//
williamr@2
   249
template <typename Types> struct make_recursive_variant_over;
williamr@2
   250
williamr@2
   251
} // namespace boost
williamr@2
   252
williamr@2
   253
#endif // BOOST_VARIANT_VARIANT_FWD_HPP