fixing stuff
[dyninst.git] / dynutil / h / dyn_detail / boost / mpl / if.hpp
1
2 #ifndef DYN_DETAIL_BOOST_MPL_IF_HPP_INCLUDED
3 #define DYN_DETAIL_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 <dyn_detail/boost/mpl/aux_/value_wknd.hpp>
18 #include <dyn_detail/boost/mpl/aux_/static_cast.hpp>
19 #include <dyn_detail/boost/mpl/aux_/na_spec.hpp>
20 #include <dyn_detail/boost/mpl/aux_/lambda_support.hpp>
21 #include <dyn_detail/boost/mpl/aux_/config/integral.hpp>
22 #include <dyn_detail/boost/mpl/aux_/config/ctps.hpp>
23 #include <dyn_detail/boost/mpl/aux_/config/workaround.hpp>
24
25 namespace dyn_detail {
26 namespace boost { namespace mpl {
27
28 #if !defined(DYN_DETAIL_BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
29
30 template<
31       bool C
32     , typename T1
33     , typename T2
34     >
35 struct if_c
36 {
37     typedef T1 type;
38 };
39
40 template<
41       typename T1
42     , typename T2
43     >
44 struct if_c<false,T1,T2>
45 {
46     typedef T2 type;
47 };
48
49 // agurt, 05/sep/04: nondescriptive parameter names for the sake of DigitalMars
50 // (and possibly MWCW < 8.0); see http://article.gmane.org/gmane.comp.lib.boost.devel/108959
51 template<
52       typename DYN_DETAIL_BOOST_MPL_AUX_NA_PARAM(T1)
53     , typename DYN_DETAIL_BOOST_MPL_AUX_NA_PARAM(T2)
54     , typename DYN_DETAIL_BOOST_MPL_AUX_NA_PARAM(T3)
55     >
56 struct if_
57 {
58  private:
59     // agurt, 02/jan/03: two-step 'type' definition for the sake of aCC 
60     typedef if_c<
61 #if defined(DYN_DETAIL_BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS)
62           DYN_DETAIL_BOOST_MPL_AUX_VALUE_WKND(T1)::value
63 #else
64           DYN_DETAIL_BOOST_MPL_AUX_STATIC_CAST(bool, DYN_DETAIL_BOOST_MPL_AUX_VALUE_WKND(T1)::value)
65 #endif
66         , T2
67         , T3
68         > almost_type_;
69  
70  public:
71     typedef typename almost_type_::type type;
72     
73     DYN_DETAIL_BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(T1,T2,T3))
74 };
75
76 #else
77
78 // no partial class template specialization
79
80 namespace aux {
81
82 template< bool C >
83 struct if_impl
84 {
85     template< typename T1, typename T2 > struct result_
86     {
87         typedef T1 type;
88     };
89 };
90
91 template<>
92 struct if_impl<false>
93 {
94     template< typename T1, typename T2 > struct result_
95     { 
96         typedef T2 type;
97     };
98 };
99
100 } // namespace aux
101
102 template<
103       bool C_
104     , typename T1
105     , typename T2
106     >
107 struct if_c
108 {
109     typedef typename aux::if_impl< C_ >
110         ::template result_<T1,T2>::type type;
111 };
112
113 // (almost) copy & paste in order to save one more 
114 // recursively nested template instantiation to user
115 template<
116       typename DYN_DETAIL_BOOST_MPL_AUX_NA_PARAM(C_)
117     , typename DYN_DETAIL_BOOST_MPL_AUX_NA_PARAM(T1)
118     , typename DYN_DETAIL_BOOST_MPL_AUX_NA_PARAM(T2)
119     >
120 struct if_
121 {
122     enum { msvc_wknd_ = DYN_DETAIL_BOOST_MPL_AUX_MSVC_VALUE_WKND(C_)::value };
123
124     typedef typename aux::if_impl< DYN_DETAIL_BOOST_MPL_AUX_STATIC_CAST(bool, msvc_wknd_) >
125         ::template result_<T1,T2>::type type;
126
127     DYN_DETAIL_BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(C_,T1,T2))
128 };
129
130 #endif // DYN_DETAIL_BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
131
132 DYN_DETAIL_BOOST_MPL_AUX_NA_SPEC(3, if_)
133
134 }}
135 }
136 #endif // DYN_DETAIL_BOOST_MPL_IF_HPP_INCLUDED