1// Copyright (c) 2001-2011 Hartmut Kaiser
2//
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)
5
6#include <boost/spirit/include/qi_operator.hpp>
7#include <boost/spirit/include/qi_char.hpp>
8#include <boost/spirit/include/qi_string.hpp>
9#include <boost/spirit/include/qi_numeric.hpp>
10#include <boost/spirit/include/qi_directive.hpp>
11#include <boost/spirit/include/qi_action.hpp>
12#include <boost/spirit/include/qi_auxiliary.hpp>
13#include <boost/spirit/include/support_argument.hpp>
14#include <boost/fusion/include/std_pair.hpp>
15
16#include <string>
17#include <vector>
18#include <set>
19#include <map>
20#include <iostream>
21#include "test.hpp"
22
23using namespace spirit_test;
24
25inline bool compare(std::vector<char> const& v, std::string const& s)
26{
27 return v.size() == s.size() && std::equal(first1: v.begin(), last1: v.end(), first2: s.begin());
28}
29
30int main()
31{
32 using boost::spirit::qi::char_;
33 using boost::spirit::qi::omit;
34
35 {
36 std::vector<char> v;
37 BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', v) &&
38 compare(v, "abcdefgh"));
39
40 std::string s;
41 BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', s) &&
42 s == "abcdefgh");
43
44 BOOST_TEST(test("a,b,c,d,e,f,g,h", char_ % ','));
45 BOOST_TEST(test("a,b,c,d,e,f,g,h", omit[char_] % ','));
46 }
47
48 {
49 std::vector<char> v1;
50 BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v1) &&
51 compare(v1, "abcdefgh"));
52 v1.clear();
53 BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', v1) &&
54 compare(v1, "aceg"));
55
56 std::string s;
57 BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', s) &&
58 s == "abcdefgh");
59 s.clear();
60 BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', s) &&
61 s == "aceg");
62
63 std::vector<std::pair<char, char> > v2;
64 BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v2) &&
65 v2.size() == 4 &&
66 v2[0] == std::make_pair('a', 'b') &&
67 v2[1] == std::make_pair('c', 'd') &&
68 v2[2] == std::make_pair('e', 'f') &&
69 v2[3] == std::make_pair('g', 'h'));
70
71 s.clear();
72 BOOST_TEST(test_attr("ab,cd,efg", (char_ >> char_) % ',' >> char_, s) &&
73 s == "abcdefg");
74
75 BOOST_TEST(test("ab,cd,ef,gh", (char_ >> char_) % ','));
76 BOOST_TEST(test("ab,cd,ef,gh", (omit[char_ >> char_]) % ','));
77 }
78
79 {
80 std::vector<char> v1;
81 BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v1) &&
82 compare(v1, "abcdefgh"));
83 v1.clear();
84 BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v1) &&
85 compare(v1, "adg"));
86 v1.clear();
87 BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v1) &&
88 compare(v1, "bcefh"));
89
90 std::string s1;
91 BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', s1) &&
92 s1 == "abcdefgh");
93 s1.clear();
94 BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s1) &&
95 s1 == "adg");
96 s1.clear();
97 BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', s1) &&
98 s1 == "bcefh");
99
100 std::vector<std::pair<char, std::vector<char> > > v2;
101 BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v2) &&
102 v2.size() == 3 &&
103 v2[0].first == 'a' && compare(v2[0].second, "bc") &&
104 v2[1].first == 'd' && compare(v2[1].second, "ef") &&
105 v2[2].first == 'g' && compare(v2[2].second, "h"));
106
107 std::vector<std::vector<char> > v3;
108 BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v3) &&
109 v3.size() == 3 &&
110 compare(v3[0], "bc") && compare(v3[1], "ef") &&
111 compare(v3[2], "h"));
112
113 std::vector<char> v4;
114 BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v4) &&
115 v4.size() == 3 &&
116 v4[0] == 'a' && v4[1] == 'd' && v4[2] == 'g');
117
118 std::vector<std::string> v5;
119 BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v5) &&
120 v5.size() == 3 &&
121 v5[0] == "bc" && v5[1] == "ef" && v5[2] == "h");
122
123 std::string s2;
124 BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s2) &&
125 s2.size() == 3 &&
126 s2 == "adg");
127
128 BOOST_TEST(test("abc,def,gh", (char_ >> *~char_(',')) % ','));
129 BOOST_TEST(test("abc,def,gh", (omit[char_ >> *~char_(',')]) % ','));
130 }
131
132 {
133 using boost::spirit::qi::alpha;
134 using boost::spirit::qi::digit;
135
136 std::vector<char> v1;
137 BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v1) &&
138 compare(v1, "ab12cd34ef56"));
139 v1.clear();
140 BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v1) &&
141 compare(v1, "123456"));
142 v1.clear();
143 BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', v1) &&
144 compare(v1, "abcdef"));
145
146 std::string s1;
147 BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', s1) &&
148 s1 == "ab12cd34ef56");
149 s1.clear();
150 BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', s1) &&
151 s1 == "123456");
152 s1.clear();
153 BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', s1) &&
154 s1 == "abcdef");
155
156 std::vector<std::pair<std::vector<char>, std::vector<char> > > v2;
157 BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v2) &&
158 v2.size() == 3 &&
159 compare(v2[0].first, "ab") && compare(v2[0].second, "12") &&
160 compare(v2[1].first, "cd") && compare(v2[1].second, "34") &&
161 compare(v2[2].first, "ef") && compare(v2[2].second, "56"));
162
163 std::vector<std::pair<std::string, std::string> > v3;
164 BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v3) &&
165 v3.size() == 3 &&
166 v3[0].first == "ab" && v3[0].second == "12" &&
167 v3[1].first == "cd" && v3[1].second == "34" &&
168 v3[2].first == "ef" && v3[2].second == "56");
169
170 std::vector<std::vector<char> > v4;
171 BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v4) &&
172 v4.size() == 3 &&
173 compare(v4[0], "12") &&
174 compare(v4[1], "34") &&
175 compare(v4[2], "56"));
176
177 BOOST_TEST(test("ab12,cd34,ef56", (*alpha >> *digit) % ','));
178 BOOST_TEST(test("ab12,cd34,ef56", omit[*alpha >> *digit] % ','));
179 }
180
181 return boost::report_errors();
182}
183
184

source code of boost/libs/spirit/test/qi/pass_container1.cpp