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 87