annotate DEPENDENCIES/generic/include/boost/tti/detail/dmem_data.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
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@16 18 #include <boost/preprocessor/cat.hpp>
Chris@16 19 #include <boost/tti/detail/ddeftype.hpp>
Chris@16 20 #include <boost/tti/detail/dftclass.hpp>
Chris@16 21 #include <boost/tti/gen/namespace_gen.hpp>
Chris@16 22 #include <boost/type_traits/detail/yes_no_type.hpp>
Chris@16 23 #include <boost/type_traits/is_same.hpp>
Chris@16 24
Chris@16 25 #if defined(BOOST_MSVC) || (BOOST_WORKAROUND(BOOST_GCC, >= 40400) && BOOST_WORKAROUND(BOOST_GCC, < 40600))
Chris@16 26
Chris@16 27 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \
Chris@16 28 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_C> \
Chris@16 29 struct BOOST_PP_CAT(trait,_detail_hmd) \
Chris@16 30 { \
Chris@16 31 template<class> \
Chris@16 32 struct return_of; \
Chris@16 33 \
Chris@16 34 template<class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_IC> \
Chris@16 35 struct return_of<BOOST_TTI_DETAIL_TP_R BOOST_TTI_DETAIL_TP_IC::*> \
Chris@16 36 { \
Chris@16 37 typedef BOOST_TTI_DETAIL_TP_R type; \
Chris@16 38 }; \
Chris@16 39 \
Chris@16 40 template<bool,typename BOOST_TTI_DETAIL_TP_U> \
Chris@16 41 struct menable_if; \
Chris@16 42 \
Chris@16 43 template<typename BOOST_TTI_DETAIL_TP_U> \
Chris@16 44 struct menable_if<true,BOOST_TTI_DETAIL_TP_U> \
Chris@16 45 { \
Chris@16 46 typedef BOOST_TTI_DETAIL_TP_U type; \
Chris@16 47 }; \
Chris@16 48 \
Chris@16 49 template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
Chris@16 50 static ::boost::type_traits::yes_type check2(BOOST_TTI_DETAIL_TP_V BOOST_TTI_DETAIL_TP_U::*); \
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::no_type check2(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 typename \
Chris@16 57 menable_if \
Chris@16 58 < \
Chris@16 59 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 60 ::boost::type_traits::yes_type \
Chris@16 61 > \
Chris@16 62 ::type \
Chris@16 63 has_matching_member(int); \
Chris@16 64 \
Chris@16 65 template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
Chris@16 66 static ::boost::type_traits::no_type has_matching_member(...); \
Chris@16 67 \
Chris@16 68 template<class BOOST_TTI_DETAIL_TP_U,class BOOST_TTI_DETAIL_TP_V> \
Chris@16 69 struct ttc_md \
Chris@16 70 { \
Chris@16 71 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 72 }; \
Chris@16 73 \
Chris@16 74 typedef typename ttc_md<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_C>::type type; \
Chris@16 75 \
Chris@16 76 BOOST_STATIC_CONSTANT(bool,value=type::value); \
Chris@16 77 \
Chris@16 78 }; \
Chris@16 79 /**/
Chris@16 80
Chris@16 81 #else // !defined(BOOST_MSVC)
Chris@16 82
Chris@16 83 #include <boost/tti/detail/dmem_fun.hpp>
Chris@16 84
Chris@16 85 #define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \
Chris@16 86 BOOST_TTI_DETAIL_TRAIT_HAS_TYPES_MEMBER_FUNCTION(trait,name) \
Chris@16 87 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_C> \
Chris@16 88 struct BOOST_PP_CAT(trait,_detail_hmd) : \
Chris@16 89 BOOST_PP_CAT(trait,_detail_types)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_C> \
Chris@16 90 { \
Chris@16 91 }; \
Chris@16 92 /**/
Chris@16 93
Chris@16 94 #endif // defined(BOOST_MSVC)
Chris@16 95
Chris@16 96 namespace boost
Chris@16 97 {
Chris@16 98 namespace tti
Chris@16 99 {
Chris@16 100 namespace detail
Chris@16 101 {
Chris@16 102
Chris@16 103 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R>
Chris@16 104 struct ptmd
Chris@16 105 {
Chris@16 106 typedef BOOST_TTI_DETAIL_TP_R BOOST_TTI_DETAIL_TP_T::* type;
Chris@16 107 };
Chris@16 108
Chris@16 109 template<class BOOST_TTI_DETAIL_TP_T>
Chris@16 110 struct dmem_check_ptmd :
Chris@16 111 boost::mpl::identity<BOOST_TTI_DETAIL_TP_T>
Chris@16 112 {
Chris@16 113 BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer<BOOST_TTI_DETAIL_TP_T>));
Chris@16 114 };
Chris@16 115
Chris@16 116 template<class BOOST_TTI_DETAIL_TP_T>
Chris@16 117 struct dmem_check_ptec :
Chris@16 118 BOOST_TTI_NAMESPACE::detail::class_type<BOOST_TTI_DETAIL_TP_T>
Chris@16 119 {
Chris@16 120 BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer<BOOST_TTI_DETAIL_TP_T>));
Chris@16 121 };
Chris@16 122
Chris@16 123 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_T2>
Chris@16 124 struct dmem_get_type :
Chris@16 125 boost::mpl::eval_if
Chris@16 126 <
Chris@16 127 boost::is_same<BOOST_TTI_DETAIL_TP_T2,BOOST_TTI_NAMESPACE::detail::deftype>,
Chris@16 128 BOOST_TTI_NAMESPACE::detail::dmem_check_ptmd<BOOST_TTI_DETAIL_TP_T>,
Chris@16 129 BOOST_TTI_NAMESPACE::detail::ptmd<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_T2>
Chris@16 130 >
Chris@16 131 {
Chris@16 132 };
Chris@16 133
Chris@16 134 template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_T2>
Chris@16 135 struct dmem_get_enclosing :
Chris@16 136 boost::mpl::eval_if
Chris@16 137 <
Chris@16 138 boost::is_same<BOOST_TTI_DETAIL_TP_T2,BOOST_TTI_NAMESPACE::detail::deftype>,
Chris@16 139 BOOST_TTI_NAMESPACE::detail::dmem_check_ptec<BOOST_TTI_DETAIL_TP_T>,
Chris@16 140 boost::mpl::identity<BOOST_TTI_DETAIL_TP_T>
Chris@16 141 >
Chris@16 142 {
Chris@16 143 };
Chris@16 144
Chris@16 145 }
Chris@16 146 }
Chris@16 147 }
Chris@16 148
Chris@16 149 #endif // BOOST_TTI_DETAIL_MEM_DATA_HPP