mutable_heap_tests.hpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. /*=============================================================================
  2. Copyright (c) 2010 Tim Blechmann
  3. Use, modification and distribution is subject to the Boost Software
  4. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt)
  6. =============================================================================*/
  7. // random uses boost.fusion, which clashes with boost.test
  8. //#define USE_BOOST_RANDOM
  9. #ifdef USE_BOOST_RANDOM
  10. #include <boost/random.hpp>
  11. #else
  12. #include <cstdlib>
  13. #endif
  14. #include "common_heap_tests.hpp"
  15. #define PUSH_WITH_HANDLES(HANDLES, Q, DATA) \
  16. std::vector<typename pri_queue::handle_type> HANDLES; \
  17. \
  18. for (unsigned int k = 0; k != data.size(); ++k) \
  19. HANDLES.push_back(Q.push(DATA[k]));
  20. template <typename pri_queue>
  21. void pri_queue_test_update_decrease(void)
  22. {
  23. for (int i = 0; i != test_size; ++i) {
  24. pri_queue q;
  25. test_data data = make_test_data(test_size);
  26. PUSH_WITH_HANDLES(handles, q, data);
  27. *handles[i] = -1;
  28. data[i] = -1;
  29. q.update(handles[i]);
  30. std::sort(data.begin(), data.end());
  31. check_q(q, data);
  32. }
  33. }
  34. template <typename pri_queue>
  35. void pri_queue_test_update_decrease_function(void)
  36. {
  37. for (int i = 0; i != test_size; ++i) {
  38. pri_queue q;
  39. test_data data = make_test_data(test_size);
  40. PUSH_WITH_HANDLES(handles, q, data);
  41. data[i] = -1;
  42. q.update(handles[i], -1);
  43. std::sort(data.begin(), data.end());
  44. check_q(q, data);
  45. }
  46. }
  47. template <typename pri_queue>
  48. void pri_queue_test_update_function_identity(void)
  49. {
  50. for (int i = 0; i != test_size; ++i) {
  51. pri_queue q;
  52. test_data data = make_test_data(test_size);
  53. PUSH_WITH_HANDLES(handles, q, data);
  54. q.update(handles[i], data[i]);
  55. std::sort(data.begin(), data.end());
  56. check_q(q, data);
  57. }
  58. }
  59. template <typename pri_queue>
  60. void pri_queue_test_update_shuffled(void)
  61. {
  62. pri_queue q;
  63. test_data data = make_test_data(test_size);
  64. PUSH_WITH_HANDLES(handles, q, data);
  65. test_data shuffled (data);
  66. random_shuffle(shuffled.begin(), shuffled.end());
  67. for (int i = 0; i != test_size; ++i)
  68. q.update(handles[i], shuffled[i]);
  69. check_q(q, data);
  70. }
  71. template <typename pri_queue>
  72. void pri_queue_test_update_increase(void)
  73. {
  74. for (int i = 0; i != test_size; ++i) {
  75. pri_queue q;
  76. test_data data = make_test_data(test_size);
  77. PUSH_WITH_HANDLES(handles, q, data);
  78. data[i] = data.back()+1;
  79. *handles[i] = data[i];
  80. q.update(handles[i]);
  81. std::sort(data.begin(), data.end());
  82. check_q(q, data);
  83. }
  84. }
  85. template <typename pri_queue>
  86. void pri_queue_test_update_increase_function(void)
  87. {
  88. for (int i = 0; i != test_size; ++i) {
  89. pri_queue q;
  90. test_data data = make_test_data(test_size);
  91. PUSH_WITH_HANDLES(handles, q, data);
  92. data[i] = data.back()+1;
  93. q.update(handles[i], data[i]);
  94. std::sort(data.begin(), data.end());
  95. check_q(q, data);
  96. }
  97. }
  98. template <typename pri_queue>
  99. void pri_queue_test_decrease(void)
  100. {
  101. for (int i = 0; i != test_size; ++i) {
  102. pri_queue q;
  103. test_data data = make_test_data(test_size);
  104. PUSH_WITH_HANDLES(handles, q, data);
  105. *handles[i] = -1;
  106. data[i] = -1;
  107. q.decrease(handles[i]);
  108. std::sort(data.begin(), data.end());
  109. check_q(q, data);
  110. }
  111. }
  112. template <typename pri_queue>
  113. void pri_queue_test_decrease_function(void)
  114. {
  115. for (int i = 0; i != test_size; ++i) {
  116. pri_queue q;
  117. test_data data = make_test_data(test_size);
  118. PUSH_WITH_HANDLES(handles, q, data);
  119. data[i] = -1;
  120. q.decrease(handles[i], -1);
  121. std::sort(data.begin(), data.end());
  122. check_q(q, data);
  123. }
  124. }
  125. template <typename pri_queue>
  126. void pri_queue_test_decrease_function_identity(void)
  127. {
  128. for (int i = 0; i != test_size; ++i) {
  129. pri_queue q;
  130. test_data data = make_test_data(test_size);
  131. PUSH_WITH_HANDLES(handles, q, data);
  132. q.decrease(handles[i], data[i]);
  133. check_q(q, data);
  134. }
  135. }
  136. template <typename pri_queue>
  137. void pri_queue_test_increase(void)
  138. {
  139. for (int i = 0; i != test_size; ++i) {
  140. pri_queue q;
  141. test_data data = make_test_data(test_size);
  142. PUSH_WITH_HANDLES(handles, q, data);
  143. data[i] = data.back()+1;
  144. *handles[i] = data[i];
  145. q.increase(handles[i]);
  146. std::sort(data.begin(), data.end());
  147. check_q(q, data);
  148. }
  149. }
  150. template <typename pri_queue>
  151. void pri_queue_test_increase_function(void)
  152. {
  153. for (int i = 0; i != test_size; ++i) {
  154. pri_queue q;
  155. test_data data = make_test_data(test_size);
  156. PUSH_WITH_HANDLES(handles, q, data);
  157. data[i] = data.back()+1;
  158. q.increase(handles[i], data[i]);
  159. std::sort(data.begin(), data.end());
  160. check_q(q, data);
  161. }
  162. }
  163. template <typename pri_queue>
  164. void pri_queue_test_increase_function_identity(void)
  165. {
  166. for (int i = 0; i != test_size; ++i) {
  167. pri_queue q;
  168. test_data data = make_test_data(test_size);
  169. PUSH_WITH_HANDLES(handles, q, data);
  170. q.increase(handles[i], data[i]);
  171. check_q(q, data);
  172. }
  173. }
  174. template <typename pri_queue>
  175. void pri_queue_test_erase(void)
  176. {
  177. #ifdef USE_BOOST_RANDOM
  178. boost::mt19937 rng;
  179. #endif
  180. for (int i = 0; i != test_size; ++i)
  181. {
  182. pri_queue q;
  183. test_data data = make_test_data(test_size);
  184. PUSH_WITH_HANDLES(handles, q, data);
  185. for (int j = 0; j != i; ++j)
  186. {
  187. #ifdef USE_BOOST_RANDOM
  188. boost::uniform_int<> range(0, data.size() - 1);
  189. boost::variate_generator<boost::mt19937&, boost::uniform_int<> > gen(rng, range);
  190. int index = gen();
  191. #else
  192. int index = std::rand() % (data.size() - 1);
  193. #endif
  194. q.erase(handles[index]);
  195. handles.erase(handles.begin() + index);
  196. data.erase(data.begin() + index);
  197. }
  198. std::sort(data.begin(), data.end());
  199. check_q(q, data);
  200. }
  201. }
  202. template <typename pri_queue>
  203. void run_mutable_heap_update_tests(void)
  204. {
  205. pri_queue_test_update_increase<pri_queue>();
  206. pri_queue_test_update_decrease<pri_queue>();
  207. pri_queue_test_update_shuffled<pri_queue>();
  208. }
  209. template <typename pri_queue>
  210. void run_mutable_heap_update_function_tests(void)
  211. {
  212. pri_queue_test_update_increase_function<pri_queue>();
  213. pri_queue_test_update_decrease_function<pri_queue>();
  214. pri_queue_test_update_function_identity<pri_queue>();
  215. }
  216. template <typename pri_queue>
  217. void run_mutable_heap_decrease_tests(void)
  218. {
  219. pri_queue_test_decrease<pri_queue>();
  220. pri_queue_test_decrease_function<pri_queue>();
  221. pri_queue_test_decrease_function_identity<pri_queue>();
  222. }
  223. template <typename pri_queue>
  224. void run_mutable_heap_increase_tests(void)
  225. {
  226. pri_queue_test_increase<pri_queue>();
  227. pri_queue_test_increase_function<pri_queue>();
  228. pri_queue_test_increase_function_identity<pri_queue>();
  229. }
  230. template <typename pri_queue>
  231. void run_mutable_heap_erase_tests(void)
  232. {
  233. pri_queue_test_erase<pri_queue>();
  234. }
  235. template <typename pri_queue>
  236. void run_mutable_heap_test_handle_from_iterator(void)
  237. {
  238. pri_queue que;
  239. que.push(3);
  240. que.push(1);
  241. que.push(4);
  242. que.update(pri_queue::s_handle_from_iterator(que.begin()),
  243. 6);
  244. }
  245. template <typename pri_queue>
  246. void run_mutable_heap_tests(void)
  247. {
  248. run_mutable_heap_update_function_tests<pri_queue>();
  249. run_mutable_heap_update_tests<pri_queue>();
  250. run_mutable_heap_decrease_tests<pri_queue>();
  251. run_mutable_heap_increase_tests<pri_queue>();
  252. run_mutable_heap_erase_tests<pri_queue>();
  253. run_mutable_heap_test_handle_from_iterator<pri_queue>();
  254. }
  255. template <typename pri_queue>
  256. void run_ordered_iterator_tests()
  257. {
  258. pri_queue_test_ordered_iterators<pri_queue>();
  259. }