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