source: NonGTP/Boost/boost/iterator/detail/enable_if.hpp @ 857

Revision 857, 2.0 KB checked in by igarcia, 19 years ago (diff)
Line 
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
21namespace 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, <= 1200)
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
Note: See TracBrowser for help on using the repository browser.