pass_container1.cpp 6.8 KB

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