annotate DEPENDENCIES/generic/include/boost/fusion/adapted/adt/detail/adapt_base.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 /*=============================================================================
Chris@16 2 Copyright (c) 2001-2009 Joel de Guzman
Chris@16 3 Copyright (c) 2005-2006 Dan Marsden
Chris@16 4 Copyright (c) 2010 Christopher Schmidt
Chris@16 5
Chris@16 6 Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 ==============================================================================*/
Chris@16 9
Chris@16 10 #ifndef BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
Chris@16 11 #define BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
Chris@16 12
Chris@101 13 #include <boost/fusion/support/config.hpp>
Chris@101 14 #include <boost/fusion/adapted/struct/detail/adapt_auto.hpp>
Chris@101 15 #include <boost/fusion/adapted/struct/detail/adapt_is_tpl.hpp>
Chris@101 16
Chris@16 17 #include <boost/preprocessor/control/if.hpp>
Chris@16 18 #include <boost/preprocessor/seq/seq.hpp>
Chris@16 19 #include <boost/preprocessor/seq/elem.hpp>
Chris@16 20 #include <boost/mpl/if.hpp>
Chris@16 21 #include <boost/type_traits/is_const.hpp>
Chris@101 22 #include <boost/type_traits/add_const.hpp>
Chris@101 23 #include <boost/type_traits/remove_const.hpp>
Chris@101 24
Chris@101 25 #include <boost/typeof/typeof.hpp>
Chris@16 26
Chris@16 27 #define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL(TEMPLATE_PARAMS_SEQ) \
Chris@16 28 typename detail::get_identity< \
Chris@16 29 lvalue \
Chris@16 30 , BOOST_PP_SEQ_ELEM(1,TEMPLATE_PARAMS_SEQ) \
Chris@16 31 >::type
Chris@16 32
Chris@16 33 #define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_NON_TEMPLATE_IMPL( \
Chris@16 34 TEMPLATE_PARAMS_SEQ) \
Chris@16 35 \
Chris@16 36 boost::remove_const<boost::remove_reference<lvalue>::type>::type
Chris@16 37
Chris@101 38 #define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
Chris@101 39 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
Chris@101 40 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
Chris@101 41 BOOST_PP_IF(DEDUCE_TYPE, 0, 2), ATTRIBUTE)
Chris@101 42
Chris@101 43 #define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
Chris@101 44 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
Chris@101 45 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
Chris@101 46 BOOST_PP_IF(DEDUCE_TYPE, 1, 3), ATTRIBUTE)
Chris@101 47
Chris@101 48 #ifdef BOOST_MSVC
Chris@101 49 # define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
Chris@101 50 ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
Chris@101 51 \
Chris@101 52 BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
Chris@101 53 TEMPLATE_PARAMS_SEQ) \
Chris@101 54 \
Chris@101 55 struct deduced_attr_type { \
Chris@101 56 static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
Chris@101 57 typedef \
Chris@101 58 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
Chris@101 59 BOOST_TYPEOF( PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
Chris@101 60 ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \
Chris@101 61 };
Chris@101 62
Chris@101 63 #else
Chris@101 64 # define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
Chris@101 65 ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
Chris@101 66 struct deduced_attr_type { \
Chris@101 67 static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
Chris@101 68 typedef BOOST_TYPEOF( PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
Chris@101 69 ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \
Chris@101 70 };
Chris@101 71
Chris@101 72 #endif
Chris@101 73
Chris@101 74 #define BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF( \
Chris@101 75 NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
Chris@101 76 \
Chris@101 77 BOOST_FUSION_DEDUCED_ATTR_TYPE( \
Chris@101 78 NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
Chris@101 79 \
Chris@101 80 typedef \
Chris@101 81 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
Chris@101 82 boost::remove_const< \
Chris@101 83 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
Chris@101 84 deduced_attr_type::type \
Chris@101 85 >::type type; \
Chris@101 86 \
Chris@101 87 typedef \
Chris@101 88 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
Chris@101 89 boost::add_const< \
Chris@101 90 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
Chris@101 91 deduced_attr_type::type \
Chris@101 92 >::type const_type;
Chris@101 93
Chris@101 94 #define BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE( \
Chris@101 95 NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
Chris@101 96 \
Chris@101 97 typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) type; \
Chris@101 98 typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE) const_type;
Chris@101 99
Chris@101 100
Chris@16 101 #define BOOST_FUSION_ADAPT_ADT_C_BASE( \
Chris@101 102 TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,PREFIX, \
Chris@101 103 ATTRIBUTE,ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
Chris@16 104 \
Chris@16 105 template< \
Chris@16 106 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
Chris@16 107 > \
Chris@16 108 struct access::adt_attribute_access< \
Chris@16 109 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 110 , I \
Chris@16 111 > \
Chris@16 112 { \
Chris@101 113 \
Chris@101 114 BOOST_PP_IF(DEDUCE_TYPE, \
Chris@101 115 BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF, \
Chris@101 116 BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE)( \
Chris@101 117 NAME_SEQ, \
Chris@101 118 ATTRIBUTE, \
Chris@101 119 ATTRIBUTE_TUPEL_SIZE, \
Chris@101 120 PREFIX, \
Chris@101 121 TEMPLATE_PARAMS_SEQ) \
Chris@101 122 \
Chris@16 123 template<class Val> \
Chris@101 124 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
Chris@16 125 static void \
Chris@16 126 boost_fusion_adapt_adt_impl_set( \
Chris@16 127 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj, \
Chris@16 128 Val const& val) \
Chris@16 129 { \
Chris@101 130 PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
Chris@101 131 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
Chris@16 132 } \
Chris@16 133 \
Chris@101 134 BOOST_FUSION_GPU_ENABLED \
Chris@101 135 static type \
Chris@16 136 boost_fusion_adapt_adt_impl_get( \
Chris@16 137 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj) \
Chris@16 138 { \
Chris@101 139 return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
Chris@101 140 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
Chris@16 141 } \
Chris@16 142 \
Chris@101 143 BOOST_FUSION_GPU_ENABLED \
Chris@101 144 static const_type \
Chris@16 145 boost_fusion_adapt_adt_impl_get( \
Chris@16 146 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj) \
Chris@16 147 { \
Chris@101 148 return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
Chris@101 149 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
Chris@16 150 } \
Chris@16 151 }; \
Chris@16 152 \
Chris@16 153 template< \
Chris@16 154 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
Chris@16 155 > \
Chris@16 156 struct adt_attribute_proxy< \
Chris@16 157 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 158 , I \
Chris@16 159 , true \
Chris@16 160 > \
Chris@16 161 { \
Chris@101 162 typedef \
Chris@101 163 BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
Chris@101 164 access::adt_attribute_access< \
Chris@101 165 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@101 166 , I \
Chris@101 167 >::const_type type; \
Chris@16 168 \
Chris@101 169 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
Chris@16 170 explicit \
Chris@16 171 adt_attribute_proxy( \
Chris@16 172 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& o) \
Chris@16 173 : obj(&o) \
Chris@16 174 {} \
Chris@16 175 \
Chris@101 176 BOOST_FUSION_GPU_ENABLED \
Chris@16 177 type get() const \
Chris@16 178 { \
Chris@16 179 return access::adt_attribute_access< \
Chris@16 180 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 181 , I \
Chris@16 182 >::boost_fusion_adapt_adt_impl_get(*obj); \
Chris@16 183 } \
Chris@16 184 \
Chris@101 185 BOOST_FUSION_GPU_ENABLED \
Chris@16 186 operator type() const \
Chris@16 187 { \
Chris@16 188 return get(); \
Chris@16 189 } \
Chris@16 190 \
Chris@16 191 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const* obj; \
Chris@16 192 }; \
Chris@16 193 \
Chris@16 194 template< \
Chris@16 195 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
Chris@16 196 > \
Chris@16 197 struct adt_attribute_proxy< \
Chris@16 198 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 199 , I \
Chris@16 200 , false \
Chris@16 201 > \
Chris@16 202 { \
Chris@101 203 typedef \
Chris@101 204 BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
Chris@101 205 access::adt_attribute_access< \
Chris@101 206 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@101 207 , I \
Chris@101 208 >::type type; \
Chris@16 209 \
Chris@101 210 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
Chris@16 211 explicit \
Chris@16 212 adt_attribute_proxy( \
Chris@16 213 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& o) \
Chris@16 214 : obj(&o) \
Chris@16 215 {} \
Chris@16 216 \
Chris@16 217 template<class Val> \
Chris@101 218 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
Chris@16 219 adt_attribute_proxy& \
Chris@16 220 operator=(Val const& val) \
Chris@16 221 { \
Chris@16 222 access::adt_attribute_access< \
Chris@16 223 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 224 , I \
Chris@16 225 >::boost_fusion_adapt_adt_impl_set(*obj, val); \
Chris@16 226 return *this; \
Chris@16 227 } \
Chris@16 228 \
Chris@101 229 BOOST_FUSION_GPU_ENABLED \
Chris@16 230 type get() const \
Chris@16 231 { \
Chris@16 232 return access::adt_attribute_access< \
Chris@16 233 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 234 , I \
Chris@16 235 >::boost_fusion_adapt_adt_impl_get(*obj); \
Chris@16 236 } \
Chris@16 237 \
Chris@101 238 BOOST_FUSION_GPU_ENABLED \
Chris@16 239 operator type() const \
Chris@16 240 { \
Chris@16 241 return get(); \
Chris@16 242 } \
Chris@16 243 \
Chris@16 244 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)* obj; \
Chris@16 245 }; \
Chris@16 246 \
Chris@16 247 template< \
Chris@16 248 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
Chris@16 249 > \
Chris@16 250 struct access::struct_member< \
Chris@16 251 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 252 , I \
Chris@16 253 > \
Chris@16 254 { \
Chris@101 255 typedef BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
Chris@101 256 adt_attribute_proxy< \
Chris@101 257 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@101 258 , I \
Chris@101 259 , false \
Chris@101 260 >::type lvalue; \
Chris@101 261 \
Chris@16 262 BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
Chris@16 263 TEMPLATE_PARAMS_SEQ) \
Chris@16 264 \
Chris@16 265 typedef \
Chris@16 266 BOOST_PP_IF( \
Chris@16 267 BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), \
Chris@16 268 BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL, \
Chris@16 269 BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_NON_TEMPLATE_IMPL)( \
Chris@16 270 TEMPLATE_PARAMS_SEQ) \
Chris@16 271 type; \
Chris@16 272 \
Chris@16 273 template<typename Seq> \
Chris@16 274 struct apply \
Chris@16 275 { \
Chris@16 276 typedef \
Chris@16 277 adt_attribute_proxy< \
Chris@16 278 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
Chris@16 279 , I \
Chris@16 280 , is_const<Seq>::value \
Chris@16 281 > \
Chris@16 282 type; \
Chris@16 283 \
Chris@101 284 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
Chris@16 285 static type \
Chris@16 286 call(Seq& obj) \
Chris@16 287 { \
Chris@16 288 return type(obj); \
Chris@16 289 } \
Chris@16 290 }; \
Chris@16 291 };
Chris@16 292
Chris@16 293 #endif