Merge c:/dyninst/pc_bluegene/dyninst into dyn_pc_integration
[dyninst.git] / external / boost / iterator / detail / enable_if.hpp
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