annotate DEPENDENCIES/generic/include/boost/proto/context/default.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 ///////////////////////////////////////////////////////////////////////////////
Chris@16 2 /// \file default.hpp
Chris@16 3 /// Definintion of default_context, a default evaluation context for
Chris@16 4 /// proto::eval() that uses Boost.Typeof to deduce return types
Chris@16 5 /// of the built-in operators.
Chris@16 6 //
Chris@16 7 // Copyright 2008 Eric Niebler. Distributed under the Boost
Chris@16 8 // Software License, Version 1.0. (See accompanying file
Chris@16 9 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11 #ifndef BOOST_PROTO_CONTEXT_DEFAULT_HPP_EAN_01_08_2007
Chris@16 12 #define BOOST_PROTO_CONTEXT_DEFAULT_HPP_EAN_01_08_2007
Chris@16 13
Chris@16 14 #include <boost/config.hpp>
Chris@16 15 #include <boost/preprocessor/arithmetic/add.hpp>
Chris@16 16 #include <boost/preprocessor/arithmetic/sub.hpp>
Chris@16 17 #include <boost/preprocessor/iteration/iterate.hpp>
Chris@16 18 #include <boost/preprocessor/repetition/enum.hpp>
Chris@16 19 #include <boost/preprocessor/repetition/enum_shifted.hpp>
Chris@16 20 #include <boost/utility/result_of.hpp>
Chris@16 21 #include <boost/type_traits/is_const.hpp>
Chris@16 22 #include <boost/type_traits/is_function.hpp>
Chris@16 23 #include <boost/type_traits/remove_reference.hpp>
Chris@16 24 #include <boost/type_traits/is_member_pointer.hpp>
Chris@16 25 #include <boost/type_traits/is_member_object_pointer.hpp>
Chris@16 26 #include <boost/type_traits/is_member_function_pointer.hpp>
Chris@16 27 #include <boost/proto/proto_fwd.hpp>
Chris@16 28 #include <boost/proto/tags.hpp>
Chris@16 29 #include <boost/proto/eval.hpp>
Chris@16 30 #include <boost/proto/traits.hpp> // for proto::child_c()
Chris@16 31 #include <boost/proto/detail/decltype.hpp>
Chris@16 32
Chris@16 33 namespace boost { namespace proto
Chris@16 34 {
Chris@16 35 /// INTERNAL ONLY
Chris@16 36 ///
Chris@16 37 #define UNREF(x) typename boost::remove_reference<x>::type
Chris@16 38
Chris@16 39 namespace context
Chris@16 40 {
Chris@16 41 template<
Chris@16 42 typename Expr
Chris@16 43 , typename Context
Chris@16 44 , typename Tag // = typename Expr::proto_tag
Chris@16 45 , long Arity // = Expr::proto_arity_c
Chris@16 46 >
Chris@16 47 struct default_eval
Chris@16 48 {};
Chris@16 49
Chris@16 50 template<typename Expr, typename Context>
Chris@16 51 struct default_eval<Expr, Context, tag::terminal, 0>
Chris@16 52 {
Chris@16 53 typedef
Chris@16 54 typename proto::result_of::value<Expr &>::type
Chris@16 55 result_type;
Chris@16 56
Chris@16 57 result_type operator ()(Expr &expr, Context &) const
Chris@16 58 {
Chris@16 59 return proto::value(expr);
Chris@16 60 }
Chris@16 61 };
Chris@16 62
Chris@16 63 /// INTERNAL ONLY
Chris@16 64 ///
Chris@16 65 #define BOOST_PROTO_UNARY_DEFAULT_EVAL(OP, TAG, MAKE) \
Chris@16 66 template<typename Expr, typename Context> \
Chris@16 67 struct default_eval<Expr, Context, TAG, 1> \
Chris@16 68 { \
Chris@16 69 private: \
Chris@16 70 typedef typename proto::result_of::child_c<Expr, 0>::type e0; \
Chris@16 71 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0; \
Chris@16 72 public: \
Chris@16 73 BOOST_PROTO_DECLTYPE_(OP proto::detail::MAKE<r0>(), result_type) \
Chris@16 74 result_type operator ()(Expr &expr, Context &ctx) const \
Chris@16 75 { \
Chris@16 76 return OP proto::eval(proto::child_c<0>(expr), ctx); \
Chris@16 77 } \
Chris@16 78 }; \
Chris@16 79 /**/
Chris@16 80
Chris@16 81 /// INTERNAL ONLY
Chris@16 82 ///
Chris@16 83 #define BOOST_PROTO_BINARY_DEFAULT_EVAL(OP, TAG, LMAKE, RMAKE) \
Chris@16 84 template<typename Expr, typename Context> \
Chris@16 85 struct default_eval<Expr, Context, TAG, 2> \
Chris@16 86 { \
Chris@16 87 private: \
Chris@16 88 typedef typename proto::result_of::child_c<Expr, 0>::type e0; \
Chris@16 89 typedef typename proto::result_of::child_c<Expr, 1>::type e1; \
Chris@16 90 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0; \
Chris@16 91 typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1; \
Chris@16 92 public: \
Chris@16 93 BOOST_PROTO_DECLTYPE_( \
Chris@16 94 proto::detail::LMAKE<r0>() OP proto::detail::RMAKE<r1>() \
Chris@16 95 , result_type \
Chris@16 96 ) \
Chris@16 97 result_type operator ()(Expr &expr, Context &ctx) const \
Chris@16 98 { \
Chris@16 99 return proto::eval( \
Chris@16 100 proto::child_c<0>(expr), ctx) OP proto::eval(proto::child_c<1>(expr) \
Chris@16 101 , ctx \
Chris@16 102 ); \
Chris@16 103 } \
Chris@16 104 }; \
Chris@16 105 /**/
Chris@16 106
Chris@16 107 BOOST_PROTO_UNARY_DEFAULT_EVAL(+, proto::tag::unary_plus, make)
Chris@16 108 BOOST_PROTO_UNARY_DEFAULT_EVAL(-, proto::tag::negate, make)
Chris@16 109 BOOST_PROTO_UNARY_DEFAULT_EVAL(*, proto::tag::dereference, make)
Chris@16 110 BOOST_PROTO_UNARY_DEFAULT_EVAL(~, proto::tag::complement, make)
Chris@16 111 BOOST_PROTO_UNARY_DEFAULT_EVAL(&, proto::tag::address_of, make)
Chris@16 112 BOOST_PROTO_UNARY_DEFAULT_EVAL(!, proto::tag::logical_not, make)
Chris@16 113 BOOST_PROTO_UNARY_DEFAULT_EVAL(++, proto::tag::pre_inc, make_mutable)
Chris@16 114 BOOST_PROTO_UNARY_DEFAULT_EVAL(--, proto::tag::pre_dec, make_mutable)
Chris@16 115
Chris@16 116 BOOST_PROTO_BINARY_DEFAULT_EVAL(<<, proto::tag::shift_left, make_mutable, make)
Chris@16 117 BOOST_PROTO_BINARY_DEFAULT_EVAL(>>, proto::tag::shift_right, make_mutable, make)
Chris@16 118 BOOST_PROTO_BINARY_DEFAULT_EVAL(*, proto::tag::multiplies, make, make)
Chris@16 119 BOOST_PROTO_BINARY_DEFAULT_EVAL(/, proto::tag::divides, make, make)
Chris@16 120 BOOST_PROTO_BINARY_DEFAULT_EVAL(%, proto::tag::modulus, make, make)
Chris@16 121 BOOST_PROTO_BINARY_DEFAULT_EVAL(+, proto::tag::plus, make, make)
Chris@16 122 BOOST_PROTO_BINARY_DEFAULT_EVAL(-, proto::tag::minus, make, make)
Chris@16 123 BOOST_PROTO_BINARY_DEFAULT_EVAL(<, proto::tag::less, make, make)
Chris@16 124 BOOST_PROTO_BINARY_DEFAULT_EVAL(>, proto::tag::greater, make, make)
Chris@16 125 BOOST_PROTO_BINARY_DEFAULT_EVAL(<=, proto::tag::less_equal, make, make)
Chris@16 126 BOOST_PROTO_BINARY_DEFAULT_EVAL(>=, proto::tag::greater_equal, make, make)
Chris@16 127 BOOST_PROTO_BINARY_DEFAULT_EVAL(==, proto::tag::equal_to, make, make)
Chris@16 128 BOOST_PROTO_BINARY_DEFAULT_EVAL(!=, proto::tag::not_equal_to, make, make)
Chris@16 129 BOOST_PROTO_BINARY_DEFAULT_EVAL(||, proto::tag::logical_or, make, make)
Chris@16 130 BOOST_PROTO_BINARY_DEFAULT_EVAL(&&, proto::tag::logical_and, make, make)
Chris@16 131 BOOST_PROTO_BINARY_DEFAULT_EVAL(&, proto::tag::bitwise_and, make, make)
Chris@16 132 BOOST_PROTO_BINARY_DEFAULT_EVAL(|, proto::tag::bitwise_or, make, make)
Chris@16 133 BOOST_PROTO_BINARY_DEFAULT_EVAL(^, proto::tag::bitwise_xor, make, make)
Chris@16 134
Chris@16 135 BOOST_PROTO_BINARY_DEFAULT_EVAL(=, proto::tag::assign, make_mutable, make)
Chris@16 136 BOOST_PROTO_BINARY_DEFAULT_EVAL(<<=, proto::tag::shift_left_assign, make_mutable, make)
Chris@16 137 BOOST_PROTO_BINARY_DEFAULT_EVAL(>>=, proto::tag::shift_right_assign, make_mutable, make)
Chris@16 138 BOOST_PROTO_BINARY_DEFAULT_EVAL(*=, proto::tag::multiplies_assign, make_mutable, make)
Chris@16 139 BOOST_PROTO_BINARY_DEFAULT_EVAL(/=, proto::tag::divides_assign, make_mutable, make)
Chris@16 140 BOOST_PROTO_BINARY_DEFAULT_EVAL(%=, proto::tag::modulus_assign, make_mutable, make)
Chris@16 141 BOOST_PROTO_BINARY_DEFAULT_EVAL(+=, proto::tag::plus_assign, make_mutable, make)
Chris@16 142 BOOST_PROTO_BINARY_DEFAULT_EVAL(-=, proto::tag::minus_assign, make_mutable, make)
Chris@16 143 BOOST_PROTO_BINARY_DEFAULT_EVAL(&=, proto::tag::bitwise_and_assign, make_mutable, make)
Chris@16 144 BOOST_PROTO_BINARY_DEFAULT_EVAL(|=, proto::tag::bitwise_or_assign, make_mutable, make)
Chris@16 145 BOOST_PROTO_BINARY_DEFAULT_EVAL(^=, proto::tag::bitwise_xor_assign, make_mutable, make)
Chris@16 146
Chris@16 147 #undef BOOST_PROTO_UNARY_DEFAULT_EVAL
Chris@16 148 #undef BOOST_PROTO_BINARY_DEFAULT_EVAL
Chris@16 149
Chris@16 150 /// INTERNAL ONLY
Chris@16 151 template<typename Expr, typename Context>
Chris@16 152 struct is_member_function_eval
Chris@16 153 : is_member_function_pointer<
Chris@16 154 typename detail::uncvref<
Chris@16 155 typename proto::result_of::eval<
Chris@16 156 typename remove_reference<
Chris@16 157 typename proto::result_of::child_c<Expr, 1>::type
Chris@16 158 >::type
Chris@16 159 , Context
Chris@16 160 >::type
Chris@16 161 >::type
Chris@16 162 >
Chris@16 163 {};
Chris@16 164
Chris@16 165 /// INTERNAL ONLY
Chris@16 166 template<typename Expr, typename Context, bool IsMemFunCall>
Chris@16 167 struct memfun_eval
Chris@16 168 {
Chris@16 169 private:
Chris@16 170 typedef typename result_of::child_c<Expr, 0>::type e0;
Chris@16 171 typedef typename result_of::child_c<Expr, 1>::type e1;
Chris@16 172 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;
Chris@16 173 typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;
Chris@16 174 public:
Chris@16 175 typedef typename detail::mem_ptr_fun<r0, r1>::result_type result_type;
Chris@16 176 result_type operator ()(Expr &expr, Context &ctx) const
Chris@16 177 {
Chris@16 178 return detail::mem_ptr_fun<r0, r1>()(
Chris@16 179 proto::eval(proto::child_c<0>(expr), ctx)
Chris@16 180 , proto::eval(proto::child_c<1>(expr), ctx)
Chris@16 181 );
Chris@16 182 }
Chris@16 183 };
Chris@16 184
Chris@16 185 /// INTERNAL ONLY
Chris@16 186 template<typename Expr, typename Context>
Chris@16 187 struct memfun_eval<Expr, Context, true>
Chris@16 188 {
Chris@16 189 private:
Chris@16 190 typedef typename result_of::child_c<Expr, 0>::type e0;
Chris@16 191 typedef typename result_of::child_c<Expr, 1>::type e1;
Chris@16 192 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;
Chris@16 193 typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;
Chris@16 194 public:
Chris@16 195 typedef detail::memfun<r0, r1> result_type;
Chris@16 196 result_type const operator ()(Expr &expr, Context &ctx) const
Chris@16 197 {
Chris@16 198 return detail::memfun<r0, r1>(
Chris@16 199 proto::eval(proto::child_c<0>(expr), ctx)
Chris@16 200 , proto::eval(proto::child_c<1>(expr), ctx)
Chris@16 201 );
Chris@16 202 }
Chris@16 203 };
Chris@16 204
Chris@16 205 template<typename Expr, typename Context>
Chris@16 206 struct default_eval<Expr, Context, tag::mem_ptr, 2>
Chris@16 207 : memfun_eval<Expr, Context, is_member_function_eval<Expr, Context>::value>
Chris@16 208 {};
Chris@16 209
Chris@16 210 // Handle post-increment specially.
Chris@16 211 template<typename Expr, typename Context>
Chris@16 212 struct default_eval<Expr, Context, proto::tag::post_inc, 1>
Chris@16 213 {
Chris@16 214 private:
Chris@16 215 typedef typename proto::result_of::child_c<Expr, 0>::type e0;
Chris@16 216 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;
Chris@16 217 public:
Chris@16 218 BOOST_PROTO_DECLTYPE_(proto::detail::make_mutable<r0>() ++, result_type)
Chris@16 219 result_type operator ()(Expr &expr, Context &ctx) const
Chris@16 220 {
Chris@16 221 return proto::eval(proto::child_c<0>(expr), ctx) ++;
Chris@16 222 }
Chris@16 223 };
Chris@16 224
Chris@16 225 // Handle post-decrement specially.
Chris@16 226 template<typename Expr, typename Context>
Chris@16 227 struct default_eval<Expr, Context, proto::tag::post_dec, 1>
Chris@16 228 {
Chris@16 229 private:
Chris@16 230 typedef typename proto::result_of::child_c<Expr, 0>::type e0;
Chris@16 231 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;
Chris@16 232 public:
Chris@16 233 BOOST_PROTO_DECLTYPE_(proto::detail::make_mutable<r0>() --, result_type)
Chris@16 234 result_type operator ()(Expr &expr, Context &ctx) const
Chris@16 235 {
Chris@16 236 return proto::eval(proto::child_c<0>(expr), ctx) --;
Chris@16 237 }
Chris@16 238 };
Chris@16 239
Chris@16 240 // Handle subscript specially.
Chris@16 241 template<typename Expr, typename Context>
Chris@16 242 struct default_eval<Expr, Context, proto::tag::subscript, 2>
Chris@16 243 {
Chris@16 244 private:
Chris@16 245 typedef typename proto::result_of::child_c<Expr, 0>::type e0;
Chris@16 246 typedef typename proto::result_of::child_c<Expr, 1>::type e1;
Chris@16 247 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;
Chris@16 248 typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;
Chris@16 249 public:
Chris@16 250 BOOST_PROTO_DECLTYPE_(proto::detail::make_subscriptable<r0>()[proto::detail::make<r1>()], result_type)
Chris@16 251 result_type operator ()(Expr &expr, Context &ctx) const
Chris@16 252 {
Chris@16 253 return proto::eval(proto::child_c<0>(expr), ctx)[proto::eval(proto::child_c<1>(expr), ctx)];
Chris@16 254 }
Chris@16 255 };
Chris@16 256
Chris@16 257 // Handle if_else_ specially.
Chris@16 258 template<typename Expr, typename Context>
Chris@16 259 struct default_eval<Expr, Context, proto::tag::if_else_, 3>
Chris@16 260 {
Chris@16 261 private:
Chris@16 262 typedef typename proto::result_of::child_c<Expr, 0>::type e0;
Chris@16 263 typedef typename proto::result_of::child_c<Expr, 1>::type e1;
Chris@16 264 typedef typename proto::result_of::child_c<Expr, 2>::type e2;
Chris@16 265 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;
Chris@16 266 typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;
Chris@16 267 typedef typename proto::result_of::eval<UNREF(e2), Context>::type r2;
Chris@16 268 public:
Chris@16 269 BOOST_PROTO_DECLTYPE_(
Chris@16 270 proto::detail::make<r0>()
Chris@16 271 ? proto::detail::make<r1>()
Chris@16 272 : proto::detail::make<r2>()
Chris@16 273 , result_type
Chris@16 274 )
Chris@16 275 result_type operator ()(Expr &expr, Context &ctx) const
Chris@16 276 {
Chris@16 277 return proto::eval(proto::child_c<0>(expr), ctx)
Chris@16 278 ? proto::eval(proto::child_c<1>(expr), ctx)
Chris@16 279 : proto::eval(proto::child_c<2>(expr), ctx);
Chris@16 280 }
Chris@16 281 };
Chris@16 282
Chris@16 283 // Handle comma specially.
Chris@16 284 template<typename Expr, typename Context>
Chris@16 285 struct default_eval<Expr, Context, proto::tag::comma, 2>
Chris@16 286 {
Chris@16 287 private:
Chris@16 288 typedef typename proto::result_of::child_c<Expr, 0>::type e0;
Chris@16 289 typedef typename proto::result_of::child_c<Expr, 1>::type e1;
Chris@16 290 typedef typename proto::result_of::eval<UNREF(e0), Context>::type r0;
Chris@16 291 typedef typename proto::result_of::eval<UNREF(e1), Context>::type r1;
Chris@16 292 public:
Chris@16 293 typedef typename proto::detail::comma_result<r0, r1>::type result_type;
Chris@16 294 result_type operator ()(Expr &expr, Context &ctx) const
Chris@16 295 {
Chris@16 296 return proto::eval(proto::child_c<0>(expr), ctx), proto::eval(proto::child_c<1>(expr), ctx);
Chris@16 297 }
Chris@16 298 };
Chris@16 299
Chris@16 300 // Handle function specially
Chris@16 301 #define BOOST_PROTO_DEFAULT_EVAL_TYPE(Z, N, DATA) \
Chris@16 302 typename proto::result_of::eval< \
Chris@16 303 typename remove_reference< \
Chris@16 304 typename proto::result_of::child_c<DATA, N>::type \
Chris@16 305 >::type \
Chris@16 306 , Context \
Chris@16 307 >::type \
Chris@16 308 /**/
Chris@16 309
Chris@16 310 #define BOOST_PROTO_DEFAULT_EVAL(Z, N, DATA) \
Chris@16 311 proto::eval(proto::child_c<N>(DATA), context) \
Chris@16 312 /**/
Chris@16 313
Chris@16 314 template<typename Expr, typename Context>
Chris@16 315 struct default_eval<Expr, Context, proto::tag::function, 1>
Chris@16 316 {
Chris@16 317 typedef
Chris@16 318 typename proto::detail::result_of_fixup<
Chris@16 319 BOOST_PROTO_DEFAULT_EVAL_TYPE(~, 0, Expr)
Chris@16 320 >::type
Chris@16 321 function_type;
Chris@16 322
Chris@16 323 typedef
Chris@16 324 typename BOOST_PROTO_RESULT_OF<function_type()>::type
Chris@16 325 result_type;
Chris@16 326
Chris@16 327 result_type operator ()(Expr &expr, Context &context) const
Chris@16 328 {
Chris@16 329 return BOOST_PROTO_DEFAULT_EVAL(~, 0, expr)();
Chris@16 330 }
Chris@16 331 };
Chris@16 332
Chris@16 333 template<typename Expr, typename Context>
Chris@16 334 struct default_eval<Expr, Context, proto::tag::function, 2>
Chris@16 335 {
Chris@16 336 typedef
Chris@16 337 typename proto::detail::result_of_fixup<
Chris@16 338 BOOST_PROTO_DEFAULT_EVAL_TYPE(~, 0, Expr)
Chris@16 339 >::type
Chris@16 340 function_type;
Chris@16 341
Chris@16 342 typedef
Chris@16 343 typename detail::result_of_<
Chris@16 344 function_type(BOOST_PROTO_DEFAULT_EVAL_TYPE(~, 1, Expr))
Chris@16 345 >::type
Chris@16 346 result_type;
Chris@16 347
Chris@16 348 result_type operator ()(Expr &expr, Context &context) const
Chris@16 349 {
Chris@16 350 return this->invoke(
Chris@16 351 expr
Chris@16 352 , context
Chris@16 353 , is_member_function_pointer<function_type>()
Chris@16 354 , is_member_object_pointer<function_type>()
Chris@16 355 );
Chris@16 356 }
Chris@16 357
Chris@16 358 private:
Chris@16 359 result_type invoke(Expr &expr, Context &context, mpl::false_, mpl::false_) const
Chris@16 360 {
Chris@16 361 return BOOST_PROTO_DEFAULT_EVAL(~, 0, expr)(BOOST_PROTO_DEFAULT_EVAL(~, 1, expr));
Chris@16 362 }
Chris@16 363
Chris@16 364 result_type invoke(Expr &expr, Context &context, mpl::true_, mpl::false_) const
Chris@16 365 {
Chris@16 366 BOOST_PROTO_USE_GET_POINTER();
Chris@16 367 typedef typename detail::class_member_traits<function_type>::class_type class_type;
Chris@16 368 return (
Chris@16 369 BOOST_PROTO_GET_POINTER(class_type, (BOOST_PROTO_DEFAULT_EVAL(~, 1, expr))) ->*
Chris@16 370 BOOST_PROTO_DEFAULT_EVAL(~, 0, expr)
Chris@16 371 )();
Chris@16 372 }
Chris@16 373
Chris@16 374 result_type invoke(Expr &expr, Context &context, mpl::false_, mpl::true_) const
Chris@16 375 {
Chris@16 376 BOOST_PROTO_USE_GET_POINTER();
Chris@16 377 typedef typename detail::class_member_traits<function_type>::class_type class_type;
Chris@16 378 return (
Chris@16 379 BOOST_PROTO_GET_POINTER(class_type, (BOOST_PROTO_DEFAULT_EVAL(~, 1, expr))) ->*
Chris@16 380 BOOST_PROTO_DEFAULT_EVAL(~, 0, expr)
Chris@16 381 );
Chris@16 382 }
Chris@16 383 };
Chris@16 384
Chris@16 385 // Additional specialization are generated by the preprocessor
Chris@16 386 #include <boost/proto/context/detail/default_eval.hpp>
Chris@16 387
Chris@16 388 #undef BOOST_PROTO_DEFAULT_EVAL_TYPE
Chris@16 389 #undef BOOST_PROTO_DEFAULT_EVAL
Chris@16 390
Chris@16 391 /// default_context
Chris@16 392 ///
Chris@16 393 struct default_context
Chris@16 394 {
Chris@16 395 /// default_context::eval
Chris@16 396 ///
Chris@16 397 template<typename Expr, typename ThisContext = default_context const>
Chris@16 398 struct eval
Chris@16 399 : default_eval<Expr, ThisContext>
Chris@16 400 {};
Chris@16 401 };
Chris@16 402
Chris@16 403 } // namespace context
Chris@16 404
Chris@16 405 }} // namespace boost::proto
Chris@16 406
Chris@16 407 #undef UNREF
Chris@16 408
Chris@16 409 #endif