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