Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
25.mismatch.cpp
Go to the documentation of this file.
1
29#include <algorithm> // for mismatch
30#include <functional> // for equal_to
31#include <cstddef> // for size_t
32
33#include <rw_alg_test.h>
34#include <rw_value.h> // for UserClass
35#include <rw_driver.h> // for rw_test()...
36
37
39// exercises std::mismatch()
40template <class InputIterator1, class InputIterator2, class T>
41void test_mismatch (std::size_t N,
42 const InputIterator1 &it1_dummy,
43 const InputIterator2 &it2_dummy,
44 T*,
45 const char *predicate)
46{
47 static const char* const it1name = type_name (it1_dummy, (T*)0);
48 static const char* const it2name = type_name (it2_dummy, (T*)0);
49
50 rw_info (0, 0, 0, "std::mismatch (%s, %1$s, %s%{?}, %s%{;})",
51 it1name, it2name, 0 != predicate, predicate);
52
53 // generate sequential values for each default constructed UserClass
54 // for both lists
56
57 // use ::operator new() to prevent default initialization
58 const std::size_t size = N * sizeof (UserClass);
59 UserClass *buf1 = _RWSTD_STATIC_CAST (UserClass*, ::operator new (size));
60 UserClass *buf2 = _RWSTD_STATIC_CAST (UserClass*, ::operator new (size));
61
62 const std::size_t mid_inx = N / 2;
63
64 for (std::size_t i = 0; i != N; ++i) {
65
66 // default-construct a new UserClass at the end of the array
67 new (buf1 + i) UserClass ();
68
69 // build a nearly identical list only missing N/2 (the N/2th
70 // element) from it's list
71 if (i != mid_inx)
72 new (buf2 + i) UserClass ();
73 }
74
75 new (buf2 + mid_inx) UserClass ();
76
77 for (std::size_t i = 0; i != N; ++i) {
78
79 // exercise 25.1.7 - std::mismatch<>()
80 std::size_t last_n_op_eq = UserClass::n_total_op_eq_;
81
82 UserClass* const buf1_end = buf1 + i + 1;
83 UserClass* const buf2_end = buf2 + i + 1;
84
85 const InputIterator1 first1 (buf1, buf1, buf1_end);
86 const InputIterator1 last1 (buf1_end, buf1_end, buf1_end);
87 const InputIterator2 first2 (buf2, buf2, buf2_end);
88
89 const std::equal_to<UserClass> pred = std::equal_to<UserClass>();
90
91 const std::pair<InputIterator1, InputIterator2> result =
92 predicate ? std::mismatch (first1, last1, first2, pred)
93 : std::mismatch (first1, last1, first2);
94
95 // verify 25.1.7, p2
96 UserClass* const expected_buf1_end =
97 (i < mid_inx) ? buf1_end : buf1 + mid_inx;
98
99 UserClass* const expected_buf2_end =
100 (i < mid_inx) ? buf2_end : buf2 + mid_inx;
101
102 UserClass* const res_buf1_end =
103 buf1 + (result.first.cur_ - first1.cur_);
104
105 UserClass* const res_buf2_end =
106 buf2 + (result.second.cur_ - first2.cur_);
107
108 // check that the returned iterators are valid
109 bool success =
110 buf1 <= res_buf1_end && res_buf1_end <= buf1_end &&
111 buf2 <= res_buf2_end && res_buf2_end <= buf2_end;
112
113 rw_assert (success, 0, __LINE__,
114 "%zu. mismatch (%s, %2$s, %s%{?}, %s%{;}): "
115 "result { %d, %d } out of range: expected "
116 "{ [0, %d], [0, %d] }",
117 i, it1name, it2name, 0 != predicate, predicate,
118 res_buf1_end - buf1, res_buf2_end - buf2,
119 buf1_end - buf1, buf2_end - buf2);
120
121 // iterators are valid check that the algorithm works correctly
122 success =
123 res_buf1_end->data_.val_ == expected_buf1_end->data_.val_
124 && res_buf2_end->data_.val_ == expected_buf2_end->data_.val_;
125
126 rw_assert (success, 0, __LINE__,
127 "%zu. mismatch (%s, %2$s, %s%{?}, %s%{;}): "
128 "correctness: got: %d "
129 "expected: %d, got: %d expected: %d",
130 i, it1name, it2name, 0 != predicate, predicate,
131 res_buf1_end->data_.val_, expected_buf1_end->data_.val_,
132 res_buf2_end->data_.val_, expected_buf2_end->data_.val_);
133
134 // verify 25.1.7, p3
135 success = UserClass::n_total_op_eq_ - last_n_op_eq <= (N + 1);
136
137 rw_assert (success, 0, __LINE__,
138 "%zu. mismatch (%s, %2$s, %s%{?}, %s%{;}): "
139 "complexity: %zu <= %zu",
140 i, it1name, it2name, 0 != predicate, predicate,
142
143 if (!success)
144 break;
145 }
146
147 ::operator delete (buf1);
148 ::operator delete (buf2);
149}
150
151
152
154/* extern */ int rw_opt_nloops = 32; // --nloops
155/* extern */ int rw_opt_no_input_iter; // --no-InputIterator
156/* extern */ int rw_opt_no_fwd_iter; // --no-ForwardIterator
157/* extern */ int rw_opt_no_bidir_iter; // --no-BidirectionalIterator
158/* extern */ int rw_opt_no_rnd_iter; // --no-RandomAccessIterator
159/* extern */ int rw_opt_no_predicate; // --no-Predicate
160
161
162template <class InputIterator, class T>
163void test_mismatch (const InputIterator &dummy, T*, const char *predicate)
164{
165 // check that the number of loops is non-negative
166 rw_fatal (-1 < rw_opt_nloops, 0, 0,
167 "number of loops must be non-negative, got %d",
169
170 const std::size_t N = std::size_t (rw_opt_nloops);
171
173 rw_note (0, __FILE__, __LINE__, "InputIterator test disabled");
174 }
175 else {
176 test_mismatch (N, dummy, InputIter<UserClass>(0, 0, 0),
177 (UserClass*)0, predicate);
178 }
179
180 if (rw_opt_no_fwd_iter) {
181 rw_note (0, __FILE__, __LINE__, "ForwardIterator test disabled");
182 }
183 else {
185 (UserClass*)0, predicate);
186 }
187
189 rw_note (0, __FILE__, __LINE__,
190 "BidirectionalIterator test disabled");
191 }
192 else {
194 (UserClass*)0, predicate);
195 }
196
197 if (rw_opt_no_rnd_iter) {
198 rw_note (0, __FILE__, __LINE__,
199 "RandomAccessIterator test disabled");
200 }
201 else {
203 (UserClass*)0, predicate);
204 }
205}
206
207
208
210static void
211test_mismatch (const char *predicate)
212{
213 rw_info (0, 0, 0,
214 "template <class %s, class %s> "
215 "std::pair<%1$s, %2$s> "
216 "std::mismatch (%1$s, %1$s, %2$s%{?}, %s%{;})",
217 "InputIterator1", "InputIterator2",
218 0 != predicate, predicate);
219
221 rw_note (0, __FILE__, __LINE__, "InputIterator test disabled");
222 }
223 else {
225 }
226
227 if (rw_opt_no_fwd_iter) {
228 rw_note (0, __FILE__, __LINE__, "ForwardIterator test disabled");
229 }
230 else {
233 }
234
236 rw_note (0, __FILE__, __LINE__,
237 "BidirectionalIterator test disabled");
238 }
239 else {
242 }
243
244 if (rw_opt_no_rnd_iter) {
245 rw_note (0, __FILE__, __LINE__,
246 "RandomAccessIterator test disabled");
247 }
248 else {
250 (UserClass*)0, predicate);
252 }
253}
254
255
257static int
258run_test (int, char*[])
259{
260 test_mismatch (0);
261
263 rw_note (0, __FILE__, __LINE__, "Predicate test disabled");
264 }
265 else {
266 test_mismatch ("std::equal_to<UserClass>");
267 }
268
269 return 0;
270}
271
272
274int main (int argc, char *argv[])
275{
276 return rw_test (argc, argv, __FILE__,
277 "lib.alg.mismatch",
278 0 /* no comment */, run_test,
279 "|-nloops#"
280 "|-no-InputIterator#"
281 "|-no-ForwardIterator#"
282 "|-no-BidirectionalIterator#"
283 "|-no-RandomAccessIterator#"
284 "|-no-Predicate",
291}
void test_mismatch()
Definition 0.new.cpp:219
#define N
Definition 17.names.cpp:157
#define i
Definition 17.names.cpp:126
#define T
Definition 17.names.cpp:163
volatile int result
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
int rw_opt_no_fwd_iter
int rw_opt_no_rnd_iter
int rw_opt_no_bidir_iter
int rw_opt_no_input_iter
int rw_opt_no_predicate
int rw_opt_nloops
const char * type_name()
#define main
#define _RWSTD_STATIC_CAST(T, x)
Definition _defs.h:534
_TEST_EXPORT int gen_seq_2lists()
Definition alg_test.cpp:47
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
Definition driver.cpp:1681
_TEST_EXPORT int rw_fatal(int expr, const char *filename, int line, const char *fmtspec,...)
Definition driver.cpp:1596
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
Definition driver.cpp:1664
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
Definition driver.cpp:1630
static _RWSTD_SIZE_T n_total_op_eq_
Definition rw_value.h:132
UserData data_
Definition rw_value.h:79
static int(* gen_)()
Definition rw_value.h:122
int val_
Definition rw_value.h:39