]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/support/regression_multi_pass_error_handler.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / spirit / test / support / regression_multi_pass_error_handler.cpp
1 // Copyright (c) 2001-2010 Hartmut Kaiser
2 // Copyright (c) 2011 Laurent Gomila
3 //
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/spirit/include/qi.hpp>
8 #include <boost/phoenix/operator.hpp>
9 #include <boost/spirit/include/support_multi_pass.hpp>
10 #include <boost/core/lightweight_test.hpp>
11 #include <sstream>
12 #include <iostream>
13 #include <iterator>
14 #include <string>
15
16 using namespace boost::spirit;
17 using namespace boost;
18
19 int main()
20 {
21 {
22 std::string input("5x");
23 std::istringstream iss(input);
24
25 typedef std::istreambuf_iterator<char> base_iterator_type;
26 typedef multi_pass<base_iterator_type> iterator_type;
27
28 iterator_type first = make_default_multi_pass(base_iterator_type(iss));
29 iterator_type last = make_default_multi_pass(base_iterator_type());
30
31 std::ostringstream oss;
32
33 qi::rule<iterator_type> r = qi::int_ > qi::int_;
34 qi::on_error<qi::fail>(r, phoenix::ref(oss) << phoenix::val("error"));
35
36 BOOST_TEST(!qi::parse(first, last, r));
37 BOOST_TEST(oss.str() == "error");
38 }
39
40 {
41 std::string input("5x");
42 std::istringstream iss(input);
43
44 typedef std::istreambuf_iterator<char> base_iterator_type;
45 typedef multi_pass<base_iterator_type> iterator_type;
46
47 iterator_type first = make_default_multi_pass(base_iterator_type(iss));
48 iterator_type last = make_default_multi_pass(base_iterator_type());
49
50 std::ostringstream oss;
51
52 qi::rule<iterator_type> r1 = qi::int_ > qi::int_;
53 qi::rule<iterator_type> r2 = qi::int_ > qi::char_;
54 qi::on_error<qi::fail>(r1, phoenix::ref(oss) << phoenix::val("error in r1"));
55 qi::on_error<qi::fail>(r2, phoenix::ref(oss) << phoenix::val("error in r2"));
56
57 BOOST_TEST(qi::parse(first, last, r1 | r2));
58 BOOST_TEST(oss.str() == "error in r1");
59 }
60
61 return boost::report_errors();
62 }
63