|
1 |
|
2 #ifndef BOOST_MPL_IF_HPP_INCLUDED |
|
3 #define BOOST_MPL_IF_HPP_INCLUDED |
|
4 |
|
5 // Copyright Aleksey Gurtovoy 2000-2004 |
|
6 // |
|
7 // Distributed under the Boost Software License, Version 1.0. |
|
8 // (See accompanying file LICENSE_1_0.txt or copy at |
|
9 // http://www.boost.org/LICENSE_1_0.txt) |
|
10 // |
|
11 // See http://www.boost.org/libs/mpl for documentation. |
|
12 |
|
13 // $Id: if.hpp 49267 2008-10-11 06:19:02Z agurtovoy $ |
|
14 // $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $ |
|
15 // $Revision: 49267 $ |
|
16 |
|
17 #include <boost/mpl/aux_/value_wknd.hpp> |
|
18 #include <boost/mpl/aux_/static_cast.hpp> |
|
19 #include <boost/mpl/aux_/na_spec.hpp> |
|
20 #include <boost/mpl/aux_/lambda_support.hpp> |
|
21 #include <boost/mpl/aux_/config/integral.hpp> |
|
22 #include <boost/mpl/aux_/config/ctps.hpp> |
|
23 #include <boost/mpl/aux_/config/workaround.hpp> |
|
24 |
|
25 namespace boost { namespace mpl { |
|
26 |
|
27 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) |
|
28 |
|
29 template< |
|
30 bool C |
|
31 , typename T1 |
|
32 , typename T2 |
|
33 > |
|
34 struct if_c |
|
35 { |
|
36 typedef T1 type; |
|
37 }; |
|
38 |
|
39 template< |
|
40 typename T1 |
|
41 , typename T2 |
|
42 > |
|
43 struct if_c<false,T1,T2> |
|
44 { |
|
45 typedef T2 type; |
|
46 }; |
|
47 |
|
48 // agurt, 05/sep/04: nondescriptive parameter names for the sake of DigitalMars |
|
49 // (and possibly MWCW < 8.0); see http://article.gmane.org/gmane.comp.lib.boost.devel/108959 |
|
50 template< |
|
51 typename BOOST_MPL_AUX_NA_PARAM(T1) |
|
52 , typename BOOST_MPL_AUX_NA_PARAM(T2) |
|
53 , typename BOOST_MPL_AUX_NA_PARAM(T3) |
|
54 > |
|
55 struct if_ |
|
56 { |
|
57 private: |
|
58 // agurt, 02/jan/03: two-step 'type' definition for the sake of aCC |
|
59 typedef if_c< |
|
60 #if defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS) |
|
61 BOOST_MPL_AUX_VALUE_WKND(T1)::value |
|
62 #else |
|
63 BOOST_MPL_AUX_STATIC_CAST(bool, BOOST_MPL_AUX_VALUE_WKND(T1)::value) |
|
64 #endif |
|
65 , T2 |
|
66 , T3 |
|
67 > almost_type_; |
|
68 |
|
69 public: |
|
70 typedef typename almost_type_::type type; |
|
71 |
|
72 BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(T1,T2,T3)) |
|
73 }; |
|
74 |
|
75 #else |
|
76 |
|
77 // no partial class template specialization |
|
78 |
|
79 namespace aux { |
|
80 |
|
81 template< bool C > |
|
82 struct if_impl |
|
83 { |
|
84 template< typename T1, typename T2 > struct result_ |
|
85 { |
|
86 typedef T1 type; |
|
87 }; |
|
88 }; |
|
89 |
|
90 template<> |
|
91 struct if_impl<false> |
|
92 { |
|
93 template< typename T1, typename T2 > struct result_ |
|
94 { |
|
95 typedef T2 type; |
|
96 }; |
|
97 }; |
|
98 |
|
99 } // namespace aux |
|
100 |
|
101 template< |
|
102 bool C_ |
|
103 , typename T1 |
|
104 , typename T2 |
|
105 > |
|
106 struct if_c |
|
107 { |
|
108 typedef typename aux::if_impl< C_ > |
|
109 ::template result_<T1,T2>::type type; |
|
110 }; |
|
111 |
|
112 // (almost) copy & paste in order to save one more |
|
113 // recursively nested template instantiation to user |
|
114 template< |
|
115 typename BOOST_MPL_AUX_NA_PARAM(C_) |
|
116 , typename BOOST_MPL_AUX_NA_PARAM(T1) |
|
117 , typename BOOST_MPL_AUX_NA_PARAM(T2) |
|
118 > |
|
119 struct if_ |
|
120 { |
|
121 enum { msvc_wknd_ = BOOST_MPL_AUX_MSVC_VALUE_WKND(C_)::value }; |
|
122 |
|
123 typedef typename aux::if_impl< BOOST_MPL_AUX_STATIC_CAST(bool, msvc_wknd_) > |
|
124 ::template result_<T1,T2>::type type; |
|
125 |
|
126 BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(C_,T1,T2)) |
|
127 }; |
|
128 |
|
129 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION |
|
130 |
|
131 BOOST_MPL_AUX_NA_SPEC(3, if_) |
|
132 |
|
133 }} |
|
134 |
|
135 #endif // BOOST_MPL_IF_HPP_INCLUDED |