From a9ca707add3137cf0762ff9fa21f616a61810611 Mon Sep 17 00:00:00 2001 From: Aleksey Gurtovoy Date: Mon, 24 Feb 2003 01:02:31 +0000 Subject: [PATCH] ETI refactoring [SVN r17614] --- include/boost/mpl/aux_/is_msvc_eti_arg.hpp | 67 ++++++++++++++++++++++ include/boost/mpl/aux_/msvc_eti_base.hpp | 60 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 include/boost/mpl/aux_/is_msvc_eti_arg.hpp create mode 100644 include/boost/mpl/aux_/msvc_eti_base.hpp diff --git a/include/boost/mpl/aux_/is_msvc_eti_arg.hpp b/include/boost/mpl/aux_/is_msvc_eti_arg.hpp new file mode 100644 index 0000000..d4cbe9e --- /dev/null +++ b/include/boost/mpl/aux_/is_msvc_eti_arg.hpp @@ -0,0 +1,67 @@ +//----------------------------------------------------------------------------- +// boost mpl/aux_/is_msvc_eti_arg.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2001-03 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED +#define BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED + +#include "boost/mpl/aux_/yes_no.hpp" +#include "boost/mpl/aux_/config/eti.hpp" +#include "boost/mpl/aux_/config/static_constant.hpp" + +namespace boost { namespace mpl { namespace aux { + +#if defined(BOOST_MPL_MSVC_ETI_BUG) + +#if defined(BOOST_MPL_MSVC_60_ETI_BUG) + +template< typename T > +struct is_msvc_eti_arg +{ + BOOST_STATIC_CONSTANT(bool, value = false); +}; + +#else + +struct eti_int_convertible +{ + eti_int_convertible(int); +}; + +template< typename T > +struct is_msvc_eti_arg +{ + static no_tag test(...); + static yes_tag test(eti_int_convertible); + static T get(); + + BOOST_STATIC_CONSTANT(bool, value = + sizeof(test(get())) == sizeof(yes_tag) + ); +}; + +#endif // BOOST_MPL_MSVC_60_ETI_BUG + +template<> +struct is_msvc_eti_arg +{ + BOOST_STATIC_CONSTANT(bool, value = true); +}; + +#endif // BOOST_MPL_MSVC_ETI_BUG + +}}} // namespace boost::mpl::aux + +#endif // BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED diff --git a/include/boost/mpl/aux_/msvc_eti_base.hpp b/include/boost/mpl/aux_/msvc_eti_base.hpp new file mode 100644 index 0000000..152dd16 --- /dev/null +++ b/include/boost/mpl/aux_/msvc_eti_base.hpp @@ -0,0 +1,60 @@ +//----------------------------------------------------------------------------- +// boost mpl/aux_/msvc_msvc_eti_base.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2001-03 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED +#define BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED + +#include "boost/mpl/aux_/config/eti.hpp" +#include "boost/mpl/aux_/is_msvc_eti_arg.hpp" + +namespace boost { namespace mpl { namespace aux { + +#if defined(BOOST_MPL_MSVC_ETI_BUG) + +template< bool > struct msvc_eti_base_impl +{ + template< typename T > struct result_ + { + typedef T type; + }; +}; + +template<> struct msvc_eti_base_impl +{ + template< typename T > struct result_ + { + typedef result_ type; + }; +}; + +template< typename T > struct msvc_eti_base + : msvc_eti_base_impl< is_msvc_eti_arg::value > + ::template result_ +{ +}; + +#else + +template< typename T > struct msvc_eti_base +{ + typedef T type; +}; + +#endif // BOOST_MPL_MSVC_ETI_BUG + +}}} // namespace boost::mpl::aux + +#endif // BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED