// Copyright David Abrahams 2002. // 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) #ifndef INDIRECT_TRAITS_DWA2002131_HPP # define INDIRECT_TRAITS_DWA2002131_HPP # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # include # endif namespace cutl_details_boost { namespace detail { namespace indirect_traits { # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template struct is_reference_to_const : mpl::false_ { }; template struct is_reference_to_const : mpl::true_ { }; # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround template struct is_reference_to_const : mpl::true_ { }; # endif template struct is_reference_to_function : mpl::false_ { }; template struct is_reference_to_function : is_function { }; template struct is_pointer_to_function : mpl::false_ { }; // There's no such thing as a pointer-to-cv-function, so we don't need // specializations for those template struct is_pointer_to_function : is_function { }; template struct is_reference_to_member_function_pointer_impl : mpl::false_ { }; template struct is_reference_to_member_function_pointer_impl : is_member_function_pointer::type> { }; template struct is_reference_to_member_function_pointer : is_reference_to_member_function_pointer_impl { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T)) }; template struct is_reference_to_function_pointer_aux : mpl::and_< is_reference , is_pointer_to_function< typename remove_cv< typename remove_reference::type >::type > > { // There's no such thing as a pointer-to-cv-function, so we don't need specializations for those }; template struct is_reference_to_function_pointer : mpl::if_< is_reference_to_function , mpl::false_ , is_reference_to_function_pointer_aux >::type { }; template struct is_reference_to_non_const : mpl::and_< is_reference , mpl::not_< is_reference_to_const > > { }; template struct is_reference_to_volatile : mpl::false_ { }; template struct is_reference_to_volatile : mpl::true_ { }; # if defined(BOOST_MSVC) && _MSC_FULL_VER <= 13102140 // vc7.01 alpha workaround template struct is_reference_to_volatile : mpl::true_ { }; # endif template struct is_reference_to_pointer : mpl::false_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_pointer : mpl::true_ { }; template struct is_reference_to_class : mpl::and_< is_reference , is_class< typename remove_cv< typename remove_reference::type >::type > > { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T)) }; template struct is_pointer_to_class : mpl::and_< is_pointer , is_class< typename remove_cv< typename remove_pointer::type >::type > > { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_class,(T)) }; # else using namespace cutl_details_boost::detail::is_function_ref_tester_; typedef char (&inner_yes_type)[3]; typedef char (&inner_no_type)[2]; typedef char (&outer_no_type)[1]; template struct is_const_help { typedef typename mpl::if_< is_const , inner_yes_type , inner_no_type >::type type; }; template struct is_volatile_help { typedef typename mpl::if_< is_volatile , inner_yes_type , inner_no_type >::type type; }; template struct is_pointer_help { typedef typename mpl::if_< is_pointer , inner_yes_type , inner_no_type >::type type; }; template struct is_class_help { typedef typename mpl::if_< is_class , inner_yes_type , inner_no_type >::type type; }; template struct is_reference_to_function_aux { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(detail::is_function_ref_tester(t,0)) == sizeof(::cutl_details_boost::type_traits::yes_type)); typedef mpl::bool_ type; }; template struct is_reference_to_function : mpl::if_, is_reference_to_function_aux, mpl::bool_ >::type { }; template struct is_pointer_to_function_aux { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(::cutl_details_boost::type_traits::is_function_ptr_tester(t)) == sizeof(::cutl_details_boost::type_traits::yes_type)); typedef mpl::bool_ type; }; template struct is_pointer_to_function : mpl::if_, is_pointer_to_function_aux, mpl::bool_ >::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_pointer_to_function,(T)) }; struct false_helper1 { template struct apply : mpl::false_ { }; }; template typename is_const_help::type reference_to_const_helper(V&); outer_no_type reference_to_const_helper(...); struct true_helper1 { template struct apply { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(reference_to_const_helper(t)) == sizeof(inner_yes_type)); typedef mpl::bool_ type; }; }; template struct is_reference_to_const_helper1 : true_helper1 { }; template <> struct is_reference_to_const_helper1 : false_helper1 { }; template struct is_reference_to_const : is_reference_to_const_helper1::value>::template apply { }; template struct is_reference_to_non_const_helper1 { template struct apply { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(reference_to_const_helper(t)) == sizeof(inner_no_type)); typedef mpl::bool_ type; }; }; template <> struct is_reference_to_non_const_helper1 : false_helper1 { }; template struct is_reference_to_non_const : is_reference_to_non_const_helper1::value>::template apply { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_non_const,(T)) }; template typename is_volatile_help::type reference_to_volatile_helper(V&); outer_no_type reference_to_volatile_helper(...); template struct is_reference_to_volatile_helper1 { template struct apply { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof(reference_to_volatile_helper(t)) == sizeof(inner_yes_type)); typedef mpl::bool_ type; }; }; template <> struct is_reference_to_volatile_helper1 : false_helper1 { }; template struct is_reference_to_volatile : is_reference_to_volatile_helper1::value>::template apply { }; template typename is_pointer_help::type reference_to_pointer_helper(V&); outer_no_type reference_to_pointer_helper(...); template struct reference_to_pointer_impl { static T t; BOOST_STATIC_CONSTANT( bool, value = (sizeof((reference_to_pointer_helper)(t)) == sizeof(inner_yes_type)) ); typedef mpl::bool_ type; }; template struct is_reference_to_pointer : mpl::eval_if, reference_to_pointer_impl, mpl::false_>::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_pointer,(T)) }; template struct is_reference_to_function_pointer : mpl::eval_if, is_pointer_to_function_aux, mpl::false_>::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_function_pointer,(T)) }; template struct is_member_function_pointer_help : mpl::if_, inner_yes_type, inner_no_type> {}; template typename is_member_function_pointer_help::type member_function_pointer_helper(V&); outer_no_type member_function_pointer_helper(...); template struct is_pointer_to_member_function_aux { static T t; BOOST_STATIC_CONSTANT( bool, value = sizeof((member_function_pointer_helper)(t)) == sizeof(inner_yes_type)); typedef mpl::bool_ type; }; template struct is_reference_to_member_function_pointer : mpl::if_< is_reference , is_pointer_to_member_function_aux , mpl::bool_ >::type { BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_member_function_pointer,(T)) }; template typename is_class_help::type reference_to_class_helper(V const volatile&); outer_no_type reference_to_class_helper(...); template struct is_reference_to_class { static T t; BOOST_STATIC_CONSTANT( bool, value = (is_reference::value & (sizeof(reference_to_class_helper(t)) == sizeof(inner_yes_type))) ); typedef mpl::bool_ type; BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_class,(T)) }; template typename is_class_help::type pointer_to_class_helper(V const volatile*); outer_no_type pointer_to_class_helper(...); template struct is_pointer_to_class { static T t; BOOST_STATIC_CONSTANT( bool, value = (is_pointer::value && sizeof(pointer_to_class_helper(t)) == sizeof(inner_yes_type)) ); typedef mpl::bool_ type; }; # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION } using namespace indirect_traits; }} // namespace cutl_details_boost::python::detail #endif // INDIRECT_TRAITS_DWA2002131_HPP