1 2 #ifndef BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED 3 #define BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED 4 5 // Copyright Aleksey Gurtovoy 2001-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: msvc_eti_base.hpp 49267 2008-10-11 06:19:02Z agurtovoy $ 14 // $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $ 15 // $Revision: 49267 $ 16 17 #include <boost/mpl/aux_/is_msvc_eti_arg.hpp> 18 #include <boost/mpl/aux_/config/eti.hpp> 19 #include <boost/mpl/aux_/config/gcc.hpp> 20 #include <boost/mpl/aux_/config/workaround.hpp> 21 22 namespace boost { namespace mpl { namespace aux { 23 24 #if defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG) 25 26 template< bool > struct msvc_eti_base_impl 27 { 28 template< typename T > struct result_ 29 : T 30 { 31 typedef T type; 32 }; 33 }; 34 35 template<> struct msvc_eti_base_impl<true> 36 { 37 template< typename T > struct result_ 38 { 39 typedef result_ type; 40 typedef result_ first; 41 typedef result_ second; 42 typedef result_ tag; 43 enum { value = 0 }; 44 }; 45 }; 46 47 template< typename T > struct msvc_eti_base 48 : msvc_eti_base_impl< is_msvc_eti_arg<T>::value > 49 ::template result_<T> 50 { 51 }; 52 53 #else // !BOOST_MPL_CFG_MSVC_70_ETI_BUG 54 55 template< typename T > struct msvc_eti_base 56 : T 57 { 58 #if BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304)) 59 msvc_eti_base(); 60 #endif 61 typedef T type; 62 }; 63 64 #endif 65 66 template<> struct msvc_eti_base<int> 67 { 68 typedef msvc_eti_base type; 69 typedef msvc_eti_base first; 70 typedef msvc_eti_base second; 71 typedef msvc_eti_base tag; 72 enum { value = 0 }; 73 }; 74 75 }}} 76 77 #endif // BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED 78