1 // random uses boost.fusion, which clashes with boost.test
2 //#define USE_BOOST_RANDOM
4 #ifdef USE_BOOST_RANDOM
5 #include <boost/random.hpp>
10 #include "common_heap_tests.hpp"
13 #define PUSH_WITH_HANDLES(HANDLES, Q, DATA) \
14 std::vector<typename pri_queue::handle_type> HANDLES; \
16 for (unsigned int k = 0; k != data.size(); ++k) \
17 HANDLES.push_back(Q.push(DATA[k]));
21 template <typename pri_queue>
22 void pri_queue_test_update_decrease(void)
24 for (int i = 0; i != test_size; ++i) {
26 test_data data = make_test_data(test_size);
27 PUSH_WITH_HANDLES(handles, q, data);
33 std::sort(data.begin(), data.end());
38 template <typename pri_queue>
39 void pri_queue_test_update_decrease_function(void)
41 for (int i = 0; i != test_size; ++i) {
43 test_data data = make_test_data(test_size);
44 PUSH_WITH_HANDLES(handles, q, data);
47 q.update(handles[i], -1);
49 std::sort(data.begin(), data.end());
54 template <typename pri_queue>
55 void pri_queue_test_update_function_identity(void)
57 for (int i = 0; i != test_size; ++i) {
59 test_data data = make_test_data(test_size);
60 PUSH_WITH_HANDLES(handles, q, data);
62 q.update(handles[i], data[i]);
64 std::sort(data.begin(), data.end());
69 template <typename pri_queue>
70 void pri_queue_test_update_shuffled(void)
73 test_data data = make_test_data(test_size);
74 PUSH_WITH_HANDLES(handles, q, data);
76 test_data shuffled (data);
77 std::random_shuffle(shuffled.begin(), shuffled.end());
79 for (int i = 0; i != test_size; ++i)
80 q.update(handles[i], shuffled[i]);
86 template <typename pri_queue>
87 void pri_queue_test_update_increase(void)
89 for (int i = 0; i != test_size; ++i) {
91 test_data data = make_test_data(test_size);
92 PUSH_WITH_HANDLES(handles, q, data);
94 data[i] = data.back()+1;
95 *handles[i] = data[i];
98 std::sort(data.begin(), data.end());
103 template <typename pri_queue>
104 void pri_queue_test_update_increase_function(void)
106 for (int i = 0; i != test_size; ++i) {
108 test_data data = make_test_data(test_size);
109 PUSH_WITH_HANDLES(handles, q, data);
111 data[i] = data.back()+1;
112 q.update(handles[i], data[i]);
114 std::sort(data.begin(), data.end());
119 template <typename pri_queue>
120 void pri_queue_test_decrease(void)
122 for (int i = 0; i != test_size; ++i) {
124 test_data data = make_test_data(test_size);
125 PUSH_WITH_HANDLES(handles, q, data);
129 q.decrease(handles[i]);
131 std::sort(data.begin(), data.end());
136 template <typename pri_queue>
137 void pri_queue_test_decrease_function(void)
139 for (int i = 0; i != test_size; ++i) {
141 test_data data = make_test_data(test_size);
142 PUSH_WITH_HANDLES(handles, q, data);
145 q.decrease(handles[i], -1);
147 std::sort(data.begin(), data.end());
152 template <typename pri_queue>
153 void pri_queue_test_decrease_function_identity(void)
155 for (int i = 0; i != test_size; ++i) {
157 test_data data = make_test_data(test_size);
158 PUSH_WITH_HANDLES(handles, q, data);
160 q.decrease(handles[i], data[i]);
167 template <typename pri_queue>
168 void pri_queue_test_increase(void)
170 for (int i = 0; i != test_size; ++i) {
172 test_data data = make_test_data(test_size);
173 PUSH_WITH_HANDLES(handles, q, data);
175 data[i] = data.back()+1;
176 *handles[i] = data[i];
177 q.increase(handles[i]);
179 std::sort(data.begin(), data.end());
184 template <typename pri_queue>
185 void pri_queue_test_increase_function(void)
187 for (int i = 0; i != test_size; ++i) {
189 test_data data = make_test_data(test_size);
190 PUSH_WITH_HANDLES(handles, q, data);
192 data[i] = data.back()+1;
193 q.increase(handles[i], data[i]);
195 std::sort(data.begin(), data.end());
200 template <typename pri_queue>
201 void pri_queue_test_increase_function_identity(void)
203 for (int i = 0; i != test_size; ++i) {
205 test_data data = make_test_data(test_size);
206 PUSH_WITH_HANDLES(handles, q, data);
208 q.increase(handles[i], data[i]);
214 template <typename pri_queue>
215 void pri_queue_test_erase(void)
217 #ifdef USE_BOOST_RANDOM
221 for (int i = 0; i != test_size; ++i)
224 test_data data = make_test_data(test_size);
225 PUSH_WITH_HANDLES(handles, q, data);
227 for (int j = 0; j != i; ++j)
229 #ifdef USE_BOOST_RANDOM
230 boost::uniform_int<> range(0, data.size() - 1);
231 boost::variate_generator<boost::mt19937&, boost::uniform_int<> > gen(rng, range);
235 int index = rand() % (data.size() - 1);
237 q.erase(handles[index]);
238 handles.erase(handles.begin() + index);
239 data.erase(data.begin() + index);
242 std::sort(data.begin(), data.end());
248 template <typename pri_queue>
249 void run_mutable_heap_update_tests(void)
251 pri_queue_test_update_increase<pri_queue>();
252 pri_queue_test_update_decrease<pri_queue>();
254 pri_queue_test_update_shuffled<pri_queue>();
257 template <typename pri_queue>
258 void run_mutable_heap_update_function_tests(void)
260 pri_queue_test_update_increase_function<pri_queue>();
261 pri_queue_test_update_decrease_function<pri_queue>();
262 pri_queue_test_update_function_identity<pri_queue>();
266 template <typename pri_queue>
267 void run_mutable_heap_decrease_tests(void)
269 pri_queue_test_decrease<pri_queue>();
270 pri_queue_test_decrease_function<pri_queue>();
271 pri_queue_test_decrease_function_identity<pri_queue>();
274 template <typename pri_queue>
275 void run_mutable_heap_increase_tests(void)
277 pri_queue_test_increase<pri_queue>();
278 pri_queue_test_increase_function<pri_queue>();
279 pri_queue_test_increase_function_identity<pri_queue>();
282 template <typename pri_queue>
283 void run_mutable_heap_erase_tests(void)
285 pri_queue_test_erase<pri_queue>();
289 template <typename pri_queue>
290 void run_mutable_heap_tests(void)
292 run_mutable_heap_update_function_tests<pri_queue>();
293 run_mutable_heap_update_tests<pri_queue>();
294 run_mutable_heap_decrease_tests<pri_queue>();
295 run_mutable_heap_increase_tests<pri_queue>();
296 run_mutable_heap_erase_tests<pri_queue>();
299 template <typename pri_queue>
300 void run_ordered_iterator_tests()
302 pri_queue_test_ordered_iterators<pri_queue>();