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$ 14 // $Date$ 15 // $Revision$ 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 https://lists.boost.org/Archives/boost/2004/09/71383.php 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 136