/libs/phoenix/test/algorithm/querying.cpp

https://github.com/eile/boost-svn · C++ · 304 lines · 255 code · 41 blank · 8 comment · 33 complexity · 18cd83ab1ff0cc4e9088a37307e104bc MD5 · raw file

  1. /*=============================================================================
  2. Copyright (c) 2005 Dan Marsden
  3. Copyright (c) 2005-2007 Joel de Guzman
  4. Copyright (c) 2007 Hartmut Kaiser
  5. Distributed under the Boost Software License, Version 1.0. (See accompanying
  6. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. ==============================================================================*/
  8. #include <boost/phoenix/core.hpp>
  9. #include <boost/phoenix/stl/algorithm/querying.hpp>
  10. #include <boost/detail/lightweight_test.hpp>
  11. #include <boost/assign/list_of.hpp>
  12. #include <boost/config.hpp>
  13. #ifdef BOOST_HAS_HASH
  14. #include BOOST_HASH_SET_HEADER
  15. #include BOOST_HASH_MAP_HEADER
  16. #define BOOST_PHOENIX_HAS_HASH
  17. #define BOOST_PHOENIX_HASH_NAMESPACE BOOST_STD_EXTENSION_NAMESPACE
  18. #elif defined(BOOST_DINKUMWARE_STDLIB)
  19. #include <hash_set>
  20. #include <hash_map>
  21. #define BOOST_PHOENIX_HAS_HASH
  22. #define BOOST_PHOENIX_HASH_NAMESPACE stdext
  23. #endif
  24. #include <set>
  25. #include <map>
  26. #include <functional>
  27. namespace
  28. {
  29. struct even
  30. {
  31. bool operator()(const int i) const
  32. {
  33. return i % 2 == 0;
  34. }
  35. };
  36. struct mod_2_comparison
  37. {
  38. bool operator()(
  39. const int lhs,
  40. const int rhs)
  41. {
  42. return lhs % 2 == rhs % 2;
  43. }
  44. };
  45. void find_test()
  46. {
  47. using boost::phoenix::find;
  48. using boost::phoenix::arg_names::arg1;
  49. int array[] = {1,2,3};
  50. BOOST_TEST(find(arg1,2)(array) == array + 1);
  51. std::set<int> s(array, array + 3);
  52. BOOST_TEST(find(arg1, 2)(s) == s.find(2));
  53. std::map<int, int> m = boost::assign::map_list_of(0, 1)(2, 3)(4, 5);
  54. BOOST_TEST(find(arg1, 2)(m) == m.find(2));
  55. #ifdef BOOST_PHOENIX_HAS_HASH
  56. BOOST_PHOENIX_HASH_NAMESPACE::hash_set<int> hs(array, array + 3);
  57. BOOST_TEST(find(arg1, 2)(hs) == hs.find(2));
  58. BOOST_PHOENIX_HASH_NAMESPACE::hash_map<int, int> hm = boost::assign::map_list_of(0, 1)(2, 3)(4, 5);
  59. BOOST_TEST(find(arg1, 2)(hm) == hm.find(2));
  60. #endif
  61. return;
  62. }
  63. void find_if_test()
  64. {
  65. using boost::phoenix::find_if;
  66. using boost::phoenix::arg_names::arg1;
  67. int array[] = {1,2,3};
  68. BOOST_TEST(find_if(arg1, even())(array) == array + 1);
  69. return;
  70. }
  71. void find_end_test()
  72. {
  73. using boost::phoenix::find_end;
  74. using boost::phoenix::arg_names::arg1;
  75. using boost::phoenix::arg_names::arg2;
  76. int array[] = {1,2,3,1,2,3,1};
  77. int pattern[] = {1,2,3};
  78. BOOST_TEST(find_end(arg1, arg2)(array, pattern) == array + 3);
  79. int pattern2[] = {5,6,5};
  80. BOOST_TEST(find_end(arg1, arg2, mod_2_comparison())(array, pattern2) == array + 3);
  81. return;
  82. }
  83. void find_first_of_test()
  84. {
  85. using boost::phoenix::find_first_of;
  86. using boost::phoenix::arg_names::arg1;
  87. using boost::phoenix::arg_names::arg2;
  88. int array[] = {1,2,3};
  89. int search_for[] = {2,3,4};
  90. BOOST_TEST(find_first_of(arg1, arg2)(array, search_for) == array + 1);
  91. int search_for2[] = {0};
  92. BOOST_TEST(find_first_of(arg1, arg2, mod_2_comparison())(array, search_for2) == array + 1);
  93. return;
  94. }
  95. void adjacent_find_test()
  96. {
  97. using boost::phoenix::adjacent_find;
  98. using boost::phoenix::arg_names::arg1;
  99. int array[] = {0,1,3,4,4};
  100. BOOST_TEST(adjacent_find(arg1)(array) == array + 3);
  101. BOOST_TEST(adjacent_find(arg1, mod_2_comparison())(array) == array + 1);
  102. return;
  103. }
  104. void count_test()
  105. {
  106. using boost::phoenix::count;
  107. using boost::phoenix::arg_names::arg1;
  108. int array[] = {1,1,0,1,1};
  109. BOOST_TEST(count(arg1, 1)(array) == 4);
  110. return;
  111. }
  112. void count_if_test()
  113. {
  114. using boost::phoenix::count_if;
  115. using boost::phoenix::arg_names::arg1;
  116. int array[] = {1,2,3,4,5};
  117. BOOST_TEST(count_if(arg1, even())(array) == 2);
  118. return;
  119. }
  120. void distance_test()
  121. {
  122. using boost::phoenix::distance;
  123. using boost::phoenix::arg_names::arg1;
  124. int array[] = {1,1,0,1,1};
  125. BOOST_TEST(distance(arg1)(array) == 5);
  126. return;
  127. }
  128. void mismatch_test()
  129. {
  130. using boost::phoenix::mismatch;
  131. using boost::phoenix::arg_names::arg1;
  132. using boost::phoenix::arg_names::arg2;
  133. int array[] = {1,2,3,4,5};
  134. int search[] = {1,2,4};
  135. BOOST_TEST(
  136. mismatch(arg1, arg2)(array, search) ==
  137. std::make_pair(array + 2, search + 2));
  138. int search2[] = {1,2,1,1};
  139. BOOST_TEST(
  140. mismatch(arg1, arg2, mod_2_comparison())(array, search2)
  141. == std::make_pair(array + 3, search2 + 3));
  142. return;
  143. }
  144. void equal_test()
  145. {
  146. using boost::phoenix::equal;
  147. using boost::phoenix::arg_names::arg1;
  148. using boost::phoenix::arg_names::arg2;
  149. int array[] = {1,2,3};
  150. int array2[] = {1,2,3};
  151. int array3[] = {1,2,4};
  152. BOOST_TEST(
  153. equal(arg1, arg2)(array, array2));
  154. BOOST_TEST(
  155. !equal(arg1, arg2)(array, array3));
  156. BOOST_TEST(
  157. equal(arg1, arg2, mod_2_comparison())(array, array2));
  158. BOOST_TEST(
  159. !equal(arg1, arg2, mod_2_comparison())(array, array3));
  160. return;
  161. }
  162. void search_test()
  163. {
  164. using boost::phoenix::search;
  165. using boost::phoenix::arg_names::arg1;
  166. using boost::phoenix::arg_names::arg2;
  167. int array[] = {1,2,3,1,2,3};
  168. int pattern[] = {2,3};
  169. BOOST_TEST(
  170. search(arg1, arg2)(array, pattern) == array + 1);
  171. int pattern2[] = {1,1};
  172. BOOST_TEST(
  173. search(arg1, arg2, mod_2_comparison())(array, pattern2) == array + 2);
  174. return;
  175. }
  176. void lower_bound_test()
  177. {
  178. using boost::phoenix::lower_bound;
  179. using boost::phoenix::arg_names::arg1;
  180. int array[] = {1,2,3};
  181. const std::set<int> test_set(array, array + 3);
  182. BOOST_TEST(lower_bound(arg1, 2)(array) == array + 1);
  183. BOOST_TEST(lower_bound(arg1, 2)(test_set) == test_set.lower_bound(2));
  184. int array2[] = {3,2,1};
  185. const std::set<int, std::greater<int> > test_set2(array2, array2 + 3);
  186. BOOST_TEST(boost::phoenix::lower_bound(arg1, 2, std::greater<int>())(array2) ==
  187. array2 + 1);
  188. BOOST_TEST(boost::phoenix::lower_bound(arg1, 2, std::greater<int>())(test_set2) ==
  189. test_set2.lower_bound(2));
  190. return;
  191. }
  192. void upper_bound_test()
  193. {
  194. using boost::phoenix::upper_bound;
  195. using boost::phoenix::arg_names::arg1;
  196. int array[] = {1,2,3};
  197. const std::set<int> test_set(array, array + 3);
  198. BOOST_TEST(upper_bound(arg1, 2)(array) == array + 2);
  199. BOOST_TEST(upper_bound(arg1, 2)(test_set) == test_set.upper_bound(2));
  200. int array2[] = {3,2,1};
  201. const std::set<int, std::greater<int> > test_set2(array2, array2 + 3);
  202. BOOST_TEST(boost::phoenix::upper_bound(arg1, 2, std::greater<int>())(array2) ==
  203. array2 + 2);
  204. BOOST_TEST(boost::phoenix::upper_bound(arg1, 2, std::greater<int>())(test_set2) ==
  205. test_set2.upper_bound(2));
  206. return;
  207. }
  208. void equal_range_test()
  209. {
  210. using boost::phoenix::equal_range;
  211. using boost::phoenix::arg_names::arg1;
  212. int array[] = {1,2,2,3};
  213. const std::set<int> test_set(array, array + 4);
  214. BOOST_TEST(equal_range(arg1, 2)(array).first ==
  215. array + 1);
  216. BOOST_TEST(equal_range(arg1, 2)(array).second ==
  217. array + 3);
  218. BOOST_TEST(equal_range(arg1, 2)(test_set).first ==
  219. test_set.equal_range(2).first);
  220. BOOST_TEST(equal_range(arg1, 2)(test_set).second ==
  221. test_set.equal_range(2).second);
  222. int array2[] = {3,2,2,1};
  223. const std::set<int, std::greater<int> > test_set2(array2, array2 + 4);
  224. BOOST_TEST(boost::phoenix::equal_range(arg1, 2, std::greater<int>())(array2).first ==
  225. array2 + 1);
  226. BOOST_TEST(boost::phoenix::equal_range(arg1, 2, std::greater<int>())(array2).second ==
  227. array2 + 3);
  228. BOOST_TEST(boost::phoenix::equal_range(arg1, 2, std::greater<int>())(test_set2).first ==
  229. test_set2.equal_range(2).first);
  230. BOOST_TEST(boost::phoenix::equal_range(arg1, 2, std::greater<int>())(test_set2).second ==
  231. test_set2.equal_range(2).second);
  232. return;
  233. }
  234. void binary_search_test()
  235. {
  236. using boost::phoenix::binary_search;
  237. using boost::phoenix::arg_names::arg1;
  238. int array[] = {1,2,3};
  239. BOOST_TEST(binary_search(arg1, 2)(array));
  240. BOOST_TEST(!binary_search(arg1, 4)(array));
  241. return;
  242. }
  243. }
  244. int main()
  245. {
  246. find_test();
  247. find_if_test();
  248. find_end_test();
  249. find_first_of_test();
  250. adjacent_find_test();
  251. count_test();
  252. count_if_test();
  253. distance_test();
  254. mismatch_test();
  255. equal_test();
  256. search_test();
  257. lower_bound_test();
  258. upper_bound_test();
  259. equal_range_test();
  260. binary_search_test();
  261. return boost::report_errors();
  262. }