]>
Commit | Line | Data |
---|---|---|
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 | ||
53 | namespace __gnu_pbds | |
54 | { | |
55 | namespace test | |
56 | { | |
57 | namespace 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 |