switch_construct.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. // switch_test.cpp -- The Boost Lambda Library --------------------------
  2. //
  3. // Copyright (C) 2000-2003 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
  4. // Copyright (C) 2000-2003 Gary Powell (powellg@amazon.com)
  5. //
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // For more information, see www.boost.org
  11. // -----------------------------------------------------------------------
  12. #include <boost/test/minimal.hpp> // see "Header Implementation Option"
  13. #include "boost/lambda/lambda.hpp"
  14. #include "boost/lambda/if.hpp"
  15. #include "boost/lambda/switch.hpp"
  16. #include <iostream>
  17. #include <algorithm>
  18. #include <vector>
  19. #include <string>
  20. // Check that elements 0 -- index are 1, and the rest are 0
  21. bool check(const std::vector<int>& v, int index) {
  22. using namespace boost::lambda;
  23. int counter = 0;
  24. std::vector<int>::const_iterator
  25. result = std::find_if(v.begin(), v.end(),
  26. ! if_then_else_return(
  27. var(counter)++ <= index,
  28. _1 == 1,
  29. _1 == 0)
  30. );
  31. return result == v.end();
  32. }
  33. void do_switch_no_defaults_tests() {
  34. using namespace boost::lambda;
  35. int i = 0;
  36. std::vector<int> v,w;
  37. // elements from 0 to 9
  38. std::generate_n(std::back_inserter(v),
  39. 10,
  40. var(i)++);
  41. std::fill_n(std::back_inserter(w), 10, 0);
  42. // ---
  43. std::for_each(v.begin(), v.end(),
  44. switch_statement(
  45. _1,
  46. case_statement<0>(++var(w[0]))
  47. )
  48. );
  49. BOOST_CHECK(check(w, 0));
  50. std::fill_n(w.begin(), 10, 0);
  51. // ---
  52. std::for_each(v.begin(), v.end(),
  53. switch_statement(
  54. _1,
  55. case_statement<0>(++var(w[0])),
  56. case_statement<1>(++var(w[1]))
  57. )
  58. );
  59. BOOST_CHECK(check(w, 1));
  60. std::fill_n(w.begin(), 10, 0);
  61. // ---
  62. std::for_each(v.begin(), v.end(),
  63. switch_statement(
  64. _1,
  65. case_statement<0>(++var(w[0])),
  66. case_statement<1>(++var(w[1])),
  67. case_statement<2>(++var(w[2]))
  68. )
  69. );
  70. BOOST_CHECK(check(w, 2));
  71. std::fill_n(w.begin(), 10, 0);
  72. // ---
  73. std::for_each(v.begin(), v.end(),
  74. switch_statement(
  75. _1,
  76. case_statement<0>(++var(w[0])),
  77. case_statement<1>(++var(w[1])),
  78. case_statement<2>(++var(w[2])),
  79. case_statement<3>(++var(w[3]))
  80. )
  81. );
  82. BOOST_CHECK(check(w, 3));
  83. std::fill_n(w.begin(), 10, 0);
  84. // ---
  85. std::for_each(v.begin(), v.end(),
  86. switch_statement(
  87. _1,
  88. case_statement<0>(++var(w[0])),
  89. case_statement<1>(++var(w[1])),
  90. case_statement<2>(++var(w[2])),
  91. case_statement<3>(++var(w[3])),
  92. case_statement<4>(++var(w[4]))
  93. )
  94. );
  95. BOOST_CHECK(check(w, 4));
  96. std::fill_n(w.begin(), 10, 0);
  97. // ---
  98. std::for_each(v.begin(), v.end(),
  99. switch_statement(
  100. _1,
  101. case_statement<0>(++var(w[0])),
  102. case_statement<1>(++var(w[1])),
  103. case_statement<2>(++var(w[2])),
  104. case_statement<3>(++var(w[3])),
  105. case_statement<4>(++var(w[4])),
  106. case_statement<5>(++var(w[5]))
  107. )
  108. );
  109. BOOST_CHECK(check(w, 5));
  110. std::fill_n(w.begin(), 10, 0);
  111. // ---
  112. std::for_each(v.begin(), v.end(),
  113. switch_statement(
  114. _1,
  115. case_statement<0>(++var(w[0])),
  116. case_statement<1>(++var(w[1])),
  117. case_statement<2>(++var(w[2])),
  118. case_statement<3>(++var(w[3])),
  119. case_statement<4>(++var(w[4])),
  120. case_statement<5>(++var(w[5])),
  121. case_statement<6>(++var(w[6]))
  122. )
  123. );
  124. BOOST_CHECK(check(w, 6));
  125. std::fill_n(w.begin(), 10, 0);
  126. // ---
  127. std::for_each(v.begin(), v.end(),
  128. switch_statement(
  129. _1,
  130. case_statement<0>(++var(w[0])),
  131. case_statement<1>(++var(w[1])),
  132. case_statement<2>(++var(w[2])),
  133. case_statement<3>(++var(w[3])),
  134. case_statement<4>(++var(w[4])),
  135. case_statement<5>(++var(w[5])),
  136. case_statement<6>(++var(w[6])),
  137. case_statement<7>(++var(w[7]))
  138. )
  139. );
  140. BOOST_CHECK(check(w, 7));
  141. std::fill_n(w.begin(), 10, 0);
  142. // ---
  143. std::for_each(v.begin(), v.end(),
  144. switch_statement(
  145. _1,
  146. case_statement<0>(++var(w[0])),
  147. case_statement<1>(++var(w[1])),
  148. case_statement<2>(++var(w[2])),
  149. case_statement<3>(++var(w[3])),
  150. case_statement<4>(++var(w[4])),
  151. case_statement<5>(++var(w[5])),
  152. case_statement<6>(++var(w[6])),
  153. case_statement<7>(++var(w[7])),
  154. case_statement<8>(++var(w[8]))
  155. )
  156. );
  157. BOOST_CHECK(check(w, 8));
  158. std::fill_n(w.begin(), 10, 0);
  159. }
  160. void do_switch_yes_defaults_tests() {
  161. using namespace boost::lambda;
  162. int i = 0;
  163. std::vector<int> v,w;
  164. // elements from 0 to 9
  165. std::generate_n(std::back_inserter(v),
  166. 10,
  167. var(i)++);
  168. std::fill_n(std::back_inserter(w), 10, 0);
  169. int default_count;
  170. // ---
  171. default_count = 0;
  172. std::for_each(v.begin(), v.end(),
  173. switch_statement(
  174. _1,
  175. default_statement(++var(default_count))
  176. )
  177. );
  178. BOOST_CHECK(check(w, -1));
  179. BOOST_CHECK(default_count == 10);
  180. std::fill_n(w.begin(), 10, 0);
  181. // ---
  182. default_count = 0;
  183. std::for_each(v.begin(), v.end(),
  184. switch_statement(
  185. _1,
  186. case_statement<0>(++var(w[0])),
  187. default_statement(++var(default_count))
  188. )
  189. );
  190. BOOST_CHECK(check(w, 0));
  191. BOOST_CHECK(default_count == 9);
  192. std::fill_n(w.begin(), 10, 0);
  193. // ---
  194. default_count = 0;
  195. std::for_each(v.begin(), v.end(),
  196. switch_statement(
  197. _1,
  198. case_statement<0>(++var(w[0])),
  199. case_statement<1>(++var(w[1])),
  200. default_statement(++var(default_count))
  201. )
  202. );
  203. BOOST_CHECK(check(w, 1));
  204. BOOST_CHECK(default_count == 8);
  205. std::fill_n(w.begin(), 10, 0);
  206. // ---
  207. default_count = 0;
  208. std::for_each(v.begin(), v.end(),
  209. switch_statement(
  210. _1,
  211. case_statement<0>(++var(w[0])),
  212. case_statement<1>(++var(w[1])),
  213. case_statement<2>(++var(w[2])),
  214. default_statement(++var(default_count))
  215. )
  216. );
  217. BOOST_CHECK(check(w, 2));
  218. BOOST_CHECK(default_count == 7);
  219. std::fill_n(w.begin(), 10, 0);
  220. // ---
  221. default_count = 0;
  222. std::for_each(v.begin(), v.end(),
  223. switch_statement(
  224. _1,
  225. case_statement<0>(++var(w[0])),
  226. case_statement<1>(++var(w[1])),
  227. case_statement<2>(++var(w[2])),
  228. case_statement<3>(++var(w[3])),
  229. default_statement(++var(default_count))
  230. )
  231. );
  232. BOOST_CHECK(check(w, 3));
  233. BOOST_CHECK(default_count == 6);
  234. std::fill_n(w.begin(), 10, 0);
  235. // ---
  236. default_count = 0;
  237. std::for_each(v.begin(), v.end(),
  238. switch_statement(
  239. _1,
  240. case_statement<0>(++var(w[0])),
  241. case_statement<1>(++var(w[1])),
  242. case_statement<2>(++var(w[2])),
  243. case_statement<3>(++var(w[3])),
  244. case_statement<4>(++var(w[4])),
  245. default_statement(++var(default_count))
  246. )
  247. );
  248. BOOST_CHECK(check(w, 4));
  249. BOOST_CHECK(default_count == 5);
  250. std::fill_n(w.begin(), 10, 0);
  251. // ---
  252. default_count = 0;
  253. std::for_each(v.begin(), v.end(),
  254. switch_statement(
  255. _1,
  256. case_statement<0>(++var(w[0])),
  257. case_statement<1>(++var(w[1])),
  258. case_statement<2>(++var(w[2])),
  259. case_statement<3>(++var(w[3])),
  260. case_statement<4>(++var(w[4])),
  261. case_statement<5>(++var(w[5])),
  262. default_statement(++var(default_count))
  263. )
  264. );
  265. BOOST_CHECK(check(w, 5));
  266. BOOST_CHECK(default_count == 4);
  267. std::fill_n(w.begin(), 10, 0);
  268. // ---
  269. default_count = 0;
  270. std::for_each(v.begin(), v.end(),
  271. switch_statement(
  272. _1,
  273. case_statement<0>(++var(w[0])),
  274. case_statement<1>(++var(w[1])),
  275. case_statement<2>(++var(w[2])),
  276. case_statement<3>(++var(w[3])),
  277. case_statement<4>(++var(w[4])),
  278. case_statement<5>(++var(w[5])),
  279. case_statement<6>(++var(w[6])),
  280. default_statement(++var(default_count))
  281. )
  282. );
  283. BOOST_CHECK(check(w, 6));
  284. BOOST_CHECK(default_count == 3);
  285. std::fill_n(w.begin(), 10, 0);
  286. // ---
  287. default_count = 0;
  288. std::for_each(v.begin(), v.end(),
  289. switch_statement(
  290. _1,
  291. case_statement<0>(++var(w[0])),
  292. case_statement<1>(++var(w[1])),
  293. case_statement<2>(++var(w[2])),
  294. case_statement<3>(++var(w[3])),
  295. case_statement<4>(++var(w[4])),
  296. case_statement<5>(++var(w[5])),
  297. case_statement<6>(++var(w[6])),
  298. case_statement<7>(++var(w[7])),
  299. default_statement(++var(default_count))
  300. )
  301. );
  302. BOOST_CHECK(check(w, 7));
  303. BOOST_CHECK(default_count == 2);
  304. std::fill_n(w.begin(), 10, 0);
  305. }
  306. void test_empty_cases() {
  307. using namespace boost::lambda;
  308. // ---
  309. switch_statement(
  310. _1,
  311. default_statement()
  312. )(make_const(1));
  313. switch_statement(
  314. _1,
  315. case_statement<1>()
  316. )(make_const(1));
  317. }
  318. int test_main(int, char* []) {
  319. do_switch_no_defaults_tests();
  320. do_switch_yes_defaults_tests();
  321. test_empty_cases();
  322. return EXIT_SUCCESS;
  323. }