container_support.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*=============================================================================
  2. Copyright (c) 2001-2015 Joel de Guzman
  3. Copyright (c) 2001-2011 Hartmut Kaiser
  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/detail/lightweight_test.hpp>
  8. #include <boost/spirit/home/x3.hpp>
  9. #include <boost/fusion/include/std_pair.hpp>
  10. #include <iostream>
  11. #include <map>
  12. #include <unordered_map>
  13. #include <boost/unordered_map.hpp>
  14. #include <vector>
  15. #include <list>
  16. #include <deque>
  17. #include <set>
  18. #include <unordered_set>
  19. #include <boost/unordered_set.hpp>
  20. #include <string>
  21. #include "test.hpp"
  22. namespace x3 = boost::spirit::x3;
  23. x3::rule<class pair_rule, std::pair<std::string,std::string>> const pair_rule("pair");
  24. x3::rule<class string_rule, std::string> const string_rule("string");
  25. auto const pair_rule_def = string_rule > x3::lit('=') > string_rule;
  26. auto const string_rule_def = x3::lexeme[*x3::alnum];
  27. BOOST_SPIRIT_DEFINE(pair_rule, string_rule)
  28. template <typename Container>
  29. void test_map_support()
  30. {
  31. using spirit_test::test_attr;
  32. Container container;
  33. Container const compare {{"k1", "v1"}, {"k2", "v2"}};
  34. auto const rule = pair_rule % x3::lit(',');
  35. BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", rule, container));
  36. BOOST_TEST(container.size() == 2);
  37. BOOST_TEST(container == compare);
  38. // test sequences parsing into containers
  39. auto const seq_rule = pair_rule >> ',' >> pair_rule >> ',' >> pair_rule;
  40. container.clear();
  41. BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", seq_rule, container));
  42. // test parsing container into container
  43. auto const cic_rule = pair_rule >> +(',' >> pair_rule);
  44. container.clear();
  45. BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", cic_rule, container));
  46. }
  47. template <typename Container>
  48. void test_multimap_support()
  49. {
  50. using spirit_test::test_attr;
  51. Container container;
  52. Container const compare {{"k1", "v1"}, {"k2", "v2"}, {"k2", "v3"}};
  53. auto const rule = pair_rule % x3::lit(',');
  54. BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", rule, container));
  55. BOOST_TEST(container.size() == 3);
  56. BOOST_TEST(container == compare);
  57. // test sequences parsing into containers
  58. auto const seq_rule = pair_rule >> ',' >> pair_rule >> ',' >> pair_rule;
  59. container.clear();
  60. BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", seq_rule, container));
  61. // test parsing container into container
  62. auto const cic_rule = pair_rule >> +(',' >> pair_rule);
  63. container.clear();
  64. BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", cic_rule, container));
  65. }
  66. template <typename Container>
  67. void test_sequence_support()
  68. {
  69. using spirit_test::test_attr;
  70. Container container;
  71. Container const compare {"e1", "e2", "e2"};
  72. auto const rule = string_rule % x3::lit(',');
  73. BOOST_TEST(test_attr("e1,e2,e2", rule, container));
  74. BOOST_TEST(container.size() == 3);
  75. BOOST_TEST(container == compare);
  76. // test sequences parsing into containers
  77. auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule;
  78. container.clear();
  79. BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container));
  80. // test parsing container into container
  81. auto const cic_rule = string_rule >> +(',' >> string_rule);
  82. container.clear();
  83. BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container));
  84. }
  85. template <typename Container>
  86. void test_set_support()
  87. {
  88. using spirit_test::test_attr;
  89. Container container;
  90. Container const compare {"e1", "e2"};
  91. auto const rule = string_rule % x3::lit(',');
  92. BOOST_TEST(test_attr("e1,e2,e2", rule, container));
  93. BOOST_TEST(container.size() == 2);
  94. BOOST_TEST(container == compare);
  95. // test sequences parsing into containers
  96. auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule;
  97. container.clear();
  98. BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container));
  99. // test parsing container into container
  100. auto const cic_rule = string_rule >> +(',' >> string_rule);
  101. container.clear();
  102. BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container));
  103. }
  104. template <typename Container>
  105. void test_multiset_support()
  106. {
  107. using spirit_test::test_attr;
  108. Container container;
  109. Container const compare {"e1", "e2", "e2"};
  110. auto const rule = string_rule % x3::lit(',');
  111. BOOST_TEST(test_attr("e1,e2,e2", rule, container));
  112. BOOST_TEST(container.size() == 3);
  113. BOOST_TEST(container == compare);
  114. // test sequences parsing into containers
  115. auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule;
  116. container.clear();
  117. BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container));
  118. // test parsing container into container
  119. auto const cic_rule = string_rule >> +(',' >> string_rule);
  120. container.clear();
  121. BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container));
  122. }
  123. template <typename Container>
  124. void test_string_support()
  125. {
  126. using spirit_test::test_attr;
  127. Container container;
  128. Container const compare {"e1e2e2"};
  129. auto const rule = string_rule % x3::lit(',');
  130. BOOST_TEST(test_attr("e1,e2,e2", rule, container));
  131. BOOST_TEST(container.size() == 6);
  132. BOOST_TEST(container == compare);
  133. // test sequences parsing into containers
  134. auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule;
  135. container.clear();
  136. BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container));
  137. // test parsing container into container
  138. auto const cic_rule = string_rule >> +(',' >> string_rule);
  139. container.clear();
  140. BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container));
  141. }
  142. int
  143. main()
  144. {
  145. using x3::traits::is_associative;
  146. using x3::traits::is_reservable;
  147. static_assert(is_reservable<std::vector<int>>::value, "is_reservable problem");
  148. static_assert(is_reservable<std::string>::value, "is_reservable problem");
  149. static_assert(is_reservable<std::unordered_set<int>>::value, "is_reservable problem");
  150. static_assert(is_reservable<boost::unordered_set<int>>::value, "is_reservable problem");
  151. static_assert(is_reservable<std::unordered_multiset<int>>::value, "is_reservable problem");
  152. static_assert(is_reservable<boost::unordered_multiset<int>>::value, "is_reservable problem");
  153. static_assert(is_reservable<std::unordered_map<int,int>>::value, "is_reservable problem");
  154. static_assert(is_reservable<boost::unordered_map<int,int>>::value, "is_reservable problem");
  155. static_assert(is_reservable<std::unordered_multimap<int,int>>::value, "is_reservable problem");
  156. static_assert(is_reservable<boost::unordered_multimap<int,int>>::value, "is_reservable problem");
  157. static_assert(!is_reservable<std::deque<int>>::value, "is_reservable problem");
  158. static_assert(!is_reservable<std::list<int>>::value, "is_reservable problem");
  159. static_assert(!is_reservable<std::set<int>>::value, "is_reservable problem");
  160. static_assert(!is_reservable<std::multiset<int>>::value, "is_reservable problem");
  161. static_assert(!is_reservable<std::map<int,int>>::value, "is_reservable problem");
  162. static_assert(!is_reservable<std::multimap<int,int>>::value, "is_reservable problem");
  163. // ------------------------------------------------------------------
  164. static_assert(is_associative<std::set<int>>::value, "is_associative problem");
  165. static_assert(is_associative<std::unordered_set<int>>::value, "is_associative problem");
  166. static_assert(is_associative<boost::unordered_set<int>>::value, "is_associative problem");
  167. static_assert(is_associative<std::multiset<int>>::value, "is_associative problem");
  168. static_assert(is_associative<std::unordered_multiset<int>>::value, "is_associative problem");
  169. static_assert(is_associative<boost::unordered_multiset<int>>::value, "is_associative problem");
  170. static_assert(is_associative<std::map<int,int>>::value, "is_associative problem");
  171. static_assert(is_associative<std::unordered_map<int,int>>::value, "is_associative problem");
  172. static_assert(is_associative<boost::unordered_map<int,int>>::value, "is_associative problem");
  173. static_assert(is_associative<std::multimap<int,int>>::value, "is_associative problem");
  174. static_assert(is_associative<std::unordered_multimap<int,int>>::value, "is_associative problem");
  175. static_assert(is_associative<boost::unordered_multimap<int,int>>::value, "is_associative problem");
  176. static_assert(!is_associative<std::vector<int>>::value, "is_associative problem");
  177. static_assert(!is_associative<std::string>::value, "is_associative problem");
  178. static_assert(!is_associative<std::deque<int>>::value, "is_associative problem");
  179. static_assert(!is_associative<std::list<int>>::value, "is_associative problem");
  180. // ------------------------------------------------------------------
  181. test_string_support<std::string>();
  182. test_sequence_support<std::vector<std::string>>();
  183. test_sequence_support<std::list<std::string>>();
  184. test_sequence_support<std::deque<std::string>>();
  185. test_set_support<std::set<std::string>>();
  186. test_set_support<std::unordered_set<std::string>>();
  187. test_set_support<boost::unordered_set<std::string>>();
  188. test_multiset_support<std::multiset<std::string>>();
  189. test_multiset_support<std::unordered_multiset<std::string>>();
  190. test_multiset_support<boost::unordered_multiset<std::string>>();
  191. test_map_support<std::map<std::string,std::string>>();
  192. test_map_support<std::unordered_map<std::string,std::string>>();
  193. test_map_support<boost::unordered_map<std::string,std::string>>();
  194. test_multimap_support<std::multimap<std::string,std::string>>();
  195. test_multimap_support<std::unordered_multimap<std::string,std::string>>();
  196. test_multimap_support<boost::unordered_multimap<std::string,std::string>>();
  197. return boost::report_errors();
  198. }