136 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| #ifndef BOOST_MPL_IF_HPP_INCLUDED
 | |
| #define BOOST_MPL_IF_HPP_INCLUDED
 | |
| 
 | |
| // Copyright Aleksey Gurtovoy 2000-2004
 | |
| //
 | |
| // Distributed under the Boost Software License, Version 1.0. 
 | |
| // (See accompanying file LICENSE_1_0.txt or copy at 
 | |
| // http://www.boost.org/LICENSE_1_0.txt)
 | |
| //
 | |
| // See http://www.boost.org/libs/mpl for documentation.
 | |
| 
 | |
| // $Id$
 | |
| // $Date$
 | |
| // $Revision$
 | |
| 
 | |
| #include <boost/mpl/aux_/value_wknd.hpp>
 | |
| #include <boost/mpl/aux_/static_cast.hpp>
 | |
| #include <boost/mpl/aux_/na_spec.hpp>
 | |
| #include <boost/mpl/aux_/lambda_support.hpp>
 | |
| #include <boost/mpl/aux_/config/integral.hpp>
 | |
| #include <boost/mpl/aux_/config/ctps.hpp>
 | |
| #include <boost/mpl/aux_/config/workaround.hpp>
 | |
| 
 | |
| namespace boost { namespace mpl {
 | |
| 
 | |
| #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 | |
| 
 | |
| template<
 | |
|       bool C
 | |
|     , typename T1
 | |
|     , typename T2
 | |
|     >
 | |
| struct if_c
 | |
| {
 | |
|     typedef T1 type;
 | |
| };
 | |
| 
 | |
| template<
 | |
|       typename T1
 | |
|     , typename T2
 | |
|     >
 | |
| struct if_c<false,T1,T2>
 | |
| {
 | |
|     typedef T2 type;
 | |
| };
 | |
| 
 | |
| // agurt, 05/sep/04: nondescriptive parameter names for the sake of DigitalMars
 | |
| // (and possibly MWCW < 8.0); see http://article.gmane.org/gmane.comp.lib.boost.devel/108959
 | |
| template<
 | |
|       typename BOOST_MPL_AUX_NA_PARAM(T1)
 | |
|     , typename BOOST_MPL_AUX_NA_PARAM(T2)
 | |
|     , typename BOOST_MPL_AUX_NA_PARAM(T3)
 | |
|     >
 | |
| struct if_
 | |
| {
 | |
|  private:
 | |
|     // agurt, 02/jan/03: two-step 'type' definition for the sake of aCC 
 | |
|     typedef if_c<
 | |
| #if defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS)
 | |
|           BOOST_MPL_AUX_VALUE_WKND(T1)::value
 | |
| #else
 | |
|           BOOST_MPL_AUX_STATIC_CAST(bool, BOOST_MPL_AUX_VALUE_WKND(T1)::value)
 | |
| #endif
 | |
|         , T2
 | |
|         , T3
 | |
|         > almost_type_;
 | |
|  
 | |
|  public:
 | |
|     typedef typename almost_type_::type type;
 | |
|     
 | |
|     BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(T1,T2,T3))
 | |
| };
 | |
| 
 | |
| #else
 | |
| 
 | |
| // no partial class template specialization
 | |
| 
 | |
| namespace aux {
 | |
| 
 | |
| template< bool C >
 | |
| struct if_impl
 | |
| {
 | |
|     template< typename T1, typename T2 > struct result_
 | |
|     {
 | |
|         typedef T1 type;
 | |
|     };
 | |
| };
 | |
| 
 | |
| template<>
 | |
| struct if_impl<false>
 | |
| {
 | |
|     template< typename T1, typename T2 > struct result_
 | |
|     { 
 | |
|         typedef T2 type;
 | |
|     };
 | |
| };
 | |
| 
 | |
| } // namespace aux
 | |
| 
 | |
| template<
 | |
|       bool C_
 | |
|     , typename T1
 | |
|     , typename T2
 | |
|     >
 | |
| struct if_c
 | |
| {
 | |
|     typedef typename aux::if_impl< C_ >
 | |
|         ::template result_<T1,T2>::type type;
 | |
| };
 | |
| 
 | |
| // (almost) copy & paste in order to save one more 
 | |
| // recursively nested template instantiation to user
 | |
| template<
 | |
|       typename BOOST_MPL_AUX_NA_PARAM(C_)
 | |
|     , typename BOOST_MPL_AUX_NA_PARAM(T1)
 | |
|     , typename BOOST_MPL_AUX_NA_PARAM(T2)
 | |
|     >
 | |
| struct if_
 | |
| {
 | |
|     enum { msvc_wknd_ = BOOST_MPL_AUX_MSVC_VALUE_WKND(C_)::value };
 | |
| 
 | |
|     typedef typename aux::if_impl< BOOST_MPL_AUX_STATIC_CAST(bool, msvc_wknd_) >
 | |
|         ::template result_<T1,T2>::type type;
 | |
| 
 | |
|     BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(C_,T1,T2))
 | |
| };
 | |
| 
 | |
| #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | |
| 
 | |
| BOOST_MPL_AUX_NA_SPEC(3, if_)
 | |
| 
 | |
| }}
 | |
| 
 | |
| #endif // BOOST_MPL_IF_HPP_INCLUDED
 | 
