1 /*=============================================================================
2 Copyright (c) 2010 Tim Blechmann
4 Use, modification and distribution is subject to the Boost Software
5 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
9 // random uses boost.fusion, which clashes with boost.test
10 //#define USE_BOOST_RANDOM
12 #ifdef USE_BOOST_RANDOM
13 #include <boost/random.hpp>
18 #include "common_heap_tests.hpp"
21 #define PUSH_WITH_HANDLES(HANDLES, Q, DATA) \
22 std::vector<typename pri_queue::handle_type> HANDLES; \
24 for (unsigned int k = 0; k != data.size(); ++k) \
25 HANDLES.push_back(Q.push(DATA[k]));
29 template <typename pri_queue>
30 void pri_queue_test_update_decrease(void)
32 for (int i = 0; i != test_size; ++i) {
34 test_data data = make_test_data(test_size);
35 PUSH_WITH_HANDLES(handles, q, data);
41 std::sort(data.begin(), data.end());
46 template <typename pri_queue>
47 void pri_queue_test_update_decrease_function(void)
49 for (int i = 0; i != test_size; ++i) {
51 test_data data = make_test_data(test_size);
52 PUSH_WITH_HANDLES(handles, q, data);
55 q.update(handles[i], -1);
57 std::sort(data.begin(), data.end());
62 template <typename pri_queue>
63 void pri_queue_test_update_function_identity(void)
65 for (int i = 0; i != test_size; ++i) {
67 test_data data = make_test_data(test_size);
68 PUSH_WITH_HANDLES(handles, q, data);
70 q.update(handles[i], data[i]);
72 std::sort(data.begin(), data.end());
77 template <typename pri_queue>
78 void pri_queue_test_update_shuffled(void)
81 test_data data = make_test_data(test_size);
82 PUSH_WITH_HANDLES(handles, q, data);
84 test_data shuffled (data);
85 random_shuffle(shuffled.begin(), shuffled.end());
87 for (int i = 0; i != test_size; ++i)
88 q.update(handles[i], shuffled[i]);
94 template <typename pri_queue>
95 void pri_queue_test_update_increase(void)
97 for (int i = 0; i != test_size; ++i) {
99 test_data data = make_test_data(test_size);
100 PUSH_WITH_HANDLES(handles, q, data);
102 data[i] = data.back()+1;
103 *handles[i] = data[i];
104 q.update(handles[i]);
106 std::sort(data.begin(), data.end());
111 template <typename pri_queue>
112 void pri_queue_test_update_increase_function(void)
114 for (int i = 0; i != test_size; ++i) {
116 test_data data = make_test_data(test_size);
117 PUSH_WITH_HANDLES(handles, q, data);
119 data[i] = data.back()+1;
120 q.update(handles[i], data[i]);
122 std::sort(data.begin(), data.end());
127 template <typename pri_queue>
128 void pri_queue_test_decrease(void)
130 for (int i = 0; i != test_size; ++i) {
132 test_data data = make_test_data(test_size);
133 PUSH_WITH_HANDLES(handles, q, data);
137 q.decrease(handles[i]);
139 std::sort(data.begin(), data.end());
144 template <typename pri_queue>
145 void pri_queue_test_decrease_function(void)
147 for (int i = 0; i != test_size; ++i) {
149 test_data data = make_test_data(test_size);
150 PUSH_WITH_HANDLES(handles, q, data);
153 q.decrease(handles[i], -1);
155 std::sort(data.begin(), data.end());
160 template <typename pri_queue>
161 void pri_queue_test_decrease_function_identity(void)
163 for (int i = 0; i != test_size; ++i) {
165 test_data data = make_test_data(test_size);
166 PUSH_WITH_HANDLES(handles, q, data);
168 q.decrease(handles[i], data[i]);
175 template <typename pri_queue>
176 void pri_queue_test_increase(void)
178 for (int i = 0; i != test_size; ++i) {
180 test_data data = make_test_data(test_size);
181 PUSH_WITH_HANDLES(handles, q, data);
183 data[i] = data.back()+1;
184 *handles[i] = data[i];
185 q.increase(handles[i]);
187 std::sort(data.begin(), data.end());
192 template <typename pri_queue>
193 void pri_queue_test_increase_function(void)
195 for (int i = 0; i != test_size; ++i) {
197 test_data data = make_test_data(test_size);
198 PUSH_WITH_HANDLES(handles, q, data);
200 data[i] = data.back()+1;
201 q.increase(handles[i], data[i]);
203 std::sort(data.begin(), data.end());
208 template <typename pri_queue>
209 void pri_queue_test_increase_function_identity(void)
211 for (int i = 0; i != test_size; ++i) {
213 test_data data = make_test_data(test_size);
214 PUSH_WITH_HANDLES(handles, q, data);
216 q.increase(handles[i], data[i]);
222 template <typename pri_queue>
223 void pri_queue_test_erase(void)
225 #ifdef USE_BOOST_RANDOM
229 for (int i = 0; i != test_size; ++i)
232 test_data data = make_test_data(test_size);
233 PUSH_WITH_HANDLES(handles, q, data);
235 for (int j = 0; j != i; ++j)
237 #ifdef USE_BOOST_RANDOM
238 boost::uniform_int<> range(0, data.size() - 1);
239 boost::variate_generator<boost::mt19937&, boost::uniform_int<> > gen(rng, range);
243 int index = std::rand() % (data.size() - 1);
245 q.erase(handles[index]);
246 handles.erase(handles.begin() + index);
247 data.erase(data.begin() + index);
250 std::sort(data.begin(), data.end());
256 template <typename pri_queue>
257 void run_mutable_heap_update_tests(void)
259 pri_queue_test_update_increase<pri_queue>();
260 pri_queue_test_update_decrease<pri_queue>();
262 pri_queue_test_update_shuffled<pri_queue>();
265 template <typename pri_queue>
266 void run_mutable_heap_update_function_tests(void)
268 pri_queue_test_update_increase_function<pri_queue>();
269 pri_queue_test_update_decrease_function<pri_queue>();
270 pri_queue_test_update_function_identity<pri_queue>();
274 template <typename pri_queue>
275 void run_mutable_heap_decrease_tests(void)
277 pri_queue_test_decrease<pri_queue>();
278 pri_queue_test_decrease_function<pri_queue>();
279 pri_queue_test_decrease_function_identity<pri_queue>();
282 template <typename pri_queue>
283 void run_mutable_heap_increase_tests(void)
285 pri_queue_test_increase<pri_queue>();
286 pri_queue_test_increase_function<pri_queue>();
287 pri_queue_test_increase_function_identity<pri_queue>();
290 template <typename pri_queue>
291 void run_mutable_heap_erase_tests(void)
293 pri_queue_test_erase<pri_queue>();
296 template <typename pri_queue>
297 void run_mutable_heap_test_handle_from_iterator(void)
305 que.update(pri_queue::s_handle_from_iterator(que.begin()),
310 template <typename pri_queue>
311 void run_mutable_heap_tests(void)
313 run_mutable_heap_update_function_tests<pri_queue>();
314 run_mutable_heap_update_tests<pri_queue>();
315 run_mutable_heap_decrease_tests<pri_queue>();
316 run_mutable_heap_increase_tests<pri_queue>();
317 run_mutable_heap_erase_tests<pri_queue>();
318 run_mutable_heap_test_handle_from_iterator<pri_queue>();
321 template <typename pri_queue>
322 void run_ordered_iterator_tests()
324 pri_queue_test_ordered_iterators<pri_queue>();