summaryrefslogtreecommitdiffstats
path: root/contrib/src/boost/iterator/detail/enable_if.hpp
blob: c0da4b4839525543ad1ee0be08011043db0cd9f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// (C) Copyright David Abrahams 2002.

// (C) Copyright Jeremy Siek    2002.

// (C) Copyright Thomas Witt    2002.

// Distributed under the Boost Software License, Version 1.0. (See

// accompanying file LICENSE_1_0.txt or copy at

// http://www.boost.org/LICENSE_1_0.txt)

#ifndef BOOST_ENABLE_IF_23022003THW_HPP

#define BOOST_ENABLE_IF_23022003THW_HPP


#include <boost/detail/workaround.hpp>

#include <boost/mpl/identity.hpp>


#include <boost/iterator/detail/config_def.hpp>


//

// Boost iterators uses its own enable_if cause we need

// special semantics for deficient compilers.

// 23/02/03 thw

//


namespace boost
{

  namespace iterators
  {
    //

    // Base machinery for all kinds of enable if

    //

    template<bool>
    struct enabled
    {
      template<typename T>
      struct base
      {
        typedef T type;
      };
    };

    //

    // For compilers that don't support "Substitution Failure Is Not An Error"

    // enable_if falls back to always enabled. See comments

    // on operator implementation for consequences.

    //

    template<>
    struct enabled<false>
    {
      template<typename T>
      struct base
      {
#ifdef BOOST_NO_SFINAE


        typedef T type;

        // This way to do it would give a nice error message containing

        // invalid overload, but has the big disadvantage that

        // there is no reference to user code in the error message.

        //

        // struct invalid_overload;

        // typedef invalid_overload type;

        //

#endif

      };
    };


    template <class Cond,
              class Return>
    struct enable_if
# if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE)

      : enabled<(Cond::value)>::template base<Return>
# else

      : mpl::identity<Return>
# endif

    {
    };

  } // namespace iterators


} // namespace boost


#include <boost/iterator/detail/config_undef.hpp>


#endif // BOOST_ENABLE_IF_23022003THW_HPP