]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.h
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / util / regression / rand / assoc / container_rand_regression_test.h
1 // -*- C++ -*-
2
3 // Copyright (C) 2005-2019 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the terms
7 // of the GNU General Public License as published by the Free Software
8 // Foundation; either version 3, or (at your option) any later
9 // version.
10
11 // This library is distributed in the hope that it will be useful, but
12 // WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // General Public License for more details.
15
16 // You should have received a copy of the GNU General Public License
17 // along with this library; see the file COPYING3. If not see
18 // <http://www.gnu.org/licenses/>.
19
20
21 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
22
23 // Permission to use, copy, modify, sell, and distribute this software
24 // is hereby granted without fee, provided that the above copyright
25 // notice appears in all copies, and that both that copyright notice
26 // and this permission notice appear in supporting documentation. None
27 // of the above authors, nor IBM Haifa Research Laboratories, make any
28 // representation about the suitability of this software for any
29 // purpose. It is provided "as is" without express or implied
30 // warranty.
31
32 /**
33 * @file container_rand_regression_test.h
34 * Contains a random regression test for a specific container type.
35 */
36
37 #ifndef PB_DS_CONTAINER_RAND_REGRESSION_TEST_H
38 #define PB_DS_CONTAINER_RAND_REGRESSION_TEST_H
39
40 #include <algorithm>
41 #include <string>
42 #include <sstream>
43 #include <utility>
44 #include <ext/pb_ds/assoc_container.hpp>
45 #include <io/prog_bar.hpp>
46 #include <testsuite_rng.h>
47 #include <regression/trait/assoc/trait.hpp>
48 #include <common_type/assoc/string_form.hpp>
49 #include <regression/rand/xml_formatter.hpp>
50
51 namespace __gnu_pbds
52 {
53 namespace test
54 {
55 namespace detail
56 {
57 // Rand test specialized for a specific container.
58 template<typename Cntnr>
59 class container_rand_regression_test
60 {
61 public:
62
63 container_rand_regression_test(unsigned long, size_t, size_t, double,
64 double, double, double, double, bool);
65
66 virtual
67 ~container_rand_regression_test();
68
69 void
70 operator()();
71
72 private:
73 typedef Cntnr cntnr;
74 typedef typename cntnr::allocator_type allocator_type;
75 typedef typename cntnr::size_type size_type;
76 typedef regression_test_traits<Cntnr> test_traits;
77 typedef typename test_traits::key_type key_type;
78 typedef typename test_traits::key_const_reference key_const_reference;
79 typedef typename test_traits::value_type value_type;
80 typedef typename test_traits::native_type native_type;
81 typedef twister_rand_gen gen;
82 typedef __gnu_pbds::container_traits<Cntnr> container_traits;
83 typedef __gnu_cxx::throw_allocator_random<char> alloc_t;
84
85 enum op
86 {
87 insert_op,
88 erase_op,
89 clear_op,
90 other_op
91 };
92
93 op
94 get_next_op();
95
96 size_t
97 get_next_sub_op(size_t);
98
99 static void
100 defs();
101
102 static void
103 key_defs();
104
105 static void
106 mapped_defs();
107
108 static void
109 value_defs();
110
111 static void
112 ds_defs();
113
114 static void
115 iterator_defs();
116
117 static void
118 node_iterator_defs(__gnu_pbds::detail::false_type);
119
120 static void
121 node_iterator_defs(__gnu_pbds::detail::true_type);
122
123 static void
124 policy_defs();
125
126 static void
127 policy_defs(__gnu_pbds::basic_hash_tag);
128
129 static void
130 policy_defs(__gnu_pbds::cc_hash_tag);
131
132 static void
133 policy_defs(__gnu_pbds::gp_hash_tag);
134
135 static void
136 policy_defs(__gnu_pbds::tree_tag);
137
138 static void
139 policy_defs(__gnu_pbds::list_update_tag);
140
141 static void
142 policy_defs(__gnu_pbds::pat_trie_tag);
143
144 void
145 policy_access();
146
147 void
148 policy_access(__gnu_pbds::basic_hash_tag);
149
150 void
151 policy_access(__gnu_pbds::cc_hash_tag);
152
153 void
154 policy_access(__gnu_pbds::gp_hash_tag);
155
156 void
157 policy_access(__gnu_pbds::tree_tag);
158
159 void
160 policy_access(__gnu_pbds::list_update_tag);
161
162 void
163 policy_access(__gnu_pbds::pat_trie_tag);
164
165 void
166 it_copy();
167
168 void
169 it_assign();
170
171 void
172 rev_it_copy();
173
174 void
175 rev_it_assign();
176
177 void
178 rev_it_copy_imp(__gnu_pbds::detail::false_type);
179
180 void
181 rev_it_copy_imp(__gnu_pbds::detail::true_type);
182
183 void
184 rev_it_assign_imp(__gnu_pbds::detail::false_type);
185
186 void
187 rev_it_assign_imp(__gnu_pbds::detail::true_type);
188
189 bool
190 default_constructor();
191
192 void
193 swap();
194
195 bool
196 copy_constructor();
197
198 bool
199 assignment_operator();
200
201 bool
202 it_constructor();
203
204 bool
205 it_constructor_imp(__gnu_pbds::cc_hash_tag);
206
207 bool
208 it_constructor_imp(__gnu_pbds::gp_hash_tag);
209
210 bool
211 it_constructor_imp(__gnu_pbds::tree_tag);
212
213 bool
214 it_constructor_imp(__gnu_pbds::list_update_tag);
215
216 bool
217 it_constructor_imp(__gnu_pbds::pat_trie_tag);
218
219 bool
220 insert();
221
222 bool
223 erase();
224
225 bool
226 erase_it();
227
228 bool
229 erase_it_imp(__gnu_pbds::detail::false_type);
230
231 bool
232 erase_it_imp(__gnu_pbds::detail::true_type);
233
234 bool
235 erase_rev_it();
236
237 bool
238 erase_rev_it_imp(__gnu_pbds::detail::false_type);
239
240 bool
241 erase_rev_it_imp(__gnu_pbds::detail::true_type);
242
243 bool
244 erase_if();
245
246 bool
247 clear();
248
249 bool
250 resize();
251
252 bool
253 resize_imp(__gnu_pbds::detail::true_type);
254
255 bool
256 resize_imp(__gnu_pbds::detail::false_type);
257
258 bool
259 get_set_loads();
260
261 bool
262 get_set_loads_imp(__gnu_pbds::detail::true_type);
263
264 bool
265 get_set_loads_imp(__gnu_pbds::detail::false_type);
266
267 void
268 get_set_load();
269
270 void
271 get_set_load_imp(__gnu_pbds::detail::true_type);
272
273 void
274 get_set_load_imp(__gnu_pbds::detail::false_type);
275
276 bool
277 subscript();
278
279 bool
280 subscript_imp(__gnu_pbds::detail::false_type);
281
282 bool
283 subscript_imp(__gnu_pbds::detail::true_type);
284
285 bool
286 split_join();
287
288 bool
289 split_join_imp(__gnu_pbds::detail::false_type);
290
291 bool
292 split_join_imp(__gnu_pbds::detail::true_type);
293
294 void
295 cmp(const Cntnr&, const native_type&, const std::string&);
296
297 void
298 basic_cmp_(const Cntnr&, const native_type&);
299
300 void
301 cmp_(const Cntnr&, const native_type&);
302
303 void
304 order_preserving_cmp_imp(const Cntnr&, const native_type&,
305 __gnu_pbds::detail::false_type);
306
307 void
308 order_preserving_cmp_imp(const Cntnr&, const native_type&,
309 __gnu_pbds::detail::true_type);
310
311 void
312 back_order_preserving_cmp_imp(const Cntnr&, const native_type&,
313 __gnu_pbds::detail::false_type);
314
315 void
316 back_order_preserving_cmp_imp(const Cntnr&, const native_type&,
317 __gnu_pbds::detail::true_type);
318
319 void
320 reverse_iteration_cmp_imp(const Cntnr&, const native_type&,
321 __gnu_pbds::detail::false_type);
322
323 void
324 reverse_iteration_cmp_imp(const Cntnr&, const native_type&,
325 __gnu_pbds::detail::true_type);
326
327 void
328 order_statistics_cmp_imp(const Cntnr&, const native_type&,
329 __gnu_pbds::detail::false_type);
330
331 void
332 order_statistics_cmp_imp(const Cntnr&, const native_type&,
333 __gnu_pbds::detail::true_type);
334
335 void
336 prefix_search_cmp_imp(const Cntnr&, const native_type&,
337 __gnu_pbds::detail::false_type);
338
339 void
340 prefix_search_cmp_imp(const Cntnr&, const native_type&,
341 __gnu_pbds::detail::true_type);
342
343 template<typename Const_It, class Const_Native_It>
344 void
345 it_cmp_imp(Const_It, Const_It, Const_Native_It, Const_Native_It);
346
347 template<typename Const_It, class Const_Native_It>
348 void
349 back_it_cmp_imp(Const_It, Const_It, Const_Native_It, Const_Native_It);
350
351 void
352 lower_bound_cmp_imp(const Cntnr&, const native_type&,
353 __gnu_pbds::detail::false_type);
354
355 void
356 lower_bound_cmp_imp(const Cntnr&, const native_type&,
357 __gnu_pbds::detail::true_type);
358
359 void
360 upper_bound_cmp_imp(const Cntnr&, const native_type&,
361 __gnu_pbds::detail::false_type);
362
363 void
364 upper_bound_cmp_imp(const Cntnr&, const native_type&,
365 __gnu_pbds::detail::true_type);
366
367 void
368 print_container(const native_type&, std::ostream& r_os = std::cerr) const;
369
370 void
371 print_container(const cntnr&, std::ostream& r_os = std::cerr) const;
372
373 struct destructor_printer
374 {
375 destructor_printer(const std::string& r_msg)
376 : m_msg(r_msg), m_print(true) { }
377
378 void
379 cancel_print()
380 { m_print = false; }
381
382 ~destructor_printer()
383 {
384 if (!m_print)
385 return;
386
387 std::cerr << std::endl << "Uncaught exception: " << std::endl
388 << m_msg << std::endl;
389 }
390
391 private:
392 const std::string m_msg;
393 bool m_print;
394 };
395
396 const unsigned long m_seed;
397 const size_t m_n;
398 const size_t m_m;
399 const double m_tp;
400 const double m_ip;
401 const double m_ep;
402 const double m_cp;
403 const double m_mp;
404 const bool m_disp;
405 twister_rand_gen m_g;
406 Cntnr* m_p_c;
407 native_type m_native_c;
408 alloc_t m_alloc;
409 size_t m_i;
410 };
411
412 #ifdef PB_DS_REGRESSION_TRACE
413 #define PB_DS_TRACE(X) std::cerr << X << std::endl
414 #else
415 #define PB_DS_TRACE(X)
416 #endif
417
418 #define PB_DS_CLASS_T_DEC \
419 template<typename Cntnr>
420
421 #define PB_DS_CLASS_C_DEC \
422 container_rand_regression_test<Cntnr>
423
424 #define PB_DS_COND_COMPARE(L, R) \
425 if (m_g.get_prob() < m_mp) \
426 cmp(L, R, __FUNCTION__);
427
428 #define PB_DS_RUN_MTHD(MTHD) \
429 { \
430 bool done = false; \
431 \
432 while (!done) \
433 done = MTHD(); \
434 }
435
436 #define PB_DS_THROW_IF_FAILED_(PRED, MORE, P_C, P_NC, F, L) \
437 if (!(PRED)) \
438 { \
439 std::cerr << "Failure at " << F << ": " << L << std::endl; \
440 std::cerr << MORE << std::endl; \
441 std::cerr << "container:" << std::endl; \
442 print_container(*(P_C)); \
443 std::cerr << std::endl; \
444 std::cerr << "native container:" << std::endl; \
445 print_container(*(P_NC)); \
446 std::cerr << std::endl; \
447 throw std::logic_error("fucked!"); \
448 }
449
450 #define PB_DS_THROW_IF_FAILED(PRED, MORE, P_C, P_NC) \
451 PB_DS_THROW_IF_FAILED_(PRED, MORE, P_C, P_NC, __FILE__, __LINE__)
452
453 #define PB_DS_SET_DESTRUCT_PRINT \
454 destructor_printer dest_print___(__FUNCTION__);
455
456 #define PB_DS_CANCEL_DESTRUCT_PRINT \
457 dest_print___.cancel_print();
458
459 #include <regression/rand/assoc/container_rand_regression_test.tcc>
460
461 #undef PB_DS_COND_COMPARE
462 #undef PB_DS_RUN_MTHD
463 #undef PB_DS_CLASS_T_DEC
464 #undef PB_DS_CLASS_C_DEC
465 #undef PB_DS_THROW_IF_FAILED_
466 #undef PB_DS_THROW_IF_FAILED
467 #undef PB_DS_SET_DESTRUCT_PRINT
468 #undef PB_DS_CANCEL_DESTRUCT_PRINT
469 #undef PB_DS_TRACE
470
471 } // namespace detail
472 } // namespace test
473 } // namespace __gnu_pbds
474
475 #endif