diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-06-28 17:17:23 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-06-28 17:17:23 +0200 |
commit | b51965dddbed68f23c5e8c169c23c794313ce5f6 (patch) | |
tree | 37bbdf4e5b1cdd34ea0694a5abd1483d1de2b3af /cutl/details/boost/mpl/aux_/msvc_is_class.hpp | |
parent | 5f06e7e30e4f511ce2fb27c5feefa6aeb6f00841 (diff) |
Add boost subset as an implementation detail
Diffstat (limited to 'cutl/details/boost/mpl/aux_/msvc_is_class.hpp')
-rw-r--r-- | cutl/details/boost/mpl/aux_/msvc_is_class.hpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/cutl/details/boost/mpl/aux_/msvc_is_class.hpp b/cutl/details/boost/mpl/aux_/msvc_is_class.hpp new file mode 100644 index 0000000..ac0f3dd --- /dev/null +++ b/cutl/details/boost/mpl/aux_/msvc_is_class.hpp @@ -0,0 +1,58 @@ + +#ifndef BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED +#define BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED + +// Copyright Aleksey Gurtovoy 2002-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: msvc_is_class.hpp 49267 2008-10-11 06:19:02Z agurtovoy $ +// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $ +// $Revision: 49267 $ + +#include <cutl/details/boost/mpl/if.hpp> +#include <cutl/details/boost/mpl/bool.hpp> +#include <cutl/details/boost/mpl/aux_/type_wrapper.hpp> +#include <cutl/details/boost/mpl/aux_/yes_no.hpp> + +#include <cutl/details/boost/type_traits/is_reference.hpp> + +namespace cutl_details_boost { namespace mpl { namespace aux { + +template< typename T > struct is_class_helper +{ + typedef int (T::* type)(); +}; + +// MSVC 6.x-specific lightweight 'is_class' implementation; +// Distinguishing feature: does not instantiate the type being tested. +template< typename T > +struct msvc_is_class_impl +{ + template< typename U> + static yes_tag test(type_wrapper<U>*, /*typename*/ is_class_helper<U>::type = 0); + static no_tag test(void const volatile*, ...); + + enum { value = sizeof(test((type_wrapper<T>*)0)) == sizeof(yes_tag) }; + typedef bool_<value> type; +}; + +// agurt, 17/sep/04: have to check for 'is_reference' upfront to avoid ICEs in +// complex metaprograms +template< typename T > +struct msvc_is_class + : if_< + is_reference<T> + , false_ + , msvc_is_class_impl<T> + >::type +{ +}; + +}}} + +#endif // BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED |