Chris@16: Chris@16: // (C) Copyright Edward Diener 2011,2012,2013 Chris@16: // Use, modification and distribution are subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt). Chris@16: Chris@16: #if !defined(BOOST_TTI_DETAIL_MEM_DATA_HPP) Chris@16: #define BOOST_TTI_DETAIL_MEM_DATA_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@101: #include Chris@16: Chris@16: #if defined(BOOST_MSVC) || (BOOST_WORKAROUND(BOOST_GCC, >= 40400) && BOOST_WORKAROUND(BOOST_GCC, < 40600)) Chris@16: Chris@101: #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \ Chris@16: template \ Chris@101: struct BOOST_PP_CAT(trait,_detail_hmd_op) \ Chris@16: { \ Chris@16: template \ Chris@16: struct return_of; \ Chris@16: \ Chris@16: template \ Chris@16: struct return_of \ Chris@16: { \ Chris@16: typedef BOOST_TTI_DETAIL_TP_R type; \ Chris@16: }; \ Chris@16: \ Chris@16: template \ Chris@16: struct menable_if; \ Chris@16: \ Chris@16: template \ Chris@16: struct menable_if \ Chris@16: { \ Chris@16: typedef BOOST_TTI_DETAIL_TP_U type; \ Chris@16: }; \ Chris@16: \ Chris@16: template \ Chris@16: static ::boost::type_traits::yes_type check2(BOOST_TTI_DETAIL_TP_V BOOST_TTI_DETAIL_TP_U::*); \ Chris@16: \ Chris@16: template \ Chris@16: static ::boost::type_traits::no_type check2(BOOST_TTI_DETAIL_TP_U); \ Chris@16: \ Chris@16: template \ Chris@16: static typename \ Chris@16: menable_if \ Chris@16: < \ Chris@16: sizeof(check2(&BOOST_TTI_DETAIL_TP_U::name))==sizeof(::boost::type_traits::yes_type), \ Chris@16: ::boost::type_traits::yes_type \ Chris@16: > \ Chris@16: ::type \ Chris@16: has_matching_member(int); \ Chris@16: \ Chris@16: template \ Chris@16: static ::boost::type_traits::no_type has_matching_member(...); \ Chris@16: \ Chris@16: template \ Chris@16: struct ttc_md \ Chris@16: { \ Chris@16: typedef boost::mpl::bool_::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \ Chris@16: }; \ Chris@16: \ Chris@16: typedef typename ttc_md::type type; \ Chris@16: \ Chris@16: }; \ Chris@16: /**/ Chris@16: Chris@16: #else // !defined(BOOST_MSVC) Chris@16: Chris@16: #include Chris@16: Chris@101: #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \ Chris@16: BOOST_TTI_DETAIL_TRAIT_HAS_TYPES_MEMBER_FUNCTION(trait,name) \ Chris@16: template \ Chris@101: struct BOOST_PP_CAT(trait,_detail_hmd_op) : \ Chris@16: BOOST_PP_CAT(trait,_detail_types) \ Chris@16: { \ Chris@16: }; \ Chris@16: /**/ Chris@16: Chris@16: #endif // defined(BOOST_MSVC) Chris@16: Chris@101: #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_ENCLOSING_CLASS(trait) \ Chris@101: template \ Chris@101: struct BOOST_PP_CAT(trait,_detail_hmd_invoke_enclosing_class) : \ Chris@101: BOOST_PP_CAT(trait,_detail_hmd_op) \ Chris@101: < \ Chris@101: typename BOOST_TTI_NAMESPACE::detail::ptmd::type, \ Chris@101: typename boost::remove_const::type \ Chris@101: > \ Chris@101: { \ Chris@101: }; \ Chris@101: /**/ Chris@101: Chris@101: #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_PT_MEMBER(trait) \ Chris@101: template \ Chris@101: struct BOOST_PP_CAT(trait,_detail_hmd_invoke_pt_member) : \ Chris@101: BOOST_PP_CAT(trait,_detail_hmd_op) \ Chris@101: < \ Chris@101: typename BOOST_TTI_NAMESPACE::detail::dmem_get_type::type, \ Chris@101: typename boost::remove_const \ Chris@101: < \ Chris@101: typename BOOST_TTI_NAMESPACE::detail::dmem_get_enclosing::type \ Chris@101: >::type \ Chris@101: > \ Chris@101: { \ Chris@101: }; \ Chris@101: /**/ Chris@101: Chris@101: #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_WITH_ENCLOSING_CLASS(trait) \ Chris@101: BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_ENCLOSING_CLASS(trait) \ Chris@101: template \ Chris@101: struct BOOST_PP_CAT(trait,_detail_hmd_with_enclosing_class) : \ Chris@101: boost::mpl::eval_if \ Chris@101: < \ Chris@101: boost::is_class, \ Chris@101: BOOST_PP_CAT(trait,_detail_hmd_invoke_enclosing_class) \ Chris@101: < \ Chris@101: BOOST_TTI_DETAIL_TP_ET, \ Chris@101: BOOST_TTI_DETAIL_TP_TYPE \ Chris@101: >, \ Chris@101: boost::mpl::false_ \ Chris@101: > \ Chris@101: { \ Chris@101: }; \ Chris@101: /**/ Chris@101: Chris@101: #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \ Chris@101: BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \ Chris@101: BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_WITH_ENCLOSING_CLASS(trait) \ Chris@101: BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_PT_MEMBER(trait) \ Chris@101: template \ Chris@101: struct BOOST_PP_CAT(trait,_detail_hmd) : \ Chris@101: boost::mpl::eval_if \ Chris@101: < \ Chris@101: boost::is_same, \ Chris@101: BOOST_PP_CAT(trait,_detail_hmd_invoke_pt_member) \ Chris@101: < \ Chris@101: BOOST_TTI_DETAIL_TP_ET, \ Chris@101: BOOST_TTI_DETAIL_TP_TYPE \ Chris@101: >, \ Chris@101: BOOST_PP_CAT(trait,_detail_hmd_with_enclosing_class) \ Chris@101: < \ Chris@101: BOOST_TTI_DETAIL_TP_ET, \ Chris@101: BOOST_TTI_DETAIL_TP_TYPE \ Chris@101: > \ Chris@101: > \ Chris@101: { \ Chris@101: }; \ Chris@101: /**/ Chris@101: Chris@16: namespace boost Chris@16: { Chris@16: namespace tti Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: template Chris@16: struct ptmd Chris@16: { Chris@16: typedef BOOST_TTI_DETAIL_TP_R BOOST_TTI_DETAIL_TP_T::* type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct dmem_check_ptmd : Chris@16: boost::mpl::identity Chris@16: { Chris@16: BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer)); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct dmem_check_ptec : Chris@16: BOOST_TTI_NAMESPACE::detail::class_type Chris@16: { Chris@16: BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer)); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct dmem_get_type : Chris@16: boost::mpl::eval_if Chris@16: < Chris@16: boost::is_same, Chris@16: BOOST_TTI_NAMESPACE::detail::dmem_check_ptmd, Chris@16: BOOST_TTI_NAMESPACE::detail::ptmd Chris@16: > Chris@16: { Chris@16: }; Chris@16: Chris@16: template Chris@16: struct dmem_get_enclosing : Chris@16: boost::mpl::eval_if Chris@16: < Chris@16: boost::is_same, Chris@16: BOOST_TTI_NAMESPACE::detail::dmem_check_ptec, Chris@16: boost::mpl::identity Chris@16: > Chris@16: { Chris@16: }; Chris@16: Chris@16: } Chris@16: } Chris@16: } Chris@16: Chris@16: #endif // BOOST_TTI_DETAIL_MEM_DATA_HPP