]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/karma/attribute.cpp
1 // Copyright (c) 2001-2011 Hartmut Kaiser
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #include <boost/spirit/include/karma_attr_cast.hpp>
8 #include <boost/fusion/include/struct.hpp>
9 #include <boost/fusion/include/nview.hpp>
11 #include <boost/spirit/include/karma_char.hpp>
12 #include <boost/spirit/include/karma_string.hpp>
13 #include <boost/spirit/include/karma_numeric.hpp>
14 #include <boost/spirit/include/karma_operator.hpp>
15 #include <boost/spirit/include/karma_nonterminal.hpp>
16 #include <boost/spirit/include/karma_auxiliary.hpp>
20 using namespace spirit_test
;
22 ///////////////////////////////////////////////////////////////////////////////
32 BOOST_FUSION_ADAPT_STRUCT(
41 ///////////////////////////////////////////////////////////////////////////////
42 // this is just a test structure we need to use in place of an int
48 // so we provide a custom attribute transformation
49 namespace boost
{ namespace spirit
{ namespace traits
52 struct transform_attribute
<test_int_data1
const, int, karma::domain
>
55 static int pre(test_int_data1
const& d
) { return d
.i
; }
59 ///////////////////////////////////////////////////////////////////////////////
60 // this is another test structure we need to use in place of an int, but this
61 // time we use a reference to the embedded element
67 // so we provide a custom attribute transformation
68 namespace boost
{ namespace spirit
{ namespace traits
71 struct transform_attribute
<test_int_data2
const, int, karma::domain
>
73 typedef int const& type
;
74 static int const& pre(test_int_data2
const& d
) { return d
.i
; }
78 ///////////////////////////////////////////////////////////////////////////////
81 namespace fusion
= boost::fusion
;
82 namespace karma
= boost::spirit::karma
;
84 test_data d1
= { "s11", "s12", 1, 2.5, "s13" };
87 BOOST_TEST(test("s121",
88 karma::string
<< karma::int_
,
89 fusion::as_nview
<2, 0>(d1
)));
91 BOOST_TEST(test_delimited("s12 1 ",
92 karma::string
<< karma::int_
,
93 fusion::as_nview
<2, 0>(d1
), ' '));
97 test_data d2
= { "s21", "s22", 2, 3.4, "s23" };
98 typedef fusion::result_of::as_nview
<test_data
const, 1, 2, 4>::type
100 std::vector
<test_data
> v
;
104 karma::rule
<output_iterator
<char>::type
, test_view()> r
=
105 karma::string
<< karma::string
<< karma::double_
;
107 BOOST_TEST(test("s11s122.5\ns21s223.4", r
% karma::eol
, v
));
108 BOOST_TEST(test_delimited("s11s122.5 \n s21s223.4 ",
109 r
% karma::eol
, v
, ' '));
113 test_int_data1 d
= { 1 };
114 BOOST_TEST(test("1", karma::attr_cast(karma::int_
), d
));
115 BOOST_TEST(test("1", karma::attr_cast
<test_int_data1
>(karma::int_
), d
));
116 BOOST_TEST(test("1", karma::attr_cast
<test_int_data1
, int>(karma::int_
), d
));
120 test_int_data1 d
[] = {{ 1 }, { 2 }};
121 std::vector
<test_int_data1
> v
;
125 BOOST_TEST(test("1,2", karma::attr_cast(karma::int_
) % ',', v
));
126 BOOST_TEST(test("1,2"
127 , karma::attr_cast
<test_int_data1
>(karma::int_
) % ',', v
));
128 BOOST_TEST(test("1,2"
129 , karma::attr_cast
<test_int_data1
, int>(karma::int_
) % ',', v
));
133 test_int_data1 d
[] = {{ 1 }, { 2 }};
134 std::vector
<test_int_data1
> v
;
138 karma::rule
<output_iterator
<char>::type
, int()> r
= karma::int_
;
139 BOOST_TEST(test("1,2", r
% ',', v
));
143 test_int_data1 d
[] = {{ 1 }, { 2 }};
144 std::vector
<test_int_data1
> v
;
148 // this won't compile as there is no defined transformation for
149 // test_int_data1 and double
150 // BOOST_TEST(test("1.0,2.0", karma::attr_cast(karma::double_) % ',', v));
151 // BOOST_TEST(test("1.0,2.0"
152 // , karma::attr_cast<test_int_data1>(karma::double_) % ',', v));
154 BOOST_TEST(test("1.0,2.0"
155 , karma::attr_cast
<test_int_data1
, int>(karma::double_
) % ',', v
));
157 karma::rule
<output_iterator
<char>::type
, int()> r
= karma::double_
;
158 BOOST_TEST(test("1.0,2.0", r
% ',', v
));
162 test_int_data2 d
= { 1 };
163 BOOST_TEST(test("1", karma::attr_cast(karma::int_
), d
));
164 BOOST_TEST(test("1", karma::attr_cast
<test_int_data2
>(karma::int_
), d
));
165 BOOST_TEST(test("1", karma::attr_cast
<test_int_data2
, int>(karma::int_
), d
));
169 test_int_data2 d
[] = {{ 1 }, { 2 }};
170 std::vector
<test_int_data2
> v
;
174 BOOST_TEST(test("1,2", karma::attr_cast(karma::int_
) % ',', v
));
175 BOOST_TEST(test("1,2"
176 , karma::attr_cast
<test_int_data2
>(karma::int_
) % ',', v
));
177 BOOST_TEST(test("1,2"
178 , karma::attr_cast
<test_int_data2
, int>(karma::int_
) % ',', v
));
182 test_int_data2 d
[] = {{ 1 }, { 2 }};
183 std::vector
<test_int_data2
> v
;
187 karma::rule
<output_iterator
<char>::type
, int()> r
= karma::int_
;
188 BOOST_TEST(test("1,2", r
% ',', v
));
192 test_int_data2 d
[] = {{ 1 }, { 2 }};
193 std::vector
<test_int_data2
> v
;
197 // this won't compile as there is no defined transformation for
198 // test_int_data2 and double
199 // BOOST_TEST(test("1.0,2.0", karma::attr_cast(karma::double_) % ',', v));
200 // BOOST_TEST(test("1.0,2.0"
201 // , karma::attr_cast<test_int_data2>(karma::double_) % ',', v));
203 BOOST_TEST(test("1.0,2.0"
204 , karma::attr_cast
<test_int_data2
, int>(karma::double_
) % ',', v
));
206 karma::rule
<output_iterator
<char>::type
, int()> r
= karma::double_
;
207 BOOST_TEST(test("1.0,2.0", r
% ',', v
));
210 return boost::report_errors();