annotate DEPENDENCIES/generic/include/boost/tti/detail/dmem_data.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1
Chris@16 2 // (C) Copyright Edward Diener 2011,2012,2013
Chris@16 3 // Use, modification and distribution are subject to the Boost Software License,
Chris@16 4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 5 // http://www.boost.org/LICENSE_1_0.txt).
Chris@16 6
Chris@16 7 #if !defined(BOOST_TTI_DETAIL_MEM_DATA_HPP)
Chris@16 8 #define BOOST_TTI_DETAIL_MEM_DATA_HPP
Chris@16 9
Chris@16 10 #include <boost/config.hpp>
Chris@16 11 #include <boost/detail/workaround.hpp>
Chris@16 12 #include <boost/function_types/components.hpp>
Chris@16 13 #include <boost/function_types/is_member_object_pointer.hpp>
Chris@16 14 #include <boost/mpl/assert.hpp>
Chris@16 15 #include <boost/mpl/bool.hpp>
Chris@16 16 #include <boost/mpl/eval_if.hpp>
Chris@16 17 #include <boost/mpl/identity.hpp>
Chris@101 18 #include <boost/mpl/or.hpp>
Chris@16 19 #include <boost/preprocessor/cat.hpp>
Chris@16 20 #include <boost/tti/detail/ddeftype.hpp>
Chris@16 21 #include <boost/tti/detail/dftclass.hpp>
Chris@16 22 #include <boost/tti/gen/namespace_gen.hpp>
Chris@16 23 #include <boost/type_traits/detail/yes_no_type.hpp>
Chris@101 24 #include <boost/type_traits/is_class.hpp>
Chris@16 25 #include <boost/type_traits/is_same.hpp>
Chris@101 26 #include <boost/type_traits/remove_const.hpp>
Chris@16 27
Chris@16 28 #if defined(BOOST_MSVC) || (BOOST_WORKAROUND(BOOST_GCC, >= 40400) && BOOST_WORKAROUND(BOOST_GCC, < 40600))
Chris@16 29
Chris@101 30 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \
Chris@16 31 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_C> \
Chris@101 32 struct BOOST_PP_CAT(trait,_detail_hmd_op) \
Chris@16 33 { \
Chris@16 34 template<class> \
Chris@16 35 struct return_of; \
Chris@16 36 \
Chris@16 37 template<class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_IC> \
Chris@16 38 struct return_of<BOOST_TTI_DETAIL_TP_R BOOST_TTI_DETAIL_TP_IC::*> \
Chris@16 39 { \
Chris@16 40 typedef BOOST_TTI_DETAIL_TP_R type; \
Chris@16 41 }; \
Chris@16 42 \
Chris@16 43 template<bool,typename BOOST_TTI_DETAIL_TP_U> \
Chris@16 44 struct menable_if; \
Chris@16 45 \
Chris@16 46 template<typename BOOST_TTI_DETAIL_TP_U> \
Chris@16 47 struct menable_if<true,BOOST_TTI_DETAIL_TP_U> \
Chris@16 48 { \
Chris@16 49 typedef BOOST_TTI_DETAIL_TP_U type; \
Chris@16 50 }; \
Chris@16 51 \
Chris@16 52 template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
Chris@16 53 static ::boost::type_traits::yes_type check2(BOOST_TTI_DETAIL_TP_V BOOST_TTI_DETAIL_TP_U::*); \
Chris@16 54 \
Chris@16 55 template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
Chris@16 56 static ::boost::type_traits::no_type check2(BOOST_TTI_DETAIL_TP_U); \
Chris@16 57 \
Chris@16 58 template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
Chris@16 59 static typename \
Chris@16 60 menable_if \
Chris@16 61 < \
Chris@16 62 sizeof(check2<BOOST_TTI_DETAIL_TP_U,BOOST_TTI_DETAIL_TP_V>(&BOOST_TTI_DETAIL_TP_U::name))==sizeof(::boost::type_traits::yes_type), \
Chris@16 63 ::boost::type_traits::yes_type \
Chris@16 64 > \
Chris@16 65 ::type \
Chris@16 66 has_matching_member(int); \
Chris@16 67 \
Chris@16 68 template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
Chris@16 69 static ::boost::type_traits::no_type has_matching_member(...); \
Chris@16 70 \
Chris@16 71 template<class BOOST_TTI_DETAIL_TP_U,class BOOST_TTI_DETAIL_TP_V> \
Chris@16 72 struct ttc_md \
Chris@16 73 { \
Chris@16 74 typedef boost::mpl::bool_<sizeof(has_matching_member<BOOST_TTI_DETAIL_TP_V,typename return_of<BOOST_TTI_DETAIL_TP_U>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
Chris@16 75 }; \
Chris@16 76 \
Chris@16 77 typedef typename ttc_md<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_C>::type type; \
Chris@16 78 \
Chris@16 79 }; \
Chris@16 80 /**/
Chris@16 81
Chris@16 82 #else // !defined(BOOST_MSVC)
Chris@16 83
Chris@16 84 #include <boost/tti/detail/dmem_fun.hpp>
Chris@16 85
Chris@101 86 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \
Chris@16 87 BOOST_TTI_DETAIL_TRAIT_HAS_TYPES_MEMBER_FUNCTION(trait,name) \
Chris@16 88 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_C> \
Chris@101 89 struct BOOST_PP_CAT(trait,_detail_hmd_op) : \
Chris@16 90 BOOST_PP_CAT(trait,_detail_types)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_C> \
Chris@16 91 { \
Chris@16 92 }; \
Chris@16 93 /**/
Chris@16 94
Chris@16 95 #endif // defined(BOOST_MSVC)
Chris@16 96
Chris@101 97 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_ENCLOSING_CLASS(trait) \
Chris@101 98 template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
Chris@101 99 struct BOOST_PP_CAT(trait,_detail_hmd_invoke_enclosing_class) : \
Chris@101 100 BOOST_PP_CAT(trait,_detail_hmd_op) \
Chris@101 101 < \
Chris@101 102 typename BOOST_TTI_NAMESPACE::detail::ptmd<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_TYPE>::type, \
Chris@101 103 typename boost::remove_const<BOOST_TTI_DETAIL_TP_ET>::type \
Chris@101 104 > \
Chris@101 105 { \
Chris@101 106 }; \
Chris@101 107 /**/
Chris@101 108
Chris@101 109 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_PT_MEMBER(trait) \
Chris@101 110 template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
Chris@101 111 struct BOOST_PP_CAT(trait,_detail_hmd_invoke_pt_member) : \
Chris@101 112 BOOST_PP_CAT(trait,_detail_hmd_op) \
Chris@101 113 < \
Chris@101 114 typename BOOST_TTI_NAMESPACE::detail::dmem_get_type<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_TYPE>::type, \
Chris@101 115 typename boost::remove_const \
Chris@101 116 < \
Chris@101 117 typename BOOST_TTI_NAMESPACE::detail::dmem_get_enclosing<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_TYPE>::type \
Chris@101 118 >::type \
Chris@101 119 > \
Chris@101 120 { \
Chris@101 121 }; \
Chris@101 122 /**/
Chris@101 123
Chris@101 124 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_WITH_ENCLOSING_CLASS(trait) \
Chris@101 125 BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_ENCLOSING_CLASS(trait) \
Chris@101 126 template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
Chris@101 127 struct BOOST_PP_CAT(trait,_detail_hmd_with_enclosing_class) : \
Chris@101 128 boost::mpl::eval_if \
Chris@101 129 < \
Chris@101 130 boost::is_class<BOOST_TTI_DETAIL_TP_ET>, \
Chris@101 131 BOOST_PP_CAT(trait,_detail_hmd_invoke_enclosing_class) \
Chris@101 132 < \
Chris@101 133 BOOST_TTI_DETAIL_TP_ET, \
Chris@101 134 BOOST_TTI_DETAIL_TP_TYPE \
Chris@101 135 >, \
Chris@101 136 boost::mpl::false_ \
Chris@101 137 > \
Chris@101 138 { \
Chris@101 139 }; \
Chris@101 140 /**/
Chris@101 141
Chris@101 142 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \
Chris@101 143 BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \
Chris@101 144 BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_WITH_ENCLOSING_CLASS(trait) \
Chris@101 145 BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_PT_MEMBER(trait) \
Chris@101 146 template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
Chris@101 147 struct BOOST_PP_CAT(trait,_detail_hmd) : \
Chris@101 148 boost::mpl::eval_if \
Chris@101 149 < \
Chris@101 150 boost::is_same<BOOST_TTI_DETAIL_TP_TYPE,BOOST_TTI_NAMESPACE::detail::deftype>, \
Chris@101 151 BOOST_PP_CAT(trait,_detail_hmd_invoke_pt_member) \
Chris@101 152 < \
Chris@101 153 BOOST_TTI_DETAIL_TP_ET, \
Chris@101 154 BOOST_TTI_DETAIL_TP_TYPE \
Chris@101 155 >, \
Chris@101 156 BOOST_PP_CAT(trait,_detail_hmd_with_enclosing_class) \
Chris@101 157 < \
Chris@101 158 BOOST_TTI_DETAIL_TP_ET, \
Chris@101 159 BOOST_TTI_DETAIL_TP_TYPE \
Chris@101 160 > \
Chris@101 161 > \
Chris@101 162 { \
Chris@101 163 }; \
Chris@101 164 /**/
Chris@101 165
Chris@16 166 namespace boost
Chris@16 167 {
Chris@16 168 namespace tti
Chris@16 169 {
Chris@16 170 namespace detail
Chris@16 171 {
Chris@16 172
Chris@16 173 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R>
Chris@16 174 struct ptmd
Chris@16 175 {
Chris@16 176 typedef BOOST_TTI_DETAIL_TP_R BOOST_TTI_DETAIL_TP_T::* type;
Chris@16 177 };
Chris@16 178
Chris@16 179 template<class BOOST_TTI_DETAIL_TP_T>
Chris@16 180 struct dmem_check_ptmd :
Chris@16 181 boost::mpl::identity<BOOST_TTI_DETAIL_TP_T>
Chris@16 182 {
Chris@16 183 BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer<BOOST_TTI_DETAIL_TP_T>));
Chris@16 184 };
Chris@16 185
Chris@16 186 template<class BOOST_TTI_DETAIL_TP_T>
Chris@16 187 struct dmem_check_ptec :
Chris@16 188 BOOST_TTI_NAMESPACE::detail::class_type<BOOST_TTI_DETAIL_TP_T>
Chris@16 189 {
Chris@16 190 BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer<BOOST_TTI_DETAIL_TP_T>));
Chris@16 191 };
Chris@16 192
Chris@16 193 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_T2>
Chris@16 194 struct dmem_get_type :
Chris@16 195 boost::mpl::eval_if
Chris@16 196 <
Chris@16 197 boost::is_same<BOOST_TTI_DETAIL_TP_T2,BOOST_TTI_NAMESPACE::detail::deftype>,
Chris@16 198 BOOST_TTI_NAMESPACE::detail::dmem_check_ptmd<BOOST_TTI_DETAIL_TP_T>,
Chris@16 199 BOOST_TTI_NAMESPACE::detail::ptmd<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_T2>
Chris@16 200 >
Chris@16 201 {
Chris@16 202 };
Chris@16 203
Chris@16 204 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_T2>
Chris@16 205 struct dmem_get_enclosing :
Chris@16 206 boost::mpl::eval_if
Chris@16 207 <
Chris@16 208 boost::is_same<BOOST_TTI_DETAIL_TP_T2,BOOST_TTI_NAMESPACE::detail::deftype>,
Chris@16 209 BOOST_TTI_NAMESPACE::detail::dmem_check_ptec<BOOST_TTI_DETAIL_TP_T>,
Chris@16 210 boost::mpl::identity<BOOST_TTI_DETAIL_TP_T>
Chris@16 211 >
Chris@16 212 {
Chris@16 213 };
Chris@16 214
Chris@16 215 }
Chris@16 216 }
Chris@16 217 }
Chris@16 218
Chris@16 219 #endif // BOOST_TTI_DETAIL_MEM_DATA_HPP