epoc32/include/stdapis/boost/mpl/has_xxx.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
#ifndef BOOST_MPL_HAS_XXX_HPP_INCLUDED
williamr@2
     3
#define BOOST_MPL_HAS_XXX_HPP_INCLUDED
williamr@2
     4
williamr@2
     5
// Copyright Aleksey Gurtovoy 2002-2006
williamr@2
     6
// Copyright David Abrahams 2002-2003
williamr@2
     7
//
williamr@2
     8
// Distributed under the Boost Software License, Version 1.0. 
williamr@2
     9
// (See accompanying file LICENSE_1_0.txt or copy at 
williamr@2
    10
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
    11
//
williamr@2
    12
// See http://www.boost.org/libs/mpl for documentation.
williamr@2
    13
williamr@2
    14
// $Source: /cvsroot/boost/boost/boost/mpl/has_xxx.hpp,v $
williamr@2
    15
// $Date: 2006/11/09 01:05:31 $
williamr@2
    16
// $Revision: 1.4.6.1 $
williamr@2
    17
williamr@2
    18
#include <boost/mpl/bool.hpp>
williamr@2
    19
#include <boost/mpl/aux_/type_wrapper.hpp>
williamr@2
    20
#include <boost/mpl/aux_/yes_no.hpp>
williamr@2
    21
#include <boost/mpl/aux_/config/has_xxx.hpp>
williamr@2
    22
#include <boost/mpl/aux_/config/msvc_typename.hpp>
williamr@2
    23
#include <boost/mpl/aux_/config/msvc.hpp>
williamr@2
    24
#include <boost/mpl/aux_/config/static_constant.hpp>
williamr@2
    25
#include <boost/mpl/aux_/config/workaround.hpp>
williamr@2
    26
williamr@2
    27
#include <boost/preprocessor/cat.hpp>
williamr@2
    28
williamr@2
    29
#if !defined(BOOST_MPL_CFG_NO_HAS_XXX)
williamr@2
    30
williamr@2
    31
#   if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
williamr@2
    32
williamr@2
    33
// agurt, 11/sep/02: MSVC-specific version (< 7.1), based on a USENET 
williamr@2
    34
// newsgroup's posting by John Madsen (comp.lang.c++.moderated, 
williamr@2
    35
// 1999-11-12 19:17:06 GMT); the code is _not_ standard-conforming, but 
williamr@2
    36
// it works way more reliably than the SFINAE-based implementation
williamr@2
    37
williamr@2
    38
// Modified dwa 8/Oct/02 to handle reference types.
williamr@2
    39
williamr@2
    40
#   include <boost/mpl/if.hpp>
williamr@2
    41
#   include <boost/mpl/bool.hpp>
williamr@2
    42
williamr@2
    43
namespace boost { namespace mpl { namespace aux {
williamr@2
    44
williamr@2
    45
struct has_xxx_tag;
williamr@2
    46
williamr@2
    47
#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
williamr@2
    48
template< typename U > struct msvc_incomplete_array
williamr@2
    49
{
williamr@2
    50
    typedef char (&type)[sizeof(U) + 1];
williamr@2
    51
};
williamr@2
    52
#endif
williamr@2
    53
williamr@2
    54
template< typename T >
williamr@2
    55
struct msvc_is_incomplete
williamr@2
    56
{
williamr@2
    57
    // MSVC is capable of some kinds of SFINAE.  If U is an incomplete
williamr@2
    58
    // type, it won't pick the second overload
williamr@2
    59
    static char tester(...);
williamr@2
    60
williamr@2
    61
#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
williamr@2
    62
    template< typename U >
williamr@2
    63
    static typename msvc_incomplete_array<U>::type tester(type_wrapper<U>);
williamr@2
    64
#else
williamr@2
    65
    template< typename U >
williamr@2
    66
    static char (& tester(type_wrapper<U>) )[sizeof(U)+1];
williamr@2
    67
#endif 
williamr@2
    68
    
williamr@2
    69
    BOOST_STATIC_CONSTANT(bool, value = 
williamr@2
    70
          sizeof(tester(type_wrapper<T>())) == 1
williamr@2
    71
        );
williamr@2
    72
};
williamr@2
    73
williamr@2
    74
template<>
williamr@2
    75
struct msvc_is_incomplete<int>
williamr@2
    76
{
williamr@2
    77
    BOOST_STATIC_CONSTANT(bool, value = false);
williamr@2
    78
};
williamr@2
    79
williamr@2
    80
}}}
williamr@2
    81
williamr@2
    82
#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, default_) \
williamr@2
    83
template< typename T, typename name = ::boost::mpl::aux::has_xxx_tag > \
williamr@2
    84
struct BOOST_PP_CAT(trait,_impl) : T \
williamr@2
    85
{ \
williamr@2
    86
    static boost::mpl::aux::no_tag \
williamr@2
    87
    test(void(*)(::boost::mpl::aux::has_xxx_tag)); \
williamr@2
    88
    \
williamr@2
    89
    static boost::mpl::aux::yes_tag test(...); \
williamr@2
    90
    \
williamr@2
    91
    BOOST_STATIC_CONSTANT(bool, value = \
williamr@2
    92
          sizeof(test(static_cast<void(*)(name)>(0))) \
williamr@2
    93
            != sizeof(boost::mpl::aux::no_tag) \
williamr@2
    94
        ); \
williamr@2
    95
    typedef boost::mpl::bool_<value> type; \
williamr@2
    96
}; \
williamr@2
    97
\
williamr@2
    98
template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
williamr@2
    99
struct trait \
williamr@2
   100
    : boost::mpl::if_c< \
williamr@2
   101
          boost::mpl::aux::msvc_is_incomplete<T>::value \
williamr@2
   102
        , boost::mpl::bool_<false> \
williamr@2
   103
        , BOOST_PP_CAT(trait,_impl)<T> \
williamr@2
   104
        >::type \
williamr@2
   105
{ \
williamr@2
   106
}; \
williamr@2
   107
\
williamr@2
   108
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, void) \
williamr@2
   109
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, bool) \
williamr@2
   110
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, char) \
williamr@2
   111
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed char) \
williamr@2
   112
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned char) \
williamr@2
   113
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed short) \
williamr@2
   114
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned short) \
williamr@2
   115
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed int) \
williamr@2
   116
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned int) \
williamr@2
   117
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed long) \
williamr@2
   118
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned long) \
williamr@2
   119
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, float) \
williamr@2
   120
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, double) \
williamr@2
   121
BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, long double) \
williamr@2
   122
/**/
williamr@2
   123
williamr@2
   124
#   define BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, T) \
williamr@2
   125
template<> struct trait<T> \
williamr@2
   126
{ \
williamr@2
   127
    BOOST_STATIC_CONSTANT(bool, value = false); \
williamr@2
   128
    typedef boost::mpl::bool_<false> type; \
williamr@2
   129
}; \
williamr@2
   130
/**/
williamr@2
   131
williamr@2
   132
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
williamr@2
   133
#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \
williamr@2
   134
    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \
williamr@2
   135
    BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, wchar_t) \
williamr@2
   136
/**/
williamr@2
   137
#else
williamr@2
   138
#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \
williamr@2
   139
    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \
williamr@2
   140
/**/
williamr@2
   141
#endif
williamr@2
   142
williamr@2
   143
williamr@2
   144
// SFINAE-based implementations below are derived from a USENET newsgroup's 
williamr@2
   145
// posting by Rani Sharoni (comp.lang.c++.moderated, 2002-03-17 07:45:09 PST)
williamr@2
   146
williamr@2
   147
#   elif BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
williamr@2
   148
      || BOOST_WORKAROUND(__IBMCPP__, <= 700)
williamr@2
   149
williamr@2
   150
// MSVC 7.1+ & VACPP
williamr@2
   151
williamr@2
   152
// agurt, 15/jun/05: replace overload-based SFINAE implementation with SFINAE
williamr@2
   153
// applied to partial specialization to fix some apparently random failures 
williamr@2
   154
// (thanks to Daniel Wallin for researching this!)
williamr@2
   155
williamr@2
   156
namespace boost { namespace mpl { namespace aux {
williamr@2
   157
template< typename T > struct msvc71_sfinae_helper { typedef void type; };
williamr@2
   158
}}}
williamr@2
   159
williamr@2
   160
#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \
williamr@2
   161
template< typename T, typename U = void > \
williamr@2
   162
struct BOOST_PP_CAT(trait,_impl_) \
williamr@2
   163
{ \
williamr@2
   164
    BOOST_STATIC_CONSTANT(bool, value = false); \
williamr@2
   165
    typedef boost::mpl::bool_<value> type; \
williamr@2
   166
}; \
williamr@2
   167
\
williamr@2
   168
template< typename T > \
williamr@2
   169
struct BOOST_PP_CAT(trait,_impl_)< \
williamr@2
   170
      T \
williamr@2
   171
    , typename boost::mpl::aux::msvc71_sfinae_helper< typename T::name >::type \
williamr@2
   172
    > \
williamr@2
   173
{ \
williamr@2
   174
    BOOST_STATIC_CONSTANT(bool, value = true); \
williamr@2
   175
    typedef boost::mpl::bool_<value> type; \
williamr@2
   176
}; \
williamr@2
   177
\
williamr@2
   178
template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
williamr@2
   179
struct trait \
williamr@2
   180
    : BOOST_PP_CAT(trait,_impl_)<T> \
williamr@2
   181
{ \
williamr@2
   182
}; \
williamr@2
   183
/**/
williamr@2
   184
williamr@2
   185
#   else // other SFINAE-capable compilers
williamr@2
   186
williamr@2
   187
#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \
williamr@2
   188
template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
williamr@2
   189
struct trait \
williamr@2
   190
{ \
williamr@2
   191
    struct gcc_3_2_wknd \
williamr@2
   192
    { \
williamr@2
   193
        template< typename U > \
williamr@2
   194
        static boost::mpl::aux::yes_tag test( \
williamr@2
   195
              boost::mpl::aux::type_wrapper<U> const volatile* \
williamr@2
   196
            , boost::mpl::aux::type_wrapper<BOOST_MSVC_TYPENAME U::name>* = 0 \
williamr@2
   197
            ); \
williamr@2
   198
    \
williamr@2
   199
        static boost::mpl::aux::no_tag test(...); \
williamr@2
   200
    }; \
williamr@2
   201
    \
williamr@2
   202
    typedef boost::mpl::aux::type_wrapper<T> t_; \
williamr@2
   203
    BOOST_STATIC_CONSTANT(bool, value = \
williamr@2
   204
          sizeof(gcc_3_2_wknd::test(static_cast<t_*>(0))) \
williamr@2
   205
            == sizeof(boost::mpl::aux::yes_tag) \
williamr@2
   206
        ); \
williamr@2
   207
    typedef boost::mpl::bool_<value> type; \
williamr@2
   208
}; \
williamr@2
   209
/**/
williamr@2
   210
williamr@2
   211
#   endif // BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
williamr@2
   212
williamr@2
   213
williamr@2
   214
#else // BOOST_MPL_CFG_NO_HAS_XXX
williamr@2
   215
williamr@2
   216
// placeholder implementation
williamr@2
   217
williamr@2
   218
#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \
williamr@2
   219
template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \
williamr@2
   220
struct trait \
williamr@2
   221
{ \
williamr@2
   222
    BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \
williamr@2
   223
    typedef fallback_ type; \
williamr@2
   224
}; \
williamr@2
   225
/**/
williamr@2
   226
williamr@2
   227
#endif
williamr@2
   228
williamr@2
   229
#define BOOST_MPL_HAS_XXX_TRAIT_DEF(name) \
williamr@2
   230
    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(BOOST_PP_CAT(has_,name), name, false) \
williamr@2
   231
/**/
williamr@2
   232
williamr@2
   233
#endif // BOOST_MPL_HAS_XXX_HPP_INCLUDED