]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.h
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / util / regression / rand / priority_queue / container_rand_regression_test.h
CommitLineData
2e3f9c21
BK
1// -*- C++ -*-
2
7adcbafe 3// Copyright (C) 2005-2022 Free Software Foundation, Inc.
2e3f9c21
BK
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
748086b7 8// Foundation; either version 3, or (at your option) any later
2e3f9c21
BK
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
748086b7
JJ
17// along with this library; see the file COPYING3. If not see
18// <http://www.gnu.org/licenses/>.
2e3f9c21 19
2e3f9c21
BK
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 <cassert>
45#include <regression/basic_type.hpp>
46#include <ext/pb_ds/priority_queue.hpp>
47#include <io/prog_bar.hpp>
48#include <testsuite_rng.h>
49#include <common_type/priority_queue/string_form.hpp>
50#include <regression/rand/xml_formatter.hpp>
51#include <regression/trait/priority_queue/trait.hpp>
52
53namespace __gnu_pbds
54{
55namespace test
56{
57namespace detail
58{
59 // Rand test specialized for a specific container.
60 template<typename Cntnr>
61 class container_rand_regression_test
62 {
63 private:
64 typedef Cntnr cntnr;
65 typedef typename cntnr::allocator_type allocator_type;
66 typedef typename cntnr::size_type size_type;
67 typedef twister_rand_gen gen;
68 typedef basic_type value_type;
69 typedef native_priority_queue<std::string, true> native_type;
70 typedef regression_test_traits<cntnr> test_traits;
71
72 enum op
73 {
74 insert_op,
75 modify_op,
76 erase_op,
77 clear_op,
78 other_op
79 };
80
81 op
82 get_next_op();
83
84 size_t
85 get_next_sub_op(size_t max);
86
87 static void
88 defs();
89
90 static void
91 value_defs();
92
93 static void
94 ds_defs();
95
96 static void
97 iterator_defs();
98
99 static void
100 policy_defs();
101
102 void
103 policy_access();
104
105 void
106 it_copy();
107
108 void
109 it_assign();
110
111 bool
112 default_constructor();
113
114 void
115 swap();
116
117 bool
118 copy_constructor();
119
120 bool
121 assignment_operator();
122
123 bool
124 it_constructor();
125
126 bool
127 push();
128
129 bool
130 modify();
131
132 bool
133 pop();
134
135 bool
136 erase_if();
137
138 bool
139 erase_it();
140
141 bool
142 clear();
143
144 bool
145 split_join();
146
147 void
f92ab29f 148 cmp(const Cntnr& r_container, const native_type& r_native_c,
2e3f9c21
BK
149 const std::string& r_call_fn);
150
151 void
f92ab29f 152 print_container(const native_type& r_cnt,
2e3f9c21
BK
153 std::ostream& r_os = std::cerr) const;
154
155 void
f92ab29f 156 print_container(const cntnr& r_cnt,
2e3f9c21
BK
157 std::ostream& r_os = std::cerr) const;
158
159 struct destructor_printer
160 {
f92ab29f 161 destructor_printer(const std::string& r_msg)
2e3f9c21
BK
162 : m_msg(r_msg), m_print(true) { }
163
164 void
165 cancel()
166 { m_print = false; }
167
168 ~destructor_printer()
169 {
170 if (m_print)
171 {
f92ab29f 172 std::cerr << std::endl << "Uncaught exception: " << std::endl
2e3f9c21
BK
173 << m_msg << std::endl;
174 }
175 }
176
177 const std::string m_msg;
178 bool m_print;
179 };
180
181 const unsigned long m_seed;
182 const size_t m_n;
183 const size_t m_m;
184 const double m_tp;
185 const double m_ip;
186 const double m_dp;
187 const double m_ep;
188 const double m_cp;
189 const double m_mp;
190 const bool m_disp;
191 twister_rand_gen m_g;
192 Cntnr* m_p_c;
193 native_type m_native_c;
194 allocator_type m_alloc;
195 size_t m_i;
196
197 public:
f92ab29f
CG
198 container_rand_regression_test(unsigned long seed, size_t n, size_t m,
199 double tp, double ip, double dp,
200 double ep, double cp, double mp,
2e3f9c21
BK
201 bool disp);
202
203 virtual
204 ~container_rand_regression_test();
f92ab29f 205
2e3f9c21
BK
206 void
207 operator()();
208 };
209
210
211#ifdef PB_DS_REGRESSION_TRACE
212# define PB_DS_TRACE(X) std::cerr << X << std::endl
f92ab29f 213#else
2e3f9c21
BK
214# define PB_DS_TRACE(X)
215#endif
216
217#define PB_DS_CLASS_T_DEC \
218 template<typename Cntnr>
219
220#define PB_DS_CLASS_C_DEC \
221 container_rand_regression_test<Cntnr>
222
223#define PB_DS_COND_COMPARE(L, R) \
224 if (m_g.get_prob() < m_mp) \
225 cmp(L, R, __FUNCTION__);
226
227#define PB_DS_RUN_MTHD(MTHD) \
228 { \
229 bool done = false; \
230 while (!done) \
231 done = MTHD(); \
232 }
233
234#define _GLIBCXX_THROW_IF_(PRED, MORE, P_C, P_NC, F, L) \
235 if (PRED) \
236 { \
237 std::cerr << "Failure at " << F << ": " << L << std::endl; \
238 std::cerr << MORE << std::endl; \
239 std::cerr << "container:" << std::endl; \
240 print_container(*(P_C)); \
241 std::cerr << std::endl; \
242 std::cerr << "native container:" << std::endl; \
243 print_container(*(P_NC)); \
244 std::cerr << std::endl; \
245 throw std::logic_error("pbds throw if failed"); \
246 }
247
248#define _GLIBCXX_THROW_IF(PRED, MORE, P_C, P_NC) \
249 _GLIBCXX_THROW_IF_(PRED, MORE, P_C, P_NC, __FILE__, __LINE__)
250
251#include <regression/rand/priority_queue/container_rand_regression_test.tcc>
252
253#undef PB_DS_COND_COMPARE
254#undef PB_DS_RUN_MTHD
255#undef PB_DS_CLASS_T_DEC
256#undef PB_DS_CLASS_C_DEC
257#undef _GLIBCXX_THROW_IF_
258#undef _GLIBCXX_THROW_IF
259#undef PB_DS_TRACE
260
261} // namespace detail
262} // namespace test
263} // namespace __gnu_pbds
264
265#endif