]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/plus.cpp
1 /*=============================================================================
2 Copyright (c) 2001-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 =============================================================================*/
10 #include <boost/spirit/home/x3.hpp>
11 #include <boost/fusion/include/vector.hpp>
22 namespace boost
{ namespace spirit
{ namespace x3
{ namespace traits
25 struct container_value
<x_attr
>
27 typedef char type
; // value type of container
31 struct push_back_container
<x_attr
>
33 static bool call(x_attr
& /*c*/, char /*val*/)
35 // push back value type into container
44 using spirit_test::test
;
45 using spirit_test::test_attr
;
46 using boost::spirit::x3::char_
;
47 using boost::spirit::x3::alpha
;
48 using boost::spirit::x3::upper
;
49 using boost::spirit::x3::space
;
50 using boost::spirit::x3::digit
;
51 //~ using boost::spirit::x3::no_case;
52 using boost::spirit::x3::int_
;
53 using boost::spirit::x3::omit
;
54 using boost::spirit::x3::lit
;
55 //~ using boost::spirit::x3::_1;
56 using boost::spirit::x3::lexeme
;
58 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(+char_
);
61 BOOST_TEST(test("aaaaaaaa", +char_
));
62 BOOST_TEST(test("a", +char_
));
63 BOOST_TEST(!test("", +char_
));
64 BOOST_TEST(test("aaaaaaaa", +alpha
));
65 BOOST_TEST(!test("aaaaaaaa", +upper
));
69 BOOST_TEST(test(" a a aaa aa", +char_
, space
));
70 BOOST_TEST(test("12345 678 9 ", +digit
, space
));
74 //~ BOOST_TEST(test("aBcdeFGH", no_case[+char_]));
75 //~ BOOST_TEST(test("a B cde FGH ", no_case[+char_], space));
80 BOOST_TEST(test_attr("123 456 789 10", +int_
, v
, space
) && 4 == v
.size() &&
81 v
[0] == 123 && v
[1] == 456 && v
[2] == 789 && v
[3] == 10);
85 std::vector
<std::string
> v
;
86 BOOST_TEST(test_attr("a b c d", +lexeme
[+alpha
], v
, space
) && 4 == v
.size() &&
87 v
[0] == "a" && v
[1] == "b" && v
[2] == "c" && v
[3] == "d");
91 BOOST_TEST(test("Kim Kim Kim", +lit("Kim"), space
));
96 // The following 2 tests show that omit does not inhibit explicit attributes
99 BOOST_TEST(test_attr("bbbb", omit[+char_('b')], s) && s == "bbbb");
102 BOOST_TEST(test_attr("b b b b ", omit[+char_('b')], s, space) && s == "bbbb");
107 auto f
= [&](auto& ctx
){ v
= _attr(ctx
); };
109 BOOST_TEST(test("bbbb", (+char_
)[f
]) && 4 == v
.size() &&
110 v
[0] == 'b' && v
[1] == 'b' && v
[2] == 'b' && v
[3] == 'b');
115 auto f
= [&](auto& ctx
){ v
= _attr(ctx
); };
117 BOOST_TEST(test("1 2 3", (+int_
)[f
], space
) && 3 == v
.size() &&
118 v
[0] == 1 && v
[1] == 2 && v
[2] == 3);
121 { // attribute customization
124 test_attr("abcde", +char_
, x
);
127 // single-element fusion vector tests
129 boost::fusion::vector
<std::string
> fs
;
130 BOOST_TEST((test_attr("12345", +char_
, fs
))); // ok
131 BOOST_TEST(boost::fusion::at_c
<0>(fs
) == "12345");
134 { // test move only types
135 std::vector
<move_only
> v
;
136 BOOST_TEST(test_attr("sss", +synth_move_only
, v
));
137 BOOST_TEST_EQ(v
.size(), 3);
140 return boost::report_errors();