]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/iterator/detail/enable_if.hpp
Logo AND Algorithmique Numérique Distribuée

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