epoc32/include/stdapis/boost/iterator/detail/enable_if.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
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.
     1 // (C) Copyright David Abrahams 2002.
     2 // (C) Copyright Jeremy Siek    2002.
     3 // (C) Copyright Thomas Witt    2002.
     4 // Distributed under the Boost Software License, Version 1.0. (See
     5 // accompanying file LICENSE_1_0.txt or copy at
     6 // http://www.boost.org/LICENSE_1_0.txt)
     7 #ifndef BOOST_ENABLE_IF_23022003THW_HPP
     8 #define BOOST_ENABLE_IF_23022003THW_HPP
     9 
    10 #include <boost/detail/workaround.hpp>
    11 #include <boost/mpl/identity.hpp>
    12 
    13 #include <boost/iterator/detail/config_def.hpp>
    14 
    15 //
    16 // Boost iterators uses its own enable_if cause we need
    17 // special semantics for deficient compilers.
    18 // 23/02/03 thw
    19 //
    20 
    21 namespace boost
    22 {
    23 
    24   namespace iterators
    25   {
    26     //
    27     // Base machinery for all kinds of enable if
    28     //
    29     template<bool>
    30     struct enabled
    31     {
    32       template<typename T>
    33       struct base
    34       {
    35         typedef T type;
    36       };
    37     };
    38     
    39     //
    40     // For compilers that don't support "Substitution Failure Is Not An Error"
    41     // enable_if falls back to always enabled. See comments
    42     // on operator implementation for consequences.
    43     //
    44     template<>
    45     struct enabled<false>
    46     {
    47       template<typename T>
    48       struct base
    49       {
    50 #ifdef BOOST_NO_SFINAE
    51 
    52         typedef T type;
    53 
    54         // This way to do it would give a nice error message containing
    55         // invalid overload, but has the big disadvantage that
    56         // there is no reference to user code in the error message.
    57         //
    58         // struct invalid_overload;
    59         // typedef invalid_overload type;
    60         //
    61 #endif
    62       };
    63     };
    64 
    65 
    66     template <class Cond,
    67               class Return>
    68     struct enable_if
    69 # if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE)
    70       : enabled<(Cond::value)>::template base<Return>
    71 # else
    72       : mpl::identity<Return>
    73 # endif 
    74     {
    75 # if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
    76         typedef Return type;
    77 # endif 
    78     };
    79 
    80   } // namespace iterators
    81 
    82 } // namespace boost
    83 
    84 #include <boost/iterator/detail/config_undef.hpp>
    85 
    86 #endif // BOOST_ENABLE_IF_23022003THW_HPP