1 # /* Copyright (C) 2001 |
1 |
2 # * Housemarque Oy |
2 #ifndef BOOST_MPL_IF_HPP_INCLUDED |
3 # * http://www.housemarque.com |
3 #define BOOST_MPL_IF_HPP_INCLUDED |
4 # * |
4 |
5 # * Distributed under the Boost Software License, Version 1.0. (See |
5 // Copyright Aleksey Gurtovoy 2000-2004 |
6 # * accompanying file LICENSE_1_0.txt or copy at |
6 // |
7 # * http://www.boost.org/LICENSE_1_0.txt) |
7 // Distributed under the Boost Software License, Version 1.0. |
8 # */ |
8 // (See accompanying file LICENSE_1_0.txt or copy at |
9 # |
9 // http://www.boost.org/LICENSE_1_0.txt) |
10 # /* Revised by Paul Mensonides (2002) */ |
10 // |
11 # |
11 // See http://www.boost.org/libs/mpl for documentation. |
12 # /* See http://www.boost.org for most recent version. */ |
12 |
13 # |
13 // $Source: /cvsroot/boost/boost/boost/mpl/if.hpp,v $ |
14 # ifndef BOOST_PREPROCESSOR_CONTROL_IF_HPP |
14 // $Date: 2004/09/07 08:51:31 $ |
15 # define BOOST_PREPROCESSOR_CONTROL_IF_HPP |
15 // $Revision: 1.25 $ |
16 # |
16 |
17 # include <boost/preprocessor/config/config.hpp> |
17 #include <boost/mpl/aux_/value_wknd.hpp> |
18 # include <boost/preprocessor/control/iif.hpp> |
18 #include <boost/mpl/aux_/static_cast.hpp> |
19 # include <boost/preprocessor/logical/bool.hpp> |
19 #include <boost/mpl/aux_/na_spec.hpp> |
20 # |
20 #include <boost/mpl/aux_/lambda_support.hpp> |
21 # /* BOOST_PP_IF */ |
21 #include <boost/mpl/aux_/config/integral.hpp> |
22 # |
22 #include <boost/mpl/aux_/config/ctps.hpp> |
23 # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() |
23 #include <boost/mpl/aux_/config/workaround.hpp> |
24 # define BOOST_PP_IF(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f) |
24 |
25 # else |
25 namespace boost { namespace mpl { |
26 # define BOOST_PP_IF(cond, t, f) BOOST_PP_IF_I(cond, t, f) |
26 |
27 # define BOOST_PP_IF_I(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f) |
27 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) |
28 # endif |
28 |
29 # |
29 template< |
30 # endif |
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 |