]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/spirit/test/x3/optional_ast_node.cpp
buildsys: switch source download to quincy
[ceph.git] / ceph / src / boost / libs / spirit / test / x3 / optional_ast_node.cpp
CommitLineData
92f5a8d4
TL
1/*=============================================================================
2 Copyright (c) 2001-2015 Joel de Guzman
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 Duzy Chan:
8 This test addresses the usage of boost::optional<foo> as an ast node.
9=============================================================================*/
10#include <boost/detail/lightweight_test.hpp>
11#include <boost/spirit/home/x3.hpp>
12#include <boost/fusion/adapted/struct.hpp>
13#include <boost/fusion/include/vector.hpp>
14
15#include <iostream>
16#include "test.hpp"
17#include "utils.hpp"
18
19struct twoints
20{
21 int a;
22 int b;
23};
24
25struct adata
26{
27 twoints a;
28 boost::optional<twoints> b;
29 twoints c;
30};
31
32BOOST_FUSION_ADAPT_STRUCT(twoints, a, b)
33BOOST_FUSION_ADAPT_STRUCT(adata, a, b, c)
34
35int
36main()
37{
38 {
39 // Duzy Chan: This case addresses the usage of boost::optional<foo>
40 // as an ast node. Which should actually test the ability of
41 // boost::spirit::x3::traits::move_to to handle with optional source
42 // value.
43 boost::spirit::x3::rule<class twoints, adata> top = "top";
44 boost::spirit::x3::rule<class twoints, boost::optional<twoints>>
45 twoints = "twoints";
46
47 using boost::spirit::x3::int_;
48 auto const top_def = twoints >> ',' >> -twoints >> ',' >> twoints;
49 auto const twoints_def = int_ >> int_;
50
51 BOOST_SPIRIT_DEFINE(top, twoints);
52
53 twoints a, b;
54 BOOST_TEST((test_attr("1 2,3 4,5 6", top, a)));
55 BOOST_TEST((a.a.a == 1 && a.a.b == 2));
56 BOOST_TEST((a.b && a.b->a == 3 && a.b->b == 4));
57 BOOST_TEST((a.c.a == 5 && a.c.b == 6));
58
59 BOOST_TEST((test_attr("1 2,,5 6", top), b));
60 BOOST_TEST((b.a.a == 1 && b.a.b == 2));
61 BOOST_TEST((!a.b));
62 BOOST_TEST((b.c.a == 5 && b.c.b == 6));
63 }
64
65 return boost::report_errors();
66}