epoc32/include/stdapis/boost/variant/detail/over_sequence.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
//-----------------------------------------------------------------------------
williamr@2
     2
// boost variant/detail/over_sequence.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
// Portions Copyright (C) 2002 David Abrahams
williamr@2
    10
//
williamr@2
    11
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
    12
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
    13
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
    14
williamr@2
    15
#ifndef BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP
williamr@2
    16
#define BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP
williamr@2
    17
williamr@2
    18
#include "boost/mpl/aux_/config/ctps.hpp"
williamr@2
    19
#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
williamr@2
    20
#   include "boost/mpl/eval_if.hpp"
williamr@2
    21
#   include "boost/mpl/bool.hpp"
williamr@2
    22
#   include "boost/mpl/identity.hpp"
williamr@2
    23
#   include "boost/type.hpp"
williamr@2
    24
#endif
williamr@2
    25
williamr@2
    26
williamr@2
    27
namespace boost {
williamr@2
    28
namespace detail { namespace variant {
williamr@2
    29
williamr@2
    30
///////////////////////////////////////////////////////////////////////////////
williamr@2
    31
// (detail) class over_sequence
williamr@2
    32
//
williamr@2
    33
// Wrapper used to indicate bounded types for variant are from type sequence.
williamr@2
    34
//
williamr@2
    35
template <typename Types>
williamr@2
    36
struct over_sequence
williamr@2
    37
{
williamr@2
    38
    typedef Types type;
williamr@2
    39
};
williamr@2
    40
williamr@2
    41
///////////////////////////////////////////////////////////////////////////////
williamr@2
    42
// (detail) metafunction is_over_sequence (modeled on code by David Abrahams)
williamr@2
    43
//
williamr@2
    44
// Indicates whether the specified type is of form over_sequence<...> or not.
williamr@2
    45
//
williamr@2
    46
williamr@2
    47
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
williamr@2
    48
williamr@2
    49
template <typename T>
williamr@2
    50
struct is_over_sequence
williamr@2
    51
    : mpl::false_
williamr@2
    52
{
williamr@2
    53
};
williamr@2
    54
williamr@2
    55
template <typename Types>
williamr@2
    56
struct is_over_sequence< over_sequence<Types> >
williamr@2
    57
    : mpl::true_
williamr@2
    58
{
williamr@2
    59
};
williamr@2
    60
williamr@2
    61
#else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
williamr@2
    62
williamr@2
    63
typedef char (&yes_over_sequence_t)[1];
williamr@2
    64
typedef char (&no_over_sequence_t)[2];
williamr@2
    65
williamr@2
    66
no_over_sequence_t is_over_sequence_test(...);
williamr@2
    67
williamr@2
    68
template<typename T>
williamr@2
    69
yes_over_sequence_t is_over_sequence_test(
williamr@2
    70
      type< ::boost::detail::variant::over_sequence<T> >
williamr@2
    71
    );
williamr@2
    72
williamr@2
    73
template<typename T>
williamr@2
    74
struct is_over_sequence_impl
williamr@2
    75
{
williamr@2
    76
    BOOST_STATIC_CONSTANT(bool, value = (
williamr@2
    77
          sizeof(is_over_sequence_test(type<T>()))
williamr@2
    78
          == sizeof(yes_over_sequence_t)
williamr@2
    79
        ));
williamr@2
    80
};
williamr@2
    81
williamr@2
    82
template <typename T>
williamr@2
    83
struct is_over_sequence
williamr@2
    84
    : mpl::bool_<
williamr@2
    85
          ::boost::detail::variant::is_over_sequence_impl<T>::value
williamr@2
    86
        >
williamr@2
    87
{
williamr@2
    88
};
williamr@2
    89
williamr@2
    90
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround
williamr@2
    91
williamr@2
    92
}} // namespace detail::variant
williamr@2
    93
} // namespace boost
williamr@2
    94
williamr@2
    95
#endif // BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP