]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/with.cpp
1 /*=============================================================================
2 Copyright (c) 2015 Joel de Guzman
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
7 #include <boost/detail/lightweight_test.hpp>
8 #include <boost/spirit/home/x3.hpp>
11 namespace x3
= boost::spirit::x3
;
17 template <typename Iterator
, typename Exception
, typename Context
>
18 x3::error_handler_result
19 on_error(Iterator
&, Iterator
const&, Exception
const&, Context
const& context
)
21 x3::get
<my_tag
>(context
)++;
22 return x3::error_handler_result::fail
;
25 template <typename Iterator
, typename Attribute
, typename Context
>
27 on_success(Iterator
const&, Iterator
const&, Attribute
&, Context
const& context
)
29 x3::get
<my_tag
>(context
)++;
36 using spirit_test::test_attr
;
37 using spirit_test::test
;
39 using boost::spirit::x3::rule
;
40 using boost::spirit::x3::int_
;
41 using boost::spirit::x3::with
;
43 // read from a mutable field is not allowed on these compilers
44 #if (!defined(_MSC_VER) || _MSC_VER >= 1910) && \
45 (!defined(__clang__) || __clang_major__ >= 7)
46 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(with
<my_tag
>(0)['x']);
50 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(with
<my_tag
>(i
)['x']);
53 { // injecting data into the context in the grammar
56 auto r
= rule
<my_rule_class
, char const*>() =
57 '(' > int_
> ',' > int_
> ')'
61 with
<my_tag
>(std::ref(val
)) [ r
]
64 BOOST_TEST(test("(123,456)", start
));
65 BOOST_TEST(!test("(abc,def)", start
));
69 { // injecting non-const lvalue into the context
71 auto const r
= int_
[([](auto& ctx
){
72 x3::get
<my_tag
>(ctx
) += x3::_attr(ctx
);
74 BOOST_TEST(test("123,456", with
<my_tag
>(val
)[r
% ',']));
75 BOOST_TEST(579 == val
);
78 { // injecting rvalue into the context
79 auto const r1
= int_
[([](auto& ctx
){
80 x3::get
<my_tag
>(ctx
) += x3::_attr(ctx
);
82 auto const r2
= rule
<struct my_rvalue_rule_class
, int>() =
83 x3::lit('(') >> (r1
% ',') >> x3::lit(')')[([](auto& ctx
){
84 x3::_val(ctx
) = x3::get
<my_tag
>(ctx
);
87 BOOST_TEST(test_attr("(1,2,3)", with
<my_tag
>(100)[r2
], attr
));
88 BOOST_TEST(106 == attr
);
91 { // injecting const/non-const lvalue and rvalue into the context
93 int operator()(int& val
) {
94 return val
* 10; // non-const ref returns 10 * injected val
96 int operator()(int const& val
) {
97 return val
; // const ref returns injected val
101 auto f
= [](auto& ctx
){
102 x3::_val(ctx
) = x3::_attr(ctx
) + functor()(x3::get
<my_tag
>(ctx
));
104 auto const r
= rule
<struct my_rule_class2
, int>() = int_
[f
];
108 BOOST_TEST(test_attr("5", with
<my_tag
>(cval
)[r
], attr
));
109 BOOST_TEST(15 == attr
); // x3::get returns const ref to cval
113 BOOST_TEST(test_attr("5", with
<my_tag
>(val
)[r
], attr
));
114 BOOST_TEST(105 == attr
); // x3::get returns ref to val
118 BOOST_TEST(test_attr("5", with
<my_tag
>(10)[r
], attr
));
119 // x3::get returns ref to member variable of with_directive
120 BOOST_TEST(105 == attr
);
123 return boost::report_errors();