1 //  Copyright (c) 2011 Roji Philip
2 //  Copyright (c) 2001-2011 Hartmut Kaiser
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/config/warning_disable.hpp>
8 #include <boost/detail/lightweight_test.hpp>
9 
10 #include <boost/fusion/include/adapt_adt.hpp>
11 #include <boost/optional.hpp>
12 
13 #include <boost/spirit/include/qi.hpp>
14 #include <boost/spirit/include/support_adapt_adt_attributes.hpp>
15 
16 #include "test.hpp"
17 
18 ///////////////////////////////////////////////////////////////////////////////
19 struct test1
20 {
21     unsigned var;
22     boost::optional<unsigned> opt;
23 
getvartest124     unsigned& getvar() { return var; }
getvartest125     unsigned const& getvar() const { return var; }
setvartest126     void setvar(unsigned val) { var = val; }
27 
getopttest128     boost::optional<unsigned>& getopt() { return opt; }
getopttest129     boost::optional<unsigned> const& getopt() const { return opt; }
setopttest130     void setopt(boost::optional<unsigned> const& val) { opt = val; }
31 };
32 
33 BOOST_FUSION_ADAPT_ADT(
34     test1,
35     (unsigned&, unsigned const&, obj.getvar(), obj.setvar(val))
36     (boost::optional<unsigned>&, boost::optional<unsigned> const&,
37         obj.getopt(), obj.setopt(val))
38 )
39 
40 ///////////////////////////////////////////////////////////////////////////////
41 struct test2
42 {
43     std::string str;
44     boost::optional<std::string> optstr;
45 
getstringtest246     std::string& getstring() { return str; }
getstringtest247     std::string const& getstring() const { return str; }
setstringtest248     void setstring(std::string const& val) { str = val; }
49 
getoptstringtest250     boost::optional<std::string>& getoptstring() { return optstr; }
getoptstringtest251     boost::optional<std::string> const& getoptstring() const { return optstr; }
setoptstringtest252     void setoptstring(boost::optional<std::string> const& val) { optstr = val; }
53 };
54 
55 BOOST_FUSION_ADAPT_ADT(
56     test2,
57     (std::string&, std::string const&, obj.getstring(), obj.setstring(val))
58     (boost::optional<std::string>&, boost::optional<std::string> const&,
59         obj.getoptstring(), obj.setoptstring(val))
60 )
61 
62 ///////////////////////////////////////////////////////////////////////////////
main()63 int main()
64 {
65     using spirit_test::test_attr;
66     namespace qi = boost::spirit::qi;
67 
68     {
69         test1 data;
70         BOOST_TEST(test_attr("123@999", qi::uint_ >> -('@' >> qi::uint_), data) &&
71             data.var == 123 && data.opt && data.opt.get() == 999);
72     }
73 
74     {
75         test1 data;
76         BOOST_TEST(test_attr("123", qi::uint_ >> -('@' >> qi::uint_), data) &&
77             data.var == 123 && !data.opt);
78     }
79 
80     {
81         test2 data;
82         BOOST_TEST(test_attr("Hello:OptionalHello",
83             +qi::alnum >> -(':' >> +qi::alnum), data) &&
84             data.str == "Hello" &&
85             data.optstr && data.optstr.get() == "OptionalHello");
86     }
87 
88     {
89         test2 data;
90         BOOST_TEST(test_attr("Hello",
91             +qi::alnum >> -(':' >> +qi::alnum), data) &&
92             data.str == "Hello" && !data.optstr);
93     }
94 
95     { // GH#396
96         qi::rule<char const*, unsigned()> uint_r = qi::uint_;
97         test1 data;
98         BOOST_TEST(test_attr("123@999", uint_r >> -('@' >> uint_r), data) &&
99             data.var == 123 && data.opt && data.opt.get() == 999);
100     }
101 
102     return boost::report_errors();
103 }
104