1 | #include <iostream>
|
---|
2 | #include <boost/mpl/int.hpp>
|
---|
3 | #include <boost/proto/fusion.hpp>
|
---|
4 | #include <boost/proto/core.hpp>
|
---|
5 | #include <boost/proto/context.hpp>
|
---|
6 |
|
---|
7 | namespace mpl = boost::mpl;
|
---|
8 | namespace proto = boost::proto;
|
---|
9 | namespace fusion = boost::fusion;
|
---|
10 | using proto::_;
|
---|
11 |
|
---|
12 | struct my_grammar : proto::or_<
|
---|
13 | proto::terminal< int >,
|
---|
14 | proto::binary_expr<_, my_grammar, my_grammar>
|
---|
15 | >
|
---|
16 | {};
|
---|
17 |
|
---|
18 | template<typename Expr>
|
---|
19 | struct my_expr;
|
---|
20 |
|
---|
21 | struct my_domain : proto::domain<proto::generator<my_expr>, my_grammar>
|
---|
22 | {};
|
---|
23 |
|
---|
24 | template<typename Expr>
|
---|
25 | struct my_expr
|
---|
26 | : proto::extends<Expr, my_expr<Expr>, my_domain>
|
---|
27 | {
|
---|
28 | typedef proto::extends<Expr, my_expr<Expr>, my_domain> base_type;
|
---|
29 |
|
---|
30 | my_expr( Expr const & expr = Expr() )
|
---|
31 | : base_type( expr )
|
---|
32 | {}
|
---|
33 |
|
---|
34 | struct assign {
|
---|
35 | typedef int result_type;
|
---|
36 |
|
---|
37 | #ifdef BUG
|
---|
38 | template<typename T>
|
---|
39 | result_type operator()(const T& t, int offset) const {
|
---|
40 | proto::value (const_cast<T&>(t)) = offset;
|
---|
41 | return offset+sizeof (T);
|
---|
42 | }
|
---|
43 | #else
|
---|
44 | template<typename T>
|
---|
45 | result_type operator()(T& t, int offset) {
|
---|
46 | proto::value (t) = offset;
|
---|
47 | return offset+sizeof (T);
|
---|
48 | }
|
---|
49 | #endif
|
---|
50 |
|
---|
51 | };
|
---|
52 |
|
---|
53 | template<typename E>
|
---|
54 | const my_expr& operator=(const E&) const {
|
---|
55 | fusion::fold(proto::flatten (*this), 0, assign ());
|
---|
56 | return *this;
|
---|
57 | }
|
---|
58 | };
|
---|
59 |
|
---|
60 | struct my_int
|
---|
61 | : my_expr< proto::terminal< int >::type >
|
---|
62 | {
|
---|
63 | typedef my_expr< proto::terminal< int >::type > base_type;
|
---|
64 | explicit my_int (int i = 0) : base_type (base_type::proto_base_expr::make (i)) {}
|
---|
65 | operator int () { return proto::value (*this); }
|
---|
66 | };
|
---|
67 |
|
---|
68 | int main()
|
---|
69 | {
|
---|
70 | my_int i (1);
|
---|
71 | my_int j (2);
|
---|
72 | my_int k (3);
|
---|
73 |
|
---|
74 | (k,j) = (j,k);
|
---|
75 | std::cout << j << std::endl << k << std::endl;
|
---|
76 | return 0;
|
---|
77 | }
|
---|
78 | |
---|
79 |
|
---|
80 | /// Local Variables:
|
---|
81 | /// mode:c++
|
---|
82 | /// comment-column:60
|
---|
83 | /// fill-column:150
|
---|
84 | /// compile-command:"g++ -I. -I./boost -o testcase testcase.cpp"
|
---|
85 | /// c-macro-cppflags:"-C -I. -I./boost"
|
---|
86 | /// c-backslash-column:120
|
---|
87 | /// c-backslash-max-column:149
|
---|
88 | /// End:
|
---|