1 /////////////////////////////////////////////////////////////////////////////// 2 /// \file proto_typeof.hpp 3 /// Type registrations so that proto expression templates can be used together 4 /// with the Boost.Typeof library. 5 // 6 // Copyright 2008 Eric Niebler. Distributed under the Boost 7 // Software License, Version 1.0. (See accompanying file 8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 10 #ifndef BOOST_XPRESSIVE_PROTO_PROTO_TYPEOF_H 11 #define BOOST_XPRESSIVE_PROTO_PROTO_TYPEOF_H 12 13 #include <boost/config.hpp> 14 #include <boost/typeof/typeof.hpp> 15 #include <boost/proto/proto_fwd.hpp> 16 #include <boost/proto/deep_copy.hpp> 17 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() 18 19 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::terminal) 20 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::unary_plus) 21 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::negate) 22 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::dereference) 23 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::complement) 24 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::address_of) 25 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::logical_not) 26 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::pre_inc) 27 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::pre_dec) 28 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::post_inc) 29 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::post_dec) 30 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_left) 31 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_right) 32 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::multiplies) 33 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::divides) 34 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::modulus) 35 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::plus) 36 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::minus) 37 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::less) 38 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::greater) 39 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::less_equal) 40 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::greater_equal) 41 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::equal_to) 42 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::not_equal_to) 43 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::logical_or) 44 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::logical_and) 45 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_and) 46 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_or) 47 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_xor) 48 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::comma) 49 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::mem_ptr) 50 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::assign) 51 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_left_assign) 52 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_right_assign) 53 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::multiplies_assign) 54 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::divides_assign) 55 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::modulus_assign) 56 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::plus_assign) 57 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::minus_assign) 58 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_and_assign) 59 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_or_assign) 60 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_xor_assign) 61 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::subscript) 62 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::member) 63 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::if_else_) 64 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::function) 65 66 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::exprns_::is_proto_expr) 67 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::exprns_::expr, (typename)(typename)(long)) 68 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::exprns_::basic_expr, (typename)(typename)(long)) 69 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::utility::literal, (typename)(typename)) 70 71 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::detail::not_a_generator) 72 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::detail::not_a_grammar) 73 BOOST_TYPEOF_REGISTER_TYPE(boost::proto::detail::not_a_domain) 74 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::domain, 3) 75 76 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::term, 1) 77 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list1, 1) 78 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list2, 2) 79 // can't use PP metaprogramming here because all typeof registrations 80 // must be on separate lines. 81 #if BOOST_PROTO_MAX_ARITY >= 3 82 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list3, 3) 83 #endif 84 #if BOOST_PROTO_MAX_ARITY >= 4 85 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list4, 4) 86 #endif 87 #if BOOST_PROTO_MAX_ARITY >= 5 88 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list5, 5) 89 #endif 90 #if BOOST_PROTO_MAX_ARITY >= 6 91 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list6, 6) 92 #endif 93 #if BOOST_PROTO_MAX_ARITY >= 7 94 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list7, 7) 95 #endif 96 #if BOOST_PROTO_MAX_ARITY >= 8 97 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list8, 8) 98 #endif 99 #if BOOST_PROTO_MAX_ARITY >= 9 100 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list9, 9) 101 #endif 102 #if BOOST_PROTO_MAX_ARITY >= 10 103 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list10, 10) 104 #endif 105 #if BOOST_PROTO_MAX_ARITY >= 11 106 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list11, 11) 107 #endif 108 #if BOOST_PROTO_MAX_ARITY >= 12 109 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list12, 12) 110 #endif 111 #if BOOST_PROTO_MAX_ARITY >= 13 112 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list13, 13) 113 #endif 114 #if BOOST_PROTO_MAX_ARITY >= 14 115 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list14, 14) 116 #endif 117 #if BOOST_PROTO_MAX_ARITY >= 15 118 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list15, 15) 119 #endif 120 #if BOOST_PROTO_MAX_ARITY >= 16 121 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list16, 16) 122 #endif 123 #if BOOST_PROTO_MAX_ARITY >= 17 124 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list17, 17) 125 #endif 126 #if BOOST_PROTO_MAX_ARITY >= 18 127 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list18, 18) 128 #endif 129 #if BOOST_PROTO_MAX_ARITY >= 19 130 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list19, 19) 131 #endif 132 #if BOOST_PROTO_MAX_ARITY >= 20 133 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list20, 20) 134 #endif 135 136 #define BOOST_PROTO_AUTO(Var, Expr) BOOST_AUTO(Var, boost::proto::deep_copy(Expr)) 137 #define BOOST_PROTO_AUTO_TPL(Var, Expr) BOOST_AUTO_TPL(Var, boost::proto::deep_copy(Expr)) 138 139 #endif 140