annotate DEPENDENCIES/generic/include/boost/tti/detail/dtemplate_params.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_TEMPLATE_PARAMS_HPP)
Chris@16 8 #define BOOST_TTI_DETAIL_TEMPLATE_PARAMS_HPP
Chris@16 9
Chris@16 10 #include <boost/config.hpp>
Chris@16 11 #include <boost/mpl/bool.hpp>
Chris@16 12 #include <boost/mpl/has_xxx.hpp>
Chris@16 13 #include <boost/preprocessor/arithmetic/add.hpp>
Chris@16 14 #include <boost/preprocessor/arithmetic/sub.hpp>
Chris@16 15 #include <boost/preprocessor/array/elem.hpp>
Chris@16 16 #include <boost/preprocessor/cat.hpp>
Chris@16 17 #include <boost/preprocessor/punctuation/comma_if.hpp>
Chris@16 18 #include <boost/preprocessor/repetition/repeat.hpp>
Chris@16 19 #include <boost/preprocessor/repetition/enum.hpp>
Chris@16 20 #include <boost/preprocessor/array/enum.hpp>
Chris@16 21 #include <boost/preprocessor/array/size.hpp>
Chris@16 22
Chris@16 23 #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
Chris@16 24
Chris@16 25 #define BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS(z,n,args) \
Chris@16 26 BOOST_PP_ARRAY_ELEM(BOOST_PP_ADD(4,n),args) \
Chris@16 27 /**/
Chris@16 28
Chris@16 29 #define BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION(args,introspect_macro) \
Chris@16 30 template \
Chris@16 31 < \
Chris@16 32 typename BOOST_TTI_DETAIL_TP_T, \
Chris@16 33 typename BOOST_TTI_DETAIL_TP_FALLBACK_ \
Chris@16 34 = boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \
Chris@16 35 > \
Chris@16 36 class BOOST_PP_ARRAY_ELEM(0, args) \
Chris@16 37 { \
Chris@16 38 introspect_macro(args) \
Chris@16 39 public: \
Chris@16 40 static const bool value \
Chris@16 41 = BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< BOOST_TTI_DETAIL_TP_T >::value; \
Chris@16 42 typedef typename BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
Chris@16 43 < \
Chris@16 44 BOOST_TTI_DETAIL_TP_T \
Chris@16 45 >::type type; \
Chris@16 46 }; \
Chris@16 47 /**/
Chris@16 48
Chris@16 49 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
Chris@16 50
Chris@16 51 #define BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE(z,n,args) \
Chris@16 52 template \
Chris@16 53 < \
Chris@16 54 template \
Chris@16 55 < \
Chris@16 56 BOOST_PP_ENUM_ ## z \
Chris@16 57 ( \
Chris@16 58 BOOST_PP_SUB \
Chris@16 59 ( \
Chris@16 60 BOOST_PP_ARRAY_SIZE(args), \
Chris@16 61 4 \
Chris@16 62 ), \
Chris@16 63 BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS, \
Chris@16 64 args \
Chris@16 65 ) \
Chris@16 66 > \
Chris@16 67 class BOOST_TTI_DETAIL_TM_V \
Chris@16 68 > \
Chris@16 69 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
Chris@16 70 { \
Chris@16 71 }; \
Chris@16 72 /**/
Chris@16 73
Chris@16 74 #define BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE(args) \
Chris@16 75 BOOST_PP_REPEAT \
Chris@16 76 ( \
Chris@16 77 BOOST_PP_ARRAY_ELEM(2, args), \
Chris@16 78 BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE, \
Chris@16 79 args \
Chris@16 80 ) \
Chris@16 81 /**/
Chris@16 82
Chris@16 83 #define BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT(args) \
Chris@16 84 template< typename U > \
Chris@16 85 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
Chris@16 86 { \
Chris@16 87 BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE(args) \
Chris@16 88 BOOST_MPL_HAS_MEMBER_REJECT(args, BOOST_PP_NIL) \
Chris@16 89 BOOST_MPL_HAS_MEMBER_ACCEPT(args, BOOST_PP_NIL) \
Chris@16 90 BOOST_STATIC_CONSTANT \
Chris@16 91 ( \
Chris@16 92 bool, value = BOOST_MPL_HAS_MEMBER_TEST(args) \
Chris@16 93 ); \
Chris@16 94 typedef boost::mpl::bool_< value > type; \
Chris@16 95 }; \
Chris@16 96 /**/
Chris@16 97
Chris@16 98 #define BOOST_TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE(args) \
Chris@16 99 BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION \
Chris@16 100 ( \
Chris@16 101 args, \
Chris@16 102 BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT \
Chris@16 103 ) \
Chris@16 104 /**/
Chris@16 105
Chris@16 106 #else // !!BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
Chris@16 107
Chris@16 108 #define BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE(z,n,args) \
Chris@16 109 template \
Chris@16 110 < \
Chris@16 111 template \
Chris@16 112 < \
Chris@16 113 BOOST_PP_ENUM_ ## z \
Chris@16 114 ( \
Chris@16 115 BOOST_PP_SUB \
Chris@16 116 ( \
Chris@16 117 BOOST_PP_ARRAY_SIZE(args), \
Chris@16 118 4 \
Chris@16 119 ), \
Chris@16 120 BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS, \
Chris@16 121 args \
Chris@16 122 ) \
Chris@16 123 > \
Chris@16 124 class BOOST_TTI_DETAIL_TM_U \
Chris@16 125 > \
Chris@16 126 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE \
Chris@16 127 ( \
Chris@16 128 args, \
Chris@16 129 n \
Chris@16 130 ) \
Chris@16 131 { \
Chris@16 132 typedef \
Chris@16 133 BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \
Chris@16 134 type; \
Chris@16 135 }; \
Chris@16 136 /**/
Chris@16 137
Chris@16 138 #define BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE(args) \
Chris@16 139 typedef void \
Chris@16 140 BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \
Chris@16 141 BOOST_PP_REPEAT \
Chris@16 142 ( \
Chris@16 143 BOOST_PP_ARRAY_ELEM(2, args), \
Chris@16 144 BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE, \
Chris@16 145 args \
Chris@16 146 ) \
Chris@16 147 /**/
Chris@16 148
Chris@16 149 #define BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE(args) \
Chris@16 150 BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE(args,BOOST_PP_NIL) \
Chris@16 151 BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE(args,BOOST_PP_NIL) \
Chris@16 152 template< typename BOOST_TTI_DETAIL_TP_U > \
Chris@16 153 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
Chris@16 154 : BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< BOOST_TTI_DETAIL_TP_U > { \
Chris@16 155 }; \
Chris@16 156 /**/
Chris@16 157
Chris@16 158 #define BOOST_TTI_DETAIL_HAS_MEMBER_WITH_TEMPLATE_SFINAE(args) \
Chris@16 159 BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE \
Chris@16 160 ( \
Chris@16 161 args \
Chris@16 162 ) \
Chris@16 163 BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION \
Chris@16 164 ( \
Chris@16 165 args, \
Chris@16 166 BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE \
Chris@16 167 ) \
Chris@16 168 /**/
Chris@16 169
Chris@16 170 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
Chris@16 171
Chris@16 172 #else // defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
Chris@16 173
Chris@16 174 #define BOOST_TTI_DETAIL_SAME(trait,name) \
Chris@16 175 BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF \
Chris@16 176 ( \
Chris@16 177 trait, \
Chris@16 178 name, \
Chris@16 179 false \
Chris@16 180 ) \
Chris@16 181 /**/
Chris@16 182
Chris@16 183 #define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tp) \
Chris@16 184 BOOST_TTI_DETAIL_SAME(trait,name) \
Chris@16 185 /**/
Chris@16 186
Chris@16 187 #endif // !BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE
Chris@16 188
Chris@16 189 #define BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
Chris@16 190 BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(BOOST_PP_CAT(trait,_detail),name,tpArray) \
Chris@16 191 template<class BOOST_TTI_DETAIL_TP_T> \
Chris@16 192 struct trait : \
Chris@16 193 BOOST_PP_CAT(trait,_detail)<BOOST_TTI_DETAIL_TP_T> \
Chris@16 194 { \
Chris@16 195 }; \
Chris@16 196 /**/
Chris@16 197
Chris@16 198 #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
Chris@16 199 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
Chris@16 200
Chris@16 201 #define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
Chris@16 202 BOOST_TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE \
Chris@16 203 ( \
Chris@16 204 ( BOOST_PP_ADD(BOOST_PP_ARRAY_SIZE(tpArray),4), ( trait, name, 1, false, BOOST_PP_ARRAY_ENUM(tpArray) ) ) \
Chris@16 205 ) \
Chris@16 206 /**/
Chris@16 207
Chris@16 208 #else // BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
Chris@16 209
Chris@16 210 #define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
Chris@16 211 BOOST_TTI_DETAIL_HAS_MEMBER_WITH_TEMPLATE_SFINAE \
Chris@16 212 ( \
Chris@16 213 ( BOOST_PP_ADD(BOOST_PP_ARRAY_SIZE(tpArray),4), ( trait, name, 1, false, BOOST_PP_ARRAY_ENUM(tpArray) ) ) \
Chris@16 214 ) \
Chris@16 215 /**/
Chris@16 216
Chris@16 217 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
Chris@16 218 #endif // !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
Chris@16 219
Chris@16 220 #endif // BOOST_TTI_DETAIL_TEMPLATE_PARAMS_HPP