libcopp 2.3.1
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
rc_ptr_test.cpp
Go to the documentation of this file.
1// Copyright 2025 owebt
2// Licenses under the MIT License
3
4#include <stdint.h>
5#include <utility>
6
7#include "frame/test_macros.h"
8
9#include "libcopp/utils/config/libcopp_build_features.h"
10
12
13#if defined(__GNUC__) && !defined(__clang__) && !defined(__apple_build_version__)
14# if (__GNUC__ * 100 + __GNUC_MINOR__ * 10) >= 460
15# pragma GCC diagnostic push
16# endif
17#elif defined(__clang__) || defined(__apple_build_version__)
18# pragma clang diagnostic push
19# pragma clang diagnostic ignored "-Wself-assign-overloaded"
20#endif
21
22namespace {
23template <class X>
24struct checked_deleter {
25 void operator()(X *p) { delete p; }
26};
27
28template <class X>
29struct checked_array_deleter {
30 void operator()(X *p) { delete[] p; }
31};
32
33} // namespace
34
35namespace strong_rc {
36namespace n_element_type {
37
38void f(int &) {}
39
40void test() {
41 typedef copp::memory::strong_rc_ptr<int>::element_type T;
42 T t;
43 f(t);
44}
45
46} // namespace n_element_type
47
48namespace n_constructors {
49
50class incomplete;
51
53 {
54 copp::memory::strong_rc_ptr<int> pi;
55 CASE_EXPECT_TRUE(pi ? false : true);
57 CASE_EXPECT_TRUE(pi.get() == 0);
58 CASE_EXPECT_TRUE(pi.use_count() == 0);
59 }
60
61 {
62 copp::memory::strong_rc_ptr<void> pv;
63 CASE_EXPECT_TRUE(pv ? false : true);
65 CASE_EXPECT_TRUE(pv.get() == 0);
66 CASE_EXPECT_TRUE(pv.use_count() == 0);
67 }
68
69 {
70 copp::memory::strong_rc_ptr<incomplete> px;
71 CASE_EXPECT_TRUE(px ? false : true);
73 CASE_EXPECT_TRUE(px.get() == 0);
74 CASE_EXPECT_TRUE(px.use_count() == 0);
75 }
76}
77
78struct A {
79 int dummy;
80};
81
82struct X {
83 static int64_t instances;
84
85 X() { ++instances; }
86
87 ~X() { --instances; }
88
89 private:
90 X(X const &);
91 X &operator=(X const &);
92};
93
94int64_t X::instances = 0;
95
96// virtual inheritance stresses the implementation
97
98struct Y : public A, public virtual X {
99 static int64_t instances;
100
101 Y() { ++instances; }
102
103 ~Y() { --instances; }
104
105 private:
106 Y(Y const &);
107 Y &operator=(Y const &);
108};
109
110int64_t Y::instances = 0;
111
112template <class T>
113void pc0_test(T *p) {
114 CASE_EXPECT_TRUE(p == 0);
115 copp::memory::strong_rc_ptr<T> pt(p);
116 CASE_EXPECT_TRUE(pt ? false : true);
117 CASE_EXPECT_TRUE(!pt);
118 CASE_EXPECT_TRUE(pt.get() == 0);
119 CASE_EXPECT_TRUE(pt.use_count() == 1);
120 CASE_EXPECT_TRUE(pt.unique());
121}
122
124 pc0_test(static_cast<int *>(0));
125
126 pc0_test(static_cast<int const *>(0));
127 pc0_test(static_cast<int volatile *>(0));
128 pc0_test(static_cast<int const volatile *>(0));
129
130 {
131 copp::memory::strong_rc_ptr<int const> pi(static_cast<int *>(0));
132 CASE_EXPECT_TRUE(pi ? false : true);
133 CASE_EXPECT_TRUE(!pi);
134 CASE_EXPECT_TRUE(pi.get() == 0);
135 CASE_EXPECT_TRUE(pi.use_count() == 1);
136 CASE_EXPECT_TRUE(pi.unique());
137 }
138
139 {
140 copp::memory::strong_rc_ptr<int volatile> pi(static_cast<int *>(0));
141 CASE_EXPECT_TRUE(pi ? false : true);
142 CASE_EXPECT_TRUE(!pi);
143 CASE_EXPECT_TRUE(pi.get() == 0);
144 CASE_EXPECT_TRUE(pi.use_count() == 1);
145 CASE_EXPECT_TRUE(pi.unique());
146 }
147
148 {
149 copp::memory::strong_rc_ptr<void> pv(static_cast<int *>(0));
150 CASE_EXPECT_TRUE(pv ? false : true);
151 CASE_EXPECT_TRUE(!pv);
152 CASE_EXPECT_TRUE(pv.get() == 0);
153 CASE_EXPECT_TRUE(pv.use_count() == 1);
154 CASE_EXPECT_TRUE(pv.unique());
155 }
156
157 {
158 copp::memory::strong_rc_ptr<void const> pv(static_cast<int *>(0));
159 CASE_EXPECT_TRUE(pv ? false : true);
160 CASE_EXPECT_TRUE(!pv);
161 CASE_EXPECT_TRUE(pv.get() == 0);
162 CASE_EXPECT_TRUE(pv.use_count() == 1);
163 CASE_EXPECT_TRUE(pv.unique());
164 }
165
166 pc0_test(static_cast<X *>(0));
167 pc0_test(static_cast<X const *>(0));
168 pc0_test(static_cast<X volatile *>(0));
169 pc0_test(static_cast<X const volatile *>(0));
170
171 {
172 copp::memory::strong_rc_ptr<X const> px(static_cast<X *>(0));
173 CASE_EXPECT_TRUE(px ? false : true);
174 CASE_EXPECT_TRUE(!px);
175 CASE_EXPECT_TRUE(px.get() == 0);
176 CASE_EXPECT_TRUE(px.use_count() == 1);
177 CASE_EXPECT_TRUE(px.unique());
178 }
179
180 {
181 copp::memory::strong_rc_ptr<X> px(static_cast<Y *>(0));
182 CASE_EXPECT_TRUE(px ? false : true);
183 CASE_EXPECT_TRUE(!px);
184 CASE_EXPECT_TRUE(px.get() == 0);
185 CASE_EXPECT_TRUE(px.use_count() == 1);
186 CASE_EXPECT_TRUE(px.unique());
187 }
188
189 {
190 copp::memory::strong_rc_ptr<X const> px(static_cast<Y *>(0));
191 CASE_EXPECT_TRUE(px ? false : true);
192 CASE_EXPECT_TRUE(!px);
193 CASE_EXPECT_TRUE(px.get() == 0);
194 CASE_EXPECT_TRUE(px.use_count() == 1);
195 CASE_EXPECT_TRUE(px.unique());
196 }
197
198 {
199 copp::memory::strong_rc_ptr<void> pv(static_cast<X *>(0));
200 CASE_EXPECT_TRUE(pv ? false : true);
201 CASE_EXPECT_TRUE(!pv);
202 CASE_EXPECT_TRUE(pv.get() == 0);
203 CASE_EXPECT_TRUE(pv.use_count() == 1);
204 CASE_EXPECT_TRUE(pv.unique());
205 }
206
207 {
208 copp::memory::strong_rc_ptr<void const> pv(static_cast<X *>(0));
209 CASE_EXPECT_TRUE(pv ? false : true);
210 CASE_EXPECT_TRUE(!pv);
211 CASE_EXPECT_TRUE(pv.get() == 0);
212 CASE_EXPECT_TRUE(pv.use_count() == 1);
213 CASE_EXPECT_TRUE(pv.unique());
214 }
215
216 {
217 int *p = new int(7);
218 copp::memory::strong_rc_ptr<int> pi(p);
219 CASE_EXPECT_TRUE(pi ? true : false);
220 CASE_EXPECT_TRUE(!!pi);
221 CASE_EXPECT_TRUE(pi.get() == p);
222 CASE_EXPECT_TRUE(pi.use_count() == 1);
223 CASE_EXPECT_TRUE(pi.unique());
224 CASE_EXPECT_TRUE(*pi == 7);
225 }
226
227 {
228 int *p = new int(7);
229 copp::memory::strong_rc_ptr<int const> pi(p);
230 CASE_EXPECT_TRUE(pi ? true : false);
231 CASE_EXPECT_TRUE(!!pi);
232 CASE_EXPECT_TRUE(pi.get() == p);
233 CASE_EXPECT_TRUE(pi.use_count() == 1);
234 CASE_EXPECT_TRUE(pi.unique());
235 CASE_EXPECT_TRUE(*pi == 7);
236 }
237
238 {
239 int *p = new int(7);
240 copp::memory::strong_rc_ptr<void> pv(p);
241 CASE_EXPECT_TRUE(pv ? true : false);
242 CASE_EXPECT_TRUE(!!pv);
243 CASE_EXPECT_TRUE(pv.get() == p);
244 CASE_EXPECT_TRUE(pv.use_count() == 1);
245 CASE_EXPECT_TRUE(pv.unique());
246 }
247
248 {
249 int *p = new int(7);
250 copp::memory::strong_rc_ptr<void const> pv(p);
251 CASE_EXPECT_TRUE(pv ? true : false);
252 CASE_EXPECT_TRUE(!!pv);
253 CASE_EXPECT_TRUE(pv.get() == p);
254 CASE_EXPECT_TRUE(pv.use_count() == 1);
255 CASE_EXPECT_TRUE(pv.unique());
256 }
257
259
260 {
261 X *p = new X;
262 copp::memory::strong_rc_ptr<X> px(p);
263 CASE_EXPECT_TRUE(px ? true : false);
264 CASE_EXPECT_TRUE(!!px);
265 CASE_EXPECT_TRUE(px.get() == p);
266 CASE_EXPECT_TRUE(px.use_count() == 1);
267 CASE_EXPECT_TRUE(px.unique());
269 }
270
272
273 {
274 X *p = new X;
275 copp::memory::strong_rc_ptr<X const> px(p);
276 CASE_EXPECT_TRUE(px ? true : false);
277 CASE_EXPECT_TRUE(!!px);
278 CASE_EXPECT_TRUE(px.get() == p);
279 CASE_EXPECT_TRUE(px.use_count() == 1);
280 CASE_EXPECT_TRUE(px.unique());
282 }
283
285
286 {
287 X *p = new X;
288 copp::memory::strong_rc_ptr<void> pv(p);
289 CASE_EXPECT_TRUE(pv ? true : false);
290 CASE_EXPECT_TRUE(!!pv);
291 CASE_EXPECT_TRUE(pv.get() == p);
292 CASE_EXPECT_TRUE(pv.use_count() == 1);
293 CASE_EXPECT_TRUE(pv.unique());
295 }
296
298
299 {
300 X *p = new X;
301 copp::memory::strong_rc_ptr<void const> pv(p);
302 CASE_EXPECT_TRUE(pv ? true : false);
303 CASE_EXPECT_TRUE(!!pv);
304 CASE_EXPECT_TRUE(pv.get() == p);
305 CASE_EXPECT_TRUE(pv.use_count() == 1);
306 CASE_EXPECT_TRUE(pv.unique());
308 }
309
312
313 {
314 Y *p = new Y;
315 copp::memory::strong_rc_ptr<X> px(p);
316 CASE_EXPECT_TRUE(px ? true : false);
317 CASE_EXPECT_TRUE(!!px);
318 CASE_EXPECT_TRUE(px.get() == p);
319 CASE_EXPECT_TRUE(px.use_count() == 1);
320 CASE_EXPECT_TRUE(px.unique());
323 }
324
327
328 {
329 Y *p = new Y;
330 copp::memory::strong_rc_ptr<X const> px(p);
331 CASE_EXPECT_TRUE(px ? true : false);
332 CASE_EXPECT_TRUE(!!px);
333 CASE_EXPECT_TRUE(px.get() == p);
334 CASE_EXPECT_TRUE(px.use_count() == 1);
335 CASE_EXPECT_TRUE(px.unique());
338 }
339
342}
343
344int m = 0;
345
346void deleter(int *p) { CASE_EXPECT_TRUE(p == 0); }
347
348void deleter2(int *p) {
349 CASE_EXPECT_TRUE(p == &m);
350 ++*p;
351}
352
353struct deleter3 {
354 void operator()(incomplete *p) { CASE_EXPECT_TRUE(p == 0); }
355};
356
357// Borland C++ 5.5.1 fails on static_cast<incomplete*>(0)
358
359incomplete *p0 = 0;
360
362 {
363 copp::memory::strong_rc_ptr<int> pi(static_cast<int *>(0), deleter);
364 CASE_EXPECT_TRUE(pi ? false : true);
365 CASE_EXPECT_TRUE(!pi);
366 CASE_EXPECT_TRUE(pi.get() == 0);
367 CASE_EXPECT_TRUE(pi.use_count() == 1);
368 CASE_EXPECT_TRUE(pi.unique());
369 }
370
371 {
372 copp::memory::strong_rc_ptr<void> pv(static_cast<int *>(0), &deleter);
373 CASE_EXPECT_TRUE(pv ? false : true);
374 CASE_EXPECT_TRUE(!pv);
375 CASE_EXPECT_TRUE(pv.get() == 0);
376 CASE_EXPECT_TRUE(pv.use_count() == 1);
377 CASE_EXPECT_TRUE(pv.unique());
378 }
379
380 {
381 copp::memory::strong_rc_ptr<void const> pv(static_cast<int *>(0), deleter);
382 CASE_EXPECT_TRUE(pv ? false : true);
383 CASE_EXPECT_TRUE(!pv);
384 CASE_EXPECT_TRUE(pv.get() == 0);
385 CASE_EXPECT_TRUE(pv.use_count() == 1);
386 CASE_EXPECT_TRUE(pv.unique());
387 }
388
389 {
390 copp::memory::strong_rc_ptr<incomplete> px(p0, deleter3());
391 CASE_EXPECT_TRUE(px ? false : true);
392 CASE_EXPECT_TRUE(!px);
393 CASE_EXPECT_TRUE(px.get() == 0);
394 CASE_EXPECT_TRUE(px.use_count() == 1);
395 CASE_EXPECT_TRUE(px.unique());
396 }
397
398 {
399 copp::memory::strong_rc_ptr<void> pv(p0, deleter3());
400 CASE_EXPECT_TRUE(pv ? false : true);
401 CASE_EXPECT_TRUE(!pv);
402 CASE_EXPECT_TRUE(pv.get() == 0);
403 CASE_EXPECT_TRUE(pv.use_count() == 1);
404 CASE_EXPECT_TRUE(pv.unique());
405 }
406
407 {
408 copp::memory::strong_rc_ptr<void const> pv(p0, deleter3());
409 CASE_EXPECT_TRUE(pv ? false : true);
410 CASE_EXPECT_TRUE(!pv);
411 CASE_EXPECT_TRUE(pv.get() == 0);
412 CASE_EXPECT_TRUE(pv.use_count() == 1);
413 CASE_EXPECT_TRUE(pv.unique());
414 }
415
416 CASE_EXPECT_TRUE(m == 0);
417
418 {
419 copp::memory::strong_rc_ptr<int> pi(&m, deleter2);
420 CASE_EXPECT_TRUE(pi ? true : false);
421 CASE_EXPECT_TRUE(!!pi);
422 CASE_EXPECT_TRUE(pi.get() == &m);
423 CASE_EXPECT_TRUE(pi.use_count() == 1);
424 CASE_EXPECT_TRUE(pi.unique());
425 }
426
427 CASE_EXPECT_TRUE(m == 1);
428
429 {
430 copp::memory::strong_rc_ptr<int const> pi(&m, &deleter2);
431 CASE_EXPECT_TRUE(pi ? true : false);
432 CASE_EXPECT_TRUE(!!pi);
433 CASE_EXPECT_TRUE(pi.get() == &m);
434 CASE_EXPECT_TRUE(pi.use_count() == 1);
435 CASE_EXPECT_TRUE(pi.unique());
436 }
437
438 CASE_EXPECT_TRUE(m == 2);
439
440 {
441 copp::memory::strong_rc_ptr<void> pv(&m, deleter2);
442 CASE_EXPECT_TRUE(pv ? true : false);
443 CASE_EXPECT_TRUE(!!pv);
444 CASE_EXPECT_TRUE(pv.get() == &m);
445 CASE_EXPECT_TRUE(pv.use_count() == 1);
446 CASE_EXPECT_TRUE(pv.unique());
447 }
448
449 CASE_EXPECT_TRUE(m == 3);
450
451 {
452 copp::memory::strong_rc_ptr<void const> pv(&m, &deleter2);
453 CASE_EXPECT_TRUE(pv ? true : false);
454 CASE_EXPECT_TRUE(!!pv);
455 CASE_EXPECT_TRUE(pv.get() == &m);
456 CASE_EXPECT_TRUE(pv.use_count() == 1);
457 CASE_EXPECT_TRUE(pv.unique());
458 }
459
460 CASE_EXPECT_TRUE(m == 4);
461}
462
464 {
465 copp::memory::strong_rc_ptr<int> pi;
466
467 copp::memory::strong_rc_ptr<int> pi2(pi);
468 CASE_EXPECT_TRUE(pi2 == pi);
469 CASE_EXPECT_TRUE(pi2 ? false : true);
470 CASE_EXPECT_TRUE(!pi2);
471 CASE_EXPECT_TRUE(pi2.get() == 0);
472 CASE_EXPECT_TRUE(pi2.use_count() == pi.use_count());
473
474 copp::memory::strong_rc_ptr<void> pi3(pi);
475 CASE_EXPECT_TRUE(pi3 == pi);
476 CASE_EXPECT_TRUE(pi3 ? false : true);
477 CASE_EXPECT_TRUE(!pi3);
478 CASE_EXPECT_TRUE(pi3.get() == 0);
479 CASE_EXPECT_TRUE(pi3.use_count() == pi.use_count());
480
481 copp::memory::strong_rc_ptr<void> pi4(pi3);
482 CASE_EXPECT_TRUE(pi4 == pi3);
483 CASE_EXPECT_TRUE(pi4 ? false : true);
484 CASE_EXPECT_TRUE(!pi4);
485 CASE_EXPECT_TRUE(pi4.get() == 0);
486 CASE_EXPECT_TRUE(pi4.use_count() == pi3.use_count());
487 }
488
489 {
490 copp::memory::strong_rc_ptr<void> pv;
491
492 copp::memory::strong_rc_ptr<void> pv2(pv);
493 CASE_EXPECT_TRUE(pv2 == pv);
494 CASE_EXPECT_TRUE(pv2 ? false : true);
495 CASE_EXPECT_TRUE(!pv2);
496 CASE_EXPECT_TRUE(pv2.get() == 0);
497 CASE_EXPECT_TRUE(pv2.use_count() == pv.use_count());
498 }
499
500 {
501 copp::memory::strong_rc_ptr<incomplete> px;
502
503 copp::memory::strong_rc_ptr<incomplete> px2(px);
504 CASE_EXPECT_TRUE(px2 == px);
505 CASE_EXPECT_TRUE(px2 ? false : true);
506 CASE_EXPECT_TRUE(!px2);
507 CASE_EXPECT_TRUE(px2.get() == 0);
508 CASE_EXPECT_TRUE(px2.use_count() == px.use_count());
509
510 copp::memory::strong_rc_ptr<void> px3(px);
511 CASE_EXPECT_TRUE(px3 == px);
512 CASE_EXPECT_TRUE(px3 ? false : true);
513 CASE_EXPECT_TRUE(!px3);
514 CASE_EXPECT_TRUE(px3.get() == 0);
515 CASE_EXPECT_TRUE(px3.use_count() == px.use_count());
516 }
517
518 {
519 copp::memory::strong_rc_ptr<int> pi(static_cast<int *>(0));
520
521 copp::memory::strong_rc_ptr<int> pi2(pi);
522 CASE_EXPECT_TRUE(pi2 == pi);
523 CASE_EXPECT_TRUE(pi2 ? false : true);
524 CASE_EXPECT_TRUE(!pi2);
525 CASE_EXPECT_TRUE(pi2.get() == 0);
526 CASE_EXPECT_TRUE(pi2.use_count() == 2);
527 CASE_EXPECT_TRUE(!pi2.unique());
528 CASE_EXPECT_TRUE(pi2.use_count() == pi.use_count());
529 CASE_EXPECT_TRUE(!(pi < pi2 || pi2 < pi)); // shared ownership test
530
531 copp::memory::strong_rc_ptr<void> pi3(pi);
532 CASE_EXPECT_TRUE(pi3 == pi);
533 CASE_EXPECT_TRUE(pi3 ? false : true);
534 CASE_EXPECT_TRUE(!pi3);
535 CASE_EXPECT_TRUE(pi3.get() == 0);
536 CASE_EXPECT_TRUE(pi3.use_count() == 3);
537 CASE_EXPECT_TRUE(!pi3.unique());
538 CASE_EXPECT_TRUE(pi3.use_count() == pi.use_count());
539 CASE_EXPECT_TRUE(!(pi < pi3 || pi3 < pi)); // shared ownership test
540
541 copp::memory::strong_rc_ptr<void> pi4(pi2);
542 CASE_EXPECT_TRUE(pi4 == pi2);
543 CASE_EXPECT_TRUE(pi4 ? false : true);
544 CASE_EXPECT_TRUE(!pi4);
545 CASE_EXPECT_TRUE(pi4.get() == 0);
546 CASE_EXPECT_TRUE(pi4.use_count() == 4);
547 CASE_EXPECT_TRUE(!pi4.unique());
548 CASE_EXPECT_TRUE(pi4.use_count() == pi2.use_count());
549 CASE_EXPECT_TRUE(!(pi2 < pi4 || pi4 < pi2)); // shared ownership test
550
551 CASE_EXPECT_TRUE(pi3.use_count() == pi4.use_count());
552 CASE_EXPECT_TRUE(!(pi3 < pi4 || pi4 < pi3)); // shared ownership test
553 }
554
555 {
556 copp::memory::strong_rc_ptr<X> px(static_cast<X *>(0));
557
558 copp::memory::strong_rc_ptr<X> px2(px);
559 CASE_EXPECT_TRUE(px2 == px);
560 CASE_EXPECT_TRUE(px2 ? false : true);
561 CASE_EXPECT_TRUE(!px2);
562 CASE_EXPECT_TRUE(px2.get() == 0);
563 CASE_EXPECT_TRUE(px2.use_count() == 2);
564 CASE_EXPECT_TRUE(!px2.unique());
565 CASE_EXPECT_TRUE(px2.use_count() == px.use_count());
566 CASE_EXPECT_TRUE(!(px < px2 || px2 < px)); // shared ownership test
567
568 copp::memory::strong_rc_ptr<void> px3(px);
569 CASE_EXPECT_TRUE(px3 == px);
570 CASE_EXPECT_TRUE(px3 ? false : true);
571 CASE_EXPECT_TRUE(!px3);
572 CASE_EXPECT_TRUE(px3.get() == 0);
573 CASE_EXPECT_TRUE(px3.use_count() == 3);
574 CASE_EXPECT_TRUE(!px3.unique());
575 CASE_EXPECT_TRUE(px3.use_count() == px.use_count());
576 CASE_EXPECT_TRUE(!(px < px3 || px3 < px)); // shared ownership test
577
578 copp::memory::strong_rc_ptr<void> px4(px2);
579 CASE_EXPECT_TRUE(px4 == px2);
580 CASE_EXPECT_TRUE(px4 ? false : true);
581 CASE_EXPECT_TRUE(!px4);
582 CASE_EXPECT_TRUE(px4.get() == 0);
583 CASE_EXPECT_TRUE(px4.use_count() == 4);
584 CASE_EXPECT_TRUE(!px4.unique());
585 CASE_EXPECT_TRUE(px4.use_count() == px2.use_count());
586 CASE_EXPECT_TRUE(!(px2 < px4 || px4 < px2)); // shared ownership test
587
588 CASE_EXPECT_TRUE(px3.use_count() == px4.use_count());
589 CASE_EXPECT_TRUE(!(px3 < px4 || px4 < px3)); // shared ownership test
590 }
591
592 {
593 int *p = new int(7);
594 copp::memory::strong_rc_ptr<int> pi(p);
595
596 copp::memory::strong_rc_ptr<int> pi2(pi);
597 CASE_EXPECT_TRUE(pi2 == pi);
598 CASE_EXPECT_TRUE(pi2 ? true : false);
599 CASE_EXPECT_TRUE(!!pi2);
600 CASE_EXPECT_TRUE(pi2.get() == p);
601 CASE_EXPECT_TRUE(pi2.use_count() == 2);
602 CASE_EXPECT_TRUE(!pi2.unique());
603 CASE_EXPECT_TRUE(*pi2 == 7);
604 CASE_EXPECT_TRUE(pi2.use_count() == pi.use_count());
605 CASE_EXPECT_TRUE(!(pi < pi2 || pi2 < pi)); // shared ownership test
606 }
607
608 {
609 int *p = new int(7);
610 copp::memory::strong_rc_ptr<void> pv(p);
611 CASE_EXPECT_TRUE(pv.get() == p);
612
613 copp::memory::strong_rc_ptr<void> pv2(pv);
614 CASE_EXPECT_TRUE(pv2 == pv);
615 CASE_EXPECT_TRUE(pv2 ? true : false);
616 CASE_EXPECT_TRUE(!!pv2);
617 CASE_EXPECT_TRUE(pv2.get() == p);
618 CASE_EXPECT_TRUE(pv2.use_count() == 2);
619 CASE_EXPECT_TRUE(!pv2.unique());
620 CASE_EXPECT_TRUE(pv2.use_count() == pv.use_count());
621 CASE_EXPECT_TRUE(!(pv < pv2 || pv2 < pv)); // shared ownership test
622 }
623
625
626 {
627 X *p = new X;
628 copp::memory::strong_rc_ptr<X> px(p);
629 CASE_EXPECT_TRUE(px.get() == p);
630
631 copp::memory::strong_rc_ptr<X> px2(px);
632 CASE_EXPECT_TRUE(px2 == px);
633 CASE_EXPECT_TRUE(px2 ? true : false);
634 CASE_EXPECT_TRUE(!!px2);
635 CASE_EXPECT_TRUE(px2.get() == p);
636 CASE_EXPECT_TRUE(px2.use_count() == 2);
637 CASE_EXPECT_TRUE(!px2.unique());
638
640
641 CASE_EXPECT_TRUE(px2.use_count() == px.use_count());
642 CASE_EXPECT_TRUE(!(px < px2 || px2 < px)); // shared ownership test
643
644 copp::memory::strong_rc_ptr<void> px3(px);
645 CASE_EXPECT_TRUE(px3 == px);
646 CASE_EXPECT_TRUE(px3 ? true : false);
647 CASE_EXPECT_TRUE(!!px3);
648 CASE_EXPECT_TRUE(px3.get() == p);
649 CASE_EXPECT_TRUE(px3.use_count() == 3);
650 CASE_EXPECT_TRUE(!px3.unique());
651 CASE_EXPECT_TRUE(px3.use_count() == px.use_count());
652 CASE_EXPECT_TRUE(!(px < px3 || px3 < px)); // shared ownership test
653
654 copp::memory::strong_rc_ptr<void> px4(px2);
655 CASE_EXPECT_TRUE(px4 == px2);
656 CASE_EXPECT_TRUE(px4 ? true : false);
657 CASE_EXPECT_TRUE(!!px4);
658 CASE_EXPECT_TRUE(px4.get() == p);
659 CASE_EXPECT_TRUE(px4.use_count() == 4);
660 CASE_EXPECT_TRUE(!px4.unique());
661 CASE_EXPECT_TRUE(px4.use_count() == px2.use_count());
662 CASE_EXPECT_TRUE(!(px2 < px4 || px4 < px2)); // shared ownership test
663
664 CASE_EXPECT_TRUE(px3.use_count() == px4.use_count());
665 CASE_EXPECT_TRUE(!(px3 < px4 || px4 < px3)); // shared ownership test
666 }
667
670
671 {
672 Y *p = new Y;
673 copp::memory::strong_rc_ptr<Y> py(p);
674 CASE_EXPECT_TRUE(py.get() == p);
675
676 copp::memory::strong_rc_ptr<X> px(py);
677 CASE_EXPECT_TRUE(px == py);
678 CASE_EXPECT_TRUE(px ? true : false);
679 CASE_EXPECT_TRUE(!!px);
680 CASE_EXPECT_TRUE(px.get() == p);
681 CASE_EXPECT_TRUE(px.use_count() == 2);
682 CASE_EXPECT_TRUE(!px.unique());
683 CASE_EXPECT_TRUE(px.use_count() == py.use_count());
684 CASE_EXPECT_TRUE(!(px < py || py < px)); // shared ownership test
685
688
689 copp::memory::strong_rc_ptr<void const> pv(px);
690 CASE_EXPECT_TRUE(pv == px);
691 CASE_EXPECT_TRUE(pv ? true : false);
692 CASE_EXPECT_TRUE(!!pv);
693 CASE_EXPECT_TRUE(pv.get() == px.get());
694 CASE_EXPECT_TRUE(pv.use_count() == 3);
695 CASE_EXPECT_TRUE(!pv.unique());
696 CASE_EXPECT_TRUE(pv.use_count() == px.use_count());
697 CASE_EXPECT_TRUE(!(px < pv || pv < px)); // shared ownership test
698
699 copp::memory::strong_rc_ptr<void const> pv2(py);
700 CASE_EXPECT_TRUE(pv2 == py);
701 CASE_EXPECT_TRUE(pv2 ? true : false);
702 CASE_EXPECT_TRUE(!!pv2);
703 CASE_EXPECT_TRUE(pv2.get() == py.get());
704 CASE_EXPECT_TRUE(pv2.use_count() == 4);
705 CASE_EXPECT_TRUE(!pv2.unique());
706 CASE_EXPECT_TRUE(pv2.use_count() == py.use_count());
707 CASE_EXPECT_TRUE(!(py < pv2 || pv2 < py)); // shared ownership test
708 }
709
712}
713
715#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
716 {
717 copp::memory::weak_rc_ptr<Y> wp;
718 CASE_EXPECT_TRUE(wp.use_count() == 0);
719
720 try {
721 copp::memory::strong_rc_ptr<Y> p2(wp);
722 CASE_EXPECT_ERROR("shared_ptr<Y> p2(wp) failed to throw");
723 } catch (std::bad_weak_ptr const &) {
724 }
725
726 try {
727 copp::memory::strong_rc_ptr<X> p3(wp);
728 CASE_EXPECT_ERROR("shared_ptr<X> p3(wp) failed to throw");
729 } catch (std::bad_weak_ptr const &) {
730 }
731 }
732#endif
733
734 {
735 copp::memory::strong_rc_ptr<Y> p;
736 copp::memory::weak_rc_ptr<Y> wp(p);
737
738 // 0 allowed but not required
739 if (wp.use_count() != 0) {
740 copp::memory::strong_rc_ptr<Y> p2(wp);
741 CASE_EXPECT_TRUE(p2.use_count() == wp.use_count());
742 CASE_EXPECT_TRUE(p2.get() == 0);
743
744 copp::memory::strong_rc_ptr<X> p3(wp);
745 CASE_EXPECT_TRUE(p3.use_count() == wp.use_count());
746 CASE_EXPECT_TRUE(p3.get() == 0);
747 }
748 }
749
750 {
751 copp::memory::strong_rc_ptr<Y> p(new Y);
752 copp::memory::weak_rc_ptr<Y> wp(p);
753
754 {
755 copp::memory::strong_rc_ptr<Y> p2(wp);
756 CASE_EXPECT_TRUE(p2 ? true : false);
757 CASE_EXPECT_TRUE(!!p2);
758 CASE_EXPECT_TRUE(p2.get() == p.get());
759 CASE_EXPECT_TRUE(p2.use_count() == 2);
760 CASE_EXPECT_TRUE(!p2.unique());
761 CASE_EXPECT_TRUE(p2.use_count() == wp.use_count());
762
763 CASE_EXPECT_TRUE(p.use_count() == p2.use_count());
764 CASE_EXPECT_TRUE(!(p < p2 || p2 < p)); // shared ownership test
765
766 copp::memory::strong_rc_ptr<X> p3(wp);
767 CASE_EXPECT_TRUE(p3 ? true : false);
768 CASE_EXPECT_TRUE(!!p3);
769 CASE_EXPECT_TRUE(p3.get() == p.get());
770 CASE_EXPECT_TRUE(p3.use_count() == 3);
771 CASE_EXPECT_TRUE(!p3.unique());
772 CASE_EXPECT_TRUE(p3.use_count() == wp.use_count());
773
774 CASE_EXPECT_TRUE(p.use_count() == p3.use_count());
775 }
776
777 p.reset();
778 CASE_EXPECT_TRUE(wp.use_count() == 0);
779
780#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
781 try {
782 copp::memory::strong_rc_ptr<Y> p2(wp);
783 CASE_EXPECT_ERROR("shared_ptr<Y> p2(wp) failed to throw");
784 } catch (std::bad_weak_ptr const &) {
785 }
786
787 try {
788 copp::memory::strong_rc_ptr<X> p3(wp);
789 CASE_EXPECT_ERROR("shared_ptr<X> p3(wp) failed to throw");
790 } catch (std::bad_weak_ptr const &) {
791 }
792#endif
793 }
794}
795
803
804} // namespace n_constructors
805
806namespace n_assignment {
807
808class incomplete;
809
810struct A {
811 int dummy;
812};
813
814struct X {
815 static int64_t instances;
816
817 X() { ++instances; }
818
819 ~X() { --instances; }
820
821 private:
822 X(X const &);
823 X &operator=(X const &);
824};
825
826int64_t X::instances = 0;
827
828struct Y : public A, public virtual X {
829 static int64_t instances;
830
831 Y() { ++instances; }
832
833 ~Y() { --instances; }
834
835 private:
836 Y(Y const &);
837 Y &operator=(Y const &);
838};
839
840int64_t Y::instances = 0;
841
843 {
844 copp::memory::strong_rc_ptr<incomplete> p1;
845
846 p1 = p1;
847
848 CASE_EXPECT_TRUE(p1 == p1);
849 CASE_EXPECT_TRUE(p1 ? false : true);
850 CASE_EXPECT_TRUE(!p1);
851 CASE_EXPECT_TRUE(p1.get() == 0);
852
853 copp::memory::strong_rc_ptr<incomplete> p2;
854
855 p1 = p2;
856
857 CASE_EXPECT_TRUE(p1 == p2);
858 CASE_EXPECT_TRUE(p1 ? false : true);
859 CASE_EXPECT_TRUE(!p1);
860 CASE_EXPECT_TRUE(p1.get() == 0);
861
862 copp::memory::strong_rc_ptr<incomplete> p3(p1);
863
864 p1 = p3;
865
866 CASE_EXPECT_TRUE(p1 == p3);
867 CASE_EXPECT_TRUE(p1 ? false : true);
868 CASE_EXPECT_TRUE(!p1);
869 CASE_EXPECT_TRUE(p1.get() == 0);
870 }
871
872 {
873 copp::memory::strong_rc_ptr<void> p1;
874
875 p1 = p1;
876
877 CASE_EXPECT_TRUE(p1 == p1);
878 CASE_EXPECT_TRUE(p1 ? false : true);
879 CASE_EXPECT_TRUE(!p1);
880 CASE_EXPECT_TRUE(p1.get() == 0);
881
882 copp::memory::strong_rc_ptr<void> p2;
883
884 p1 = p2;
885
886 CASE_EXPECT_TRUE(p1 == p2);
887 CASE_EXPECT_TRUE(p1 ? false : true);
888 CASE_EXPECT_TRUE(!p1);
889 CASE_EXPECT_TRUE(p1.get() == 0);
890
891 copp::memory::strong_rc_ptr<void> p3(p1);
892
893 p1 = p3;
894
895 CASE_EXPECT_TRUE(p1 == p3);
896 CASE_EXPECT_TRUE(p1 ? false : true);
897 CASE_EXPECT_TRUE(!p1);
898 CASE_EXPECT_TRUE(p1.get() == 0);
899
900 copp::memory::strong_rc_ptr<void> p4(new int);
901 CASE_EXPECT_TRUE(p4.use_count() == 1);
902
903 p1 = p4;
904
905 CASE_EXPECT_TRUE(p1 == p4);
906 CASE_EXPECT_TRUE(!(p1 < p4 || p4 < p1));
907 CASE_EXPECT_TRUE(p1.use_count() == 2);
908 CASE_EXPECT_TRUE(p4.use_count() == 2);
909
910 p1 = p3;
911
912 CASE_EXPECT_TRUE(p1 == p3);
913 CASE_EXPECT_TRUE(p4.use_count() == 1);
914 }
915
916 {
917 copp::memory::strong_rc_ptr<X> p1;
918
919 p1 = p1;
920
921 CASE_EXPECT_TRUE(p1 == p1);
922 CASE_EXPECT_TRUE(p1 ? false : true);
923 CASE_EXPECT_TRUE(!p1);
924 CASE_EXPECT_TRUE(p1.get() == 0);
925
926 copp::memory::strong_rc_ptr<X> p2;
927
928 p1 = p2;
929
930 CASE_EXPECT_TRUE(p1 == p2);
931 CASE_EXPECT_TRUE(p1 ? false : true);
932 CASE_EXPECT_TRUE(!p1);
933 CASE_EXPECT_TRUE(p1.get() == 0);
934
935 copp::memory::strong_rc_ptr<X> p3(p1);
936
937 p1 = p3;
938
939 CASE_EXPECT_TRUE(p1 == p3);
940 CASE_EXPECT_TRUE(p1 ? false : true);
941 CASE_EXPECT_TRUE(!p1);
942 CASE_EXPECT_TRUE(p1.get() == 0);
943
945
946 copp::memory::strong_rc_ptr<X> p4(new X);
947
949
950 p1 = p4;
951
953
954 CASE_EXPECT_TRUE(p1 == p4);
955 CASE_EXPECT_TRUE(!(p1 < p4 || p4 < p1));
956
957 CASE_EXPECT_TRUE(p1.use_count() == 2);
958
959 p1 = p2;
960
961 CASE_EXPECT_TRUE(p1 == p2);
963
964 p4 = p3;
965
966 CASE_EXPECT_TRUE(p4 == p3);
968 }
969}
970
972 {
973 copp::memory::strong_rc_ptr<void> p1;
974
975 copp::memory::strong_rc_ptr<incomplete> p2;
976
977 p1 = p2;
978
979 CASE_EXPECT_TRUE(p1 == p2);
980 CASE_EXPECT_TRUE(p1 ? false : true);
981 CASE_EXPECT_TRUE(!p1);
982 CASE_EXPECT_TRUE(p1.get() == 0);
983
984 copp::memory::strong_rc_ptr<int> p4(new int);
985 CASE_EXPECT_TRUE(p4.use_count() == 1);
986
987 copp::memory::strong_rc_ptr<void> p5(p4);
988 CASE_EXPECT_TRUE(p4.use_count() == 2);
989
990 p1 = p4;
991
992 CASE_EXPECT_TRUE(p1 == p4);
993 CASE_EXPECT_TRUE(!(p1 < p5 || p5 < p1));
994 CASE_EXPECT_TRUE(p1.use_count() == 3);
995 CASE_EXPECT_TRUE(p4.use_count() == 3);
996
997 p1 = p2;
998
999 CASE_EXPECT_TRUE(p1 == p2);
1000 CASE_EXPECT_TRUE(p4.use_count() == 2);
1001 }
1002
1003 {
1004 copp::memory::strong_rc_ptr<X> p1;
1005
1006 copp::memory::strong_rc_ptr<Y> p2;
1007
1008 p1 = p2;
1009
1010 CASE_EXPECT_TRUE(p1 == p2);
1011 CASE_EXPECT_TRUE(p1 ? false : true);
1012 CASE_EXPECT_TRUE(!p1);
1013 CASE_EXPECT_TRUE(p1.get() == 0);
1014
1017
1018 copp::memory::strong_rc_ptr<Y> p4(new Y);
1019
1022 CASE_EXPECT_TRUE(p4.use_count() == 1);
1023
1024 copp::memory::strong_rc_ptr<X> p5(p4);
1025 CASE_EXPECT_TRUE(p4.use_count() == 2);
1026
1027 p1 = p4;
1028
1031
1032 CASE_EXPECT_TRUE(p1 == p4);
1033 CASE_EXPECT_TRUE(!(p1 < p5 || p5 < p1));
1034
1035 CASE_EXPECT_TRUE(p1.use_count() == 3);
1036 CASE_EXPECT_TRUE(p4.use_count() == 3);
1037
1038 p1 = p2;
1039
1040 CASE_EXPECT_TRUE(p1 == p2);
1043 CASE_EXPECT_TRUE(p4.use_count() == 2);
1044
1045 p4 = p2;
1046 p5 = p2;
1047
1048 CASE_EXPECT_TRUE(p4 == p2);
1051 }
1052}
1053
1054void test() {
1057}
1058
1059} // namespace n_assignment
1060
1061namespace n_reset {
1062
1063class incomplete;
1064
1065incomplete *p0 = 0;
1066
1067void deleter(incomplete *) {}
1068
1069struct X {
1070 static int64_t instances;
1071
1072 X() { ++instances; }
1073
1074 ~X() { --instances; }
1075
1076 private:
1077 X(X const &);
1078 X &operator=(X const &);
1079};
1080
1081int64_t X::instances = 0;
1082
1084 {
1085 copp::memory::strong_rc_ptr<int> pi;
1086 pi.reset();
1087 CASE_EXPECT_TRUE(pi ? false : true);
1088 CASE_EXPECT_TRUE(!pi);
1089 CASE_EXPECT_TRUE(pi.get() == 0);
1090 CASE_EXPECT_TRUE(pi.use_count() == 0);
1091 }
1092
1093 {
1094 copp::memory::strong_rc_ptr<int> pi(static_cast<int *>(0));
1095 pi.reset();
1096 CASE_EXPECT_TRUE(pi ? false : true);
1097 CASE_EXPECT_TRUE(!pi);
1098 CASE_EXPECT_TRUE(pi.get() == 0);
1099 CASE_EXPECT_TRUE(pi.use_count() == 0);
1100 }
1101
1102 {
1103 copp::memory::strong_rc_ptr<int> pi(new int);
1104 pi.reset();
1105 CASE_EXPECT_TRUE(pi ? false : true);
1106 CASE_EXPECT_TRUE(!pi);
1107 CASE_EXPECT_TRUE(pi.get() == 0);
1108 CASE_EXPECT_TRUE(pi.use_count() == 0);
1109 }
1110
1111 {
1112 copp::memory::strong_rc_ptr<incomplete> px;
1113 px.reset();
1114 CASE_EXPECT_TRUE(px ? false : true);
1115 CASE_EXPECT_TRUE(!px);
1116 CASE_EXPECT_TRUE(px.get() == 0);
1117 CASE_EXPECT_TRUE(px.use_count() == 0);
1118 }
1119
1120 {
1121 copp::memory::strong_rc_ptr<incomplete> px(p0, deleter);
1122 px.reset();
1123 CASE_EXPECT_TRUE(px ? false : true);
1124 CASE_EXPECT_TRUE(!px);
1125 CASE_EXPECT_TRUE(px.get() == 0);
1126 CASE_EXPECT_TRUE(px.use_count() == 0);
1127 }
1128
1129 {
1130 copp::memory::strong_rc_ptr<X> px;
1131 px.reset();
1132 CASE_EXPECT_TRUE(px ? false : true);
1133 CASE_EXPECT_TRUE(!px);
1134 CASE_EXPECT_TRUE(px.get() == 0);
1135 CASE_EXPECT_TRUE(px.use_count() == 0);
1136 }
1137
1138 {
1140 copp::memory::strong_rc_ptr<X> px(new X);
1142 px.reset();
1143 CASE_EXPECT_TRUE(px ? false : true);
1144 CASE_EXPECT_TRUE(!px);
1145 CASE_EXPECT_TRUE(px.get() == 0);
1146 CASE_EXPECT_TRUE(px.use_count() == 0);
1148 }
1149
1150 {
1151 copp::memory::strong_rc_ptr<void> pv;
1152 pv.reset();
1153 CASE_EXPECT_TRUE(pv ? false : true);
1154 CASE_EXPECT_TRUE(!pv);
1155 CASE_EXPECT_TRUE(pv.get() == 0);
1156 CASE_EXPECT_TRUE(pv.use_count() == 0);
1157 }
1158
1159 {
1161 copp::memory::strong_rc_ptr<void> pv(new X);
1163 pv.reset();
1164 CASE_EXPECT_TRUE(pv ? false : true);
1165 CASE_EXPECT_TRUE(!pv);
1166 CASE_EXPECT_TRUE(pv.get() == 0);
1167 CASE_EXPECT_TRUE(pv.use_count() == 0);
1169 }
1170}
1171
1172struct A {
1174};
1175
1176struct Y : public A, public virtual X {
1177 static int64_t instances;
1178
1179 Y() { ++instances; }
1180
1181 ~Y() { --instances; }
1182
1183 private:
1184 Y(Y const &);
1185 Y &operator=(Y const &);
1186};
1187
1188int64_t Y::instances = 0;
1189
1191 {
1192 copp::memory::strong_rc_ptr<int> pi;
1193 CASE_EXPECT_TRUE(pi.use_count() == 0);
1194
1195 pi.reset(static_cast<int *>(nullptr));
1196 CASE_EXPECT_TRUE(pi ? false : true);
1197 CASE_EXPECT_TRUE(!pi);
1198 CASE_EXPECT_TRUE(pi.get() == 0);
1199 CASE_EXPECT_TRUE(pi.use_count() == 1);
1200 CASE_EXPECT_TRUE(pi.unique());
1201
1202 int *p = new int;
1203 pi.reset(p);
1204 CASE_EXPECT_TRUE(pi ? true : false);
1205 CASE_EXPECT_TRUE(!!pi);
1206 CASE_EXPECT_TRUE(pi.get() == p);
1207 CASE_EXPECT_TRUE(pi.use_count() == 1);
1208 CASE_EXPECT_TRUE(pi.unique());
1209
1210 pi.reset(static_cast<int *>(0));
1211 CASE_EXPECT_TRUE(pi ? false : true);
1212 CASE_EXPECT_TRUE(!pi);
1213 CASE_EXPECT_TRUE(pi.get() == 0);
1214 CASE_EXPECT_TRUE(pi.use_count() == 1);
1215 CASE_EXPECT_TRUE(pi.unique());
1216 }
1217
1218 {
1219 copp::memory::strong_rc_ptr<X> px;
1220
1221 px.reset(static_cast<X *>(0));
1222 CASE_EXPECT_TRUE(px ? false : true);
1223 CASE_EXPECT_TRUE(!px);
1224 CASE_EXPECT_TRUE(px.get() == 0);
1225 CASE_EXPECT_TRUE(px.use_count() == 1);
1226 CASE_EXPECT_TRUE(px.unique());
1228
1229 X *p = new X;
1230 px.reset(p);
1231 CASE_EXPECT_TRUE(px ? true : false);
1232 CASE_EXPECT_TRUE(!!px);
1233 CASE_EXPECT_TRUE(px.get() == p);
1234 CASE_EXPECT_TRUE(px.use_count() == 1);
1235 CASE_EXPECT_TRUE(px.unique());
1237
1238 px.reset(static_cast<X *>(0));
1239 CASE_EXPECT_TRUE(px ? false : true);
1240 CASE_EXPECT_TRUE(!px);
1241 CASE_EXPECT_TRUE(px.get() == 0);
1242 CASE_EXPECT_TRUE(px.use_count() == 1);
1243 CASE_EXPECT_TRUE(px.unique());
1246
1247 Y *q = new Y;
1248 px.reset(q);
1249 CASE_EXPECT_TRUE(px ? true : false);
1250 CASE_EXPECT_TRUE(!!px);
1251 CASE_EXPECT_TRUE(px.get() == q);
1252 CASE_EXPECT_TRUE(px.use_count() == 1);
1253 CASE_EXPECT_TRUE(px.unique());
1256
1257 px.reset(static_cast<Y *>(0));
1258 CASE_EXPECT_TRUE(px ? false : true);
1259 CASE_EXPECT_TRUE(!px);
1260 CASE_EXPECT_TRUE(px.get() == 0);
1261 CASE_EXPECT_TRUE(px.use_count() == 1);
1262 CASE_EXPECT_TRUE(px.unique());
1265 }
1266
1267 {
1268 copp::memory::strong_rc_ptr<void> pv;
1269
1270 pv.reset(static_cast<X *>(0));
1271 CASE_EXPECT_TRUE(pv ? false : true);
1272 CASE_EXPECT_TRUE(!pv);
1273 CASE_EXPECT_TRUE(pv.get() == 0);
1274 CASE_EXPECT_TRUE(pv.use_count() == 1);
1275 CASE_EXPECT_TRUE(pv.unique());
1277
1278 X *p = new X;
1279 pv.reset(p);
1280 CASE_EXPECT_TRUE(pv ? true : false);
1281 CASE_EXPECT_TRUE(!!pv);
1282 CASE_EXPECT_TRUE(pv.get() == p);
1283 CASE_EXPECT_TRUE(pv.use_count() == 1);
1284 CASE_EXPECT_TRUE(pv.unique());
1286
1287 pv.reset(static_cast<X *>(0));
1288 CASE_EXPECT_TRUE(pv ? false : true);
1289 CASE_EXPECT_TRUE(!pv);
1290 CASE_EXPECT_TRUE(pv.get() == 0);
1291 CASE_EXPECT_TRUE(pv.use_count() == 1);
1292 CASE_EXPECT_TRUE(pv.unique());
1295
1296 Y *q = new Y;
1297 pv.reset(q);
1298 CASE_EXPECT_TRUE(pv ? true : false);
1299 CASE_EXPECT_TRUE(!!pv);
1300 CASE_EXPECT_TRUE(pv.get() == q);
1301 CASE_EXPECT_TRUE(pv.use_count() == 1);
1302 CASE_EXPECT_TRUE(pv.unique());
1305
1306 pv.reset(static_cast<Y *>(0));
1307 CASE_EXPECT_TRUE(pv ? false : true);
1308 CASE_EXPECT_TRUE(!pv);
1309 CASE_EXPECT_TRUE(pv.get() == 0);
1310 CASE_EXPECT_TRUE(pv.use_count() == 1);
1311 CASE_EXPECT_TRUE(pv.unique());
1314 }
1315}
1316
1317void *deleted = 0;
1318
1319void deleter2(void *p) { deleted = p; }
1320
1322 {
1323 copp::memory::strong_rc_ptr<int> pi;
1324
1325 pi.reset(static_cast<int *>(0), deleter2);
1326 CASE_EXPECT_TRUE(pi ? false : true);
1327 CASE_EXPECT_TRUE(!pi);
1328 CASE_EXPECT_TRUE(pi.get() == 0);
1329 CASE_EXPECT_TRUE(pi.use_count() == 1);
1330 CASE_EXPECT_TRUE(pi.unique());
1331
1332 deleted = &pi;
1333
1334 int m = 0;
1335 pi.reset(&m, deleter2);
1337 CASE_EXPECT_TRUE(pi ? true : false);
1338 CASE_EXPECT_TRUE(!!pi);
1339 CASE_EXPECT_TRUE(pi.get() == &m);
1340 CASE_EXPECT_TRUE(pi.use_count() == 1);
1341 CASE_EXPECT_TRUE(pi.unique());
1342
1343 pi.reset(static_cast<int *>(0), deleter2);
1345 CASE_EXPECT_TRUE(pi ? false : true);
1346 CASE_EXPECT_TRUE(!pi);
1347 CASE_EXPECT_TRUE(pi.get() == 0);
1348 CASE_EXPECT_TRUE(pi.use_count() == 1);
1349 CASE_EXPECT_TRUE(pi.unique());
1350
1351 pi.reset();
1353 }
1354
1355 {
1356 copp::memory::strong_rc_ptr<X> px;
1357
1358 px.reset(static_cast<X *>(0), deleter2);
1359 CASE_EXPECT_TRUE(px ? false : true);
1360 CASE_EXPECT_TRUE(!px);
1361 CASE_EXPECT_TRUE(px.get() == 0);
1362 CASE_EXPECT_TRUE(px.use_count() == 1);
1363 CASE_EXPECT_TRUE(px.unique());
1364
1365 deleted = &px;
1366
1367 X x;
1368 px.reset(&x, deleter2);
1370 CASE_EXPECT_TRUE(px ? true : false);
1371 CASE_EXPECT_TRUE(!!px);
1372 CASE_EXPECT_TRUE(px.get() == &x);
1373 CASE_EXPECT_TRUE(px.use_count() == 1);
1374 CASE_EXPECT_TRUE(px.unique());
1375
1376 px.reset(static_cast<X *>(0), deleter2);
1378 CASE_EXPECT_TRUE(px ? false : true);
1379 CASE_EXPECT_TRUE(!px);
1380 CASE_EXPECT_TRUE(px.get() == 0);
1381 CASE_EXPECT_TRUE(px.use_count() == 1);
1382 CASE_EXPECT_TRUE(px.unique());
1383
1384 Y y;
1385 px.reset(&y, deleter2);
1387 CASE_EXPECT_TRUE(px ? true : false);
1388 CASE_EXPECT_TRUE(!!px);
1389 CASE_EXPECT_TRUE(px.get() == &y);
1390 CASE_EXPECT_TRUE(px.use_count() == 1);
1391 CASE_EXPECT_TRUE(px.unique());
1392
1393 px.reset(static_cast<Y *>(0), deleter2);
1395 CASE_EXPECT_TRUE(px ? false : true);
1396 CASE_EXPECT_TRUE(!px);
1397 CASE_EXPECT_TRUE(px.get() == 0);
1398 CASE_EXPECT_TRUE(px.use_count() == 1);
1399 CASE_EXPECT_TRUE(px.unique());
1400
1401 px.reset();
1403 }
1404
1405 {
1406 copp::memory::strong_rc_ptr<void> pv;
1407
1408 pv.reset(static_cast<X *>(0), deleter2);
1409 CASE_EXPECT_TRUE(pv ? false : true);
1410 CASE_EXPECT_TRUE(!pv);
1411 CASE_EXPECT_TRUE(pv.get() == 0);
1412 CASE_EXPECT_TRUE(pv.use_count() == 1);
1413 CASE_EXPECT_TRUE(pv.unique());
1414
1415 deleted = &pv;
1416
1417 X x;
1418 pv.reset(&x, deleter2);
1420 CASE_EXPECT_TRUE(pv ? true : false);
1421 CASE_EXPECT_TRUE(!!pv);
1422 CASE_EXPECT_TRUE(pv.get() == &x);
1423 CASE_EXPECT_TRUE(pv.use_count() == 1);
1424 CASE_EXPECT_TRUE(pv.unique());
1425
1426 pv.reset(static_cast<X *>(0), deleter2);
1428 CASE_EXPECT_TRUE(pv ? false : true);
1429 CASE_EXPECT_TRUE(!pv);
1430 CASE_EXPECT_TRUE(pv.get() == 0);
1431 CASE_EXPECT_TRUE(pv.use_count() == 1);
1432 CASE_EXPECT_TRUE(pv.unique());
1433
1434 Y y;
1435 pv.reset(&y, deleter2);
1437 CASE_EXPECT_TRUE(pv ? true : false);
1438 CASE_EXPECT_TRUE(!!pv);
1439 CASE_EXPECT_TRUE(pv.get() == &y);
1440 CASE_EXPECT_TRUE(pv.use_count() == 1);
1441 CASE_EXPECT_TRUE(pv.unique());
1442
1443 pv.reset(static_cast<Y *>(0), deleter2);
1445 CASE_EXPECT_TRUE(pv ? false : true);
1446 CASE_EXPECT_TRUE(!pv);
1447 CASE_EXPECT_TRUE(pv.get() == 0);
1448 CASE_EXPECT_TRUE(pv.use_count() == 1);
1449 CASE_EXPECT_TRUE(pv.unique());
1450
1451 pv.reset();
1453 }
1454
1455 {
1456 copp::memory::strong_rc_ptr<incomplete> px;
1457
1458 px.reset(p0, deleter2);
1459 CASE_EXPECT_TRUE(px ? false : true);
1460 CASE_EXPECT_TRUE(!px);
1461 CASE_EXPECT_TRUE(px.get() == 0);
1462 CASE_EXPECT_TRUE(px.use_count() == 1);
1463 CASE_EXPECT_TRUE(px.unique());
1464
1465 deleted = &px;
1466 px.reset(p0, deleter2);
1468 }
1469}
1470
1471void test() {
1472 plain_reset();
1473 pointer_reset();
1474 deleter_reset();
1475}
1476
1477} // namespace n_reset
1478
1479namespace n_access {
1480
1481struct X {};
1482
1483void test() {
1484 {
1485 copp::memory::strong_rc_ptr<X> px;
1486 CASE_EXPECT_TRUE(px.get() == 0);
1487 CASE_EXPECT_TRUE(px ? false : true);
1488 CASE_EXPECT_TRUE(!px);
1489 }
1490
1491 {
1492 copp::memory::strong_rc_ptr<X> px(static_cast<X *>(0));
1493 CASE_EXPECT_TRUE(px.get() == 0);
1494 CASE_EXPECT_TRUE(px ? false : true);
1495 CASE_EXPECT_TRUE(!px);
1496 }
1497
1498 {
1499 copp::memory::strong_rc_ptr<X> px(static_cast<X *>(0), checked_deleter<X>());
1500 CASE_EXPECT_TRUE(px.get() == 0);
1501 CASE_EXPECT_TRUE(px ? false : true);
1502 CASE_EXPECT_TRUE(!px);
1503 }
1504
1505 {
1506 X *p = new X;
1507 copp::memory::strong_rc_ptr<X> px(p);
1508 CASE_EXPECT_TRUE(px.get() == p);
1509 CASE_EXPECT_TRUE(px ? true : false);
1510 CASE_EXPECT_TRUE(!!px);
1511 CASE_EXPECT_TRUE(&*px == px.get());
1512 CASE_EXPECT_TRUE(px.operator->() == px.get());
1513 }
1514
1515 {
1516 X *p = new X;
1517 copp::memory::strong_rc_ptr<X> px(p, checked_deleter<X>());
1518 CASE_EXPECT_TRUE(px.get() == p);
1519 CASE_EXPECT_TRUE(px ? true : false);
1520 CASE_EXPECT_TRUE(!!px);
1521 CASE_EXPECT_TRUE(&*px == px.get());
1522 CASE_EXPECT_TRUE(px.operator->() == px.get());
1523 }
1524}
1525
1526} // namespace n_access
1527
1528namespace n_use_count {
1529
1530struct X {};
1531
1532void test() {
1533 {
1534 copp::memory::strong_rc_ptr<X> px(static_cast<X *>(0));
1535 CASE_EXPECT_TRUE(px.use_count() == 1);
1536 CASE_EXPECT_TRUE(px.unique());
1537
1538 copp::memory::strong_rc_ptr<X> px2(px);
1539 CASE_EXPECT_TRUE(px2.use_count() == 2);
1540 CASE_EXPECT_TRUE(!px2.unique());
1541 CASE_EXPECT_TRUE(px.use_count() == 2);
1542 CASE_EXPECT_TRUE(!px.unique());
1543 }
1544
1545 {
1546 copp::memory::strong_rc_ptr<X> px(new X);
1547 CASE_EXPECT_TRUE(px.use_count() == 1);
1548 CASE_EXPECT_TRUE(px.unique());
1549
1550 copp::memory::strong_rc_ptr<X> px2(px);
1551 CASE_EXPECT_TRUE(px2.use_count() == 2);
1552 CASE_EXPECT_TRUE(!px2.unique());
1553 CASE_EXPECT_TRUE(px.use_count() == 2);
1554 CASE_EXPECT_TRUE(!px.unique());
1555 }
1556
1557 {
1558 copp::memory::strong_rc_ptr<X> px(new X, checked_deleter<X>());
1559 CASE_EXPECT_TRUE(px.use_count() == 1);
1560 CASE_EXPECT_TRUE(px.unique());
1561
1562 copp::memory::strong_rc_ptr<X> px2(px);
1563 CASE_EXPECT_TRUE(px2.use_count() == 2);
1564 CASE_EXPECT_TRUE(!px2.unique());
1565 CASE_EXPECT_TRUE(px.use_count() == 2);
1566 CASE_EXPECT_TRUE(!px.unique());
1567 }
1568}
1569
1570} // namespace n_use_count
1571
1572namespace n_swap {
1573
1574struct X {};
1575
1576void test() {
1577 {
1578 copp::memory::strong_rc_ptr<X> px;
1579 copp::memory::strong_rc_ptr<X> px2;
1580
1581 px.swap(px2);
1582
1583 CASE_EXPECT_TRUE(px.get() == 0);
1584 CASE_EXPECT_TRUE(px2.get() == 0);
1585
1586 using std::swap;
1587 swap(px, px2);
1588
1589 CASE_EXPECT_TRUE(px.get() == 0);
1590 CASE_EXPECT_TRUE(px2.get() == 0);
1591 }
1592
1593 {
1594 X *p = new X;
1595 copp::memory::strong_rc_ptr<X> px;
1596 copp::memory::strong_rc_ptr<X> px2(p);
1597 copp::memory::strong_rc_ptr<X> px3(px2);
1598
1599 px.swap(px2);
1600
1601 CASE_EXPECT_TRUE(px.get() == p);
1602 CASE_EXPECT_TRUE(px.use_count() == 2);
1603 CASE_EXPECT_TRUE(px2.get() == 0);
1604 CASE_EXPECT_TRUE(px3.get() == p);
1605 CASE_EXPECT_TRUE(px3.use_count() == 2);
1606
1607 using std::swap;
1608 swap(px, px2);
1609
1610 CASE_EXPECT_TRUE(px.get() == 0);
1611 CASE_EXPECT_TRUE(px2.get() == p);
1612 CASE_EXPECT_TRUE(px2.use_count() == 2);
1613 CASE_EXPECT_TRUE(px3.get() == p);
1614 CASE_EXPECT_TRUE(px3.use_count() == 2);
1615 }
1616
1617 {
1618 X *p1 = new X;
1619 X *p2 = new X;
1620 copp::memory::strong_rc_ptr<X> px(p1);
1621 copp::memory::strong_rc_ptr<X> px2(p2);
1622 copp::memory::strong_rc_ptr<X> px3(px2);
1623
1624 px.swap(px2);
1625
1626 CASE_EXPECT_TRUE(px.get() == p2);
1627 CASE_EXPECT_TRUE(px.use_count() == 2);
1628 CASE_EXPECT_TRUE(px2.get() == p1);
1629 CASE_EXPECT_TRUE(px2.use_count() == 1);
1630 CASE_EXPECT_TRUE(px3.get() == p2);
1631 CASE_EXPECT_TRUE(px3.use_count() == 2);
1632
1633 using std::swap;
1634 swap(px, px2);
1635
1636 CASE_EXPECT_TRUE(px.get() == p1);
1637 CASE_EXPECT_TRUE(px.use_count() == 1);
1638 CASE_EXPECT_TRUE(px2.get() == p2);
1639 CASE_EXPECT_TRUE(px2.use_count() == 2);
1640 CASE_EXPECT_TRUE(px3.get() == p2);
1641 CASE_EXPECT_TRUE(px3.use_count() == 2);
1642 }
1643}
1644
1645} // namespace n_swap
1646
1647namespace n_comparison {
1648
1649struct X {
1651};
1652
1653struct Y {
1655};
1656
1657struct Z : public X, public virtual Y {};
1658
1659void test() {
1660 {
1661 copp::memory::strong_rc_ptr<X> px;
1662 CASE_EXPECT_TRUE(px == px);
1663 CASE_EXPECT_TRUE(!(px != px));
1664 CASE_EXPECT_TRUE(!(px < px));
1665
1666 copp::memory::strong_rc_ptr<X> px2;
1667
1668 CASE_EXPECT_TRUE(px.get() == px2.get());
1669 CASE_EXPECT_TRUE(px == px2);
1670 CASE_EXPECT_TRUE(!(px != px2));
1671 CASE_EXPECT_TRUE(!(px < px2 && px2 < px));
1672 }
1673
1674 {
1675 copp::memory::strong_rc_ptr<X> px;
1676 copp::memory::strong_rc_ptr<X> px2(px);
1677
1678 CASE_EXPECT_TRUE(px2 == px2);
1679 CASE_EXPECT_TRUE(!(px2 != px2));
1680 CASE_EXPECT_TRUE(!(px2 < px2));
1681
1682 CASE_EXPECT_TRUE(px.get() == px2.get());
1683 CASE_EXPECT_TRUE(px == px2);
1684 CASE_EXPECT_TRUE(!(px != px2));
1685 CASE_EXPECT_TRUE(!(px < px2 && px2 < px));
1686 }
1687
1688 {
1689 copp::memory::strong_rc_ptr<X> px;
1690 copp::memory::strong_rc_ptr<X> px2(new X);
1691
1692 CASE_EXPECT_TRUE(px2 == px2);
1693 CASE_EXPECT_TRUE(!(px2 != px2));
1694 CASE_EXPECT_TRUE(!(px2 < px2));
1695
1696 CASE_EXPECT_TRUE(px.get() != px2.get());
1697 CASE_EXPECT_TRUE(px != px2);
1698 CASE_EXPECT_TRUE(!(px == px2));
1699 CASE_EXPECT_TRUE(px < px2 || px2 < px);
1700 CASE_EXPECT_TRUE(!(px < px2 && px2 < px));
1701 }
1702
1703 {
1704 copp::memory::strong_rc_ptr<X> px(new X);
1705 copp::memory::strong_rc_ptr<X> px2(new X);
1706
1707 CASE_EXPECT_TRUE(px.get() != px2.get());
1708 CASE_EXPECT_TRUE(px != px2);
1709 CASE_EXPECT_TRUE(!(px == px2));
1710 CASE_EXPECT_TRUE(px < px2 || px2 < px);
1711 CASE_EXPECT_TRUE(!(px < px2 && px2 < px));
1712 }
1713
1714 {
1715 copp::memory::strong_rc_ptr<X> px(new X);
1716 copp::memory::strong_rc_ptr<X> px2(px);
1717
1718 CASE_EXPECT_TRUE(px2 == px2);
1719 CASE_EXPECT_TRUE(!(px2 != px2));
1720 CASE_EXPECT_TRUE(!(px2 < px2));
1721
1722 CASE_EXPECT_TRUE(px.get() == px2.get());
1723 CASE_EXPECT_TRUE(px == px2);
1724 CASE_EXPECT_TRUE(!(px != px2));
1725 CASE_EXPECT_TRUE(!(px < px2 || px2 < px));
1726 }
1727
1728 {
1729 copp::memory::strong_rc_ptr<X> px(new X);
1730 copp::memory::strong_rc_ptr<Y> py(new Y);
1731 copp::memory::strong_rc_ptr<Z> pz(new Z);
1732
1733 CASE_EXPECT_TRUE(px.get() != pz.get());
1734 CASE_EXPECT_TRUE(px != pz);
1735 CASE_EXPECT_TRUE(!(px == pz));
1736
1737 CASE_EXPECT_TRUE(py.get() != pz.get());
1738 CASE_EXPECT_TRUE(py != pz);
1739 CASE_EXPECT_TRUE(!(py == pz));
1740
1741 CASE_EXPECT_TRUE(px < py || py < px);
1742 CASE_EXPECT_TRUE(px < pz || pz < px);
1743 CASE_EXPECT_TRUE(py < pz || pz < py);
1744
1745 CASE_EXPECT_TRUE(!(px < py && py < px));
1746 CASE_EXPECT_TRUE(!(px < pz && pz < px));
1747 CASE_EXPECT_TRUE(!(py < pz && pz < py));
1748
1749 copp::memory::strong_rc_ptr<void> pvx(px);
1750
1751 CASE_EXPECT_TRUE(pvx == pvx);
1752 CASE_EXPECT_TRUE(!(pvx != pvx));
1753 CASE_EXPECT_TRUE(!(pvx < pvx));
1754
1755 copp::memory::strong_rc_ptr<void> pvy(py);
1756 copp::memory::strong_rc_ptr<void> pvz(pz);
1757
1758 CASE_EXPECT_TRUE(pvx < pvy || pvy < pvx);
1759 CASE_EXPECT_TRUE(pvx < pvz || pvz < pvx);
1760 CASE_EXPECT_TRUE(pvy < pvz || pvz < pvy);
1761
1762 CASE_EXPECT_TRUE(!(pvx < pvy && pvy < pvx));
1763 CASE_EXPECT_TRUE(!(pvx < pvz && pvz < pvx));
1764 CASE_EXPECT_TRUE(!(pvy < pvz && pvz < pvy));
1765 }
1766
1767 {
1768 copp::memory::strong_rc_ptr<Z> pz(new Z);
1769 copp::memory::strong_rc_ptr<X> px(pz);
1770
1771 CASE_EXPECT_TRUE(px == px);
1772 CASE_EXPECT_TRUE(!(px != px));
1773 CASE_EXPECT_TRUE(!(px < px));
1774
1775 copp::memory::strong_rc_ptr<Y> py(pz);
1776
1777 CASE_EXPECT_TRUE(px.get() == pz.get());
1778 CASE_EXPECT_TRUE(px == pz);
1779 CASE_EXPECT_TRUE(!(px != pz));
1780
1781 CASE_EXPECT_TRUE(py.get() == pz.get());
1782 CASE_EXPECT_TRUE(py == pz);
1783 CASE_EXPECT_TRUE(!(py != pz));
1784
1785 CASE_EXPECT_TRUE(px < py || py < px);
1786 CASE_EXPECT_TRUE(!(px < pz || pz < px));
1787 CASE_EXPECT_TRUE(!(py < pz || pz < py));
1788
1789 copp::memory::strong_rc_ptr<void> pvx(px);
1790 copp::memory::strong_rc_ptr<void> pvy(py);
1791 copp::memory::strong_rc_ptr<void> pvz(pz);
1792
1793 // pvx and pvy aren't equal...
1794 CASE_EXPECT_TRUE(pvx.get() != pvy.get());
1795 CASE_EXPECT_TRUE(pvx != pvy);
1796 CASE_EXPECT_TRUE(!(pvx == pvy));
1797
1798 // ... but they share ownership ...
1799 CASE_EXPECT_TRUE(pvx < pvy || pvy < pvx);
1800
1801 // ... with pvz
1802 // CASE_EXPECT_TRUE(!(pvx < pvz || pvz < pvx));
1803 CASE_EXPECT_TRUE(pvy < pvz || pvz < pvy);
1804 }
1805}
1806
1807} // namespace n_comparison
1808
1809namespace n_static_cast {
1810
1811struct X {};
1812
1813struct Y : public X {};
1814
1815void test() {
1816 {
1817 copp::memory::strong_rc_ptr<void> pv;
1818
1819 copp::memory::strong_rc_ptr<int> pi = copp::memory::static_pointer_cast<int>(pv);
1820 CASE_EXPECT_TRUE(pi.get() == 0);
1821
1822 copp::memory::strong_rc_ptr<X> px = copp::memory::static_pointer_cast<X>(pv);
1823 CASE_EXPECT_TRUE(px.get() == 0);
1824 }
1825
1826 {
1827 copp::memory::strong_rc_ptr<int> pi(new int);
1828 copp::memory::strong_rc_ptr<void> pv(pi);
1829
1830 copp::memory::strong_rc_ptr<int> pi2 = copp::memory::static_pointer_cast<int>(pv);
1831 CASE_EXPECT_TRUE(pi.get() == pi2.get());
1832 CASE_EXPECT_TRUE(!(pi < pi2 || pi2 < pi));
1833 CASE_EXPECT_TRUE(pi.use_count() == 3);
1834 CASE_EXPECT_TRUE(pv.use_count() == 3);
1835 CASE_EXPECT_TRUE(pi2.use_count() == 3);
1836 }
1837
1838 {
1839 copp::memory::strong_rc_ptr<X> px(new X);
1840 copp::memory::strong_rc_ptr<void> pv(px);
1841
1842 copp::memory::strong_rc_ptr<X> px2 = copp::memory::static_pointer_cast<X>(pv);
1843 CASE_EXPECT_TRUE(px.get() == px2.get());
1844 CASE_EXPECT_TRUE(!(px < px2 || px2 < px));
1845 CASE_EXPECT_TRUE(px.use_count() == 3);
1846 CASE_EXPECT_TRUE(pv.use_count() == 3);
1847 CASE_EXPECT_TRUE(px2.use_count() == 3);
1848 }
1849
1850 {
1851 copp::memory::strong_rc_ptr<X> px(new Y);
1852
1853 copp::memory::strong_rc_ptr<Y> py = copp::memory::static_pointer_cast<Y>(px);
1854 CASE_EXPECT_TRUE(px.get() == py.get());
1855 CASE_EXPECT_TRUE(px.use_count() == 2);
1856 CASE_EXPECT_TRUE(py.use_count() == 2);
1857
1858 copp::memory::strong_rc_ptr<X> px2(py);
1859 CASE_EXPECT_TRUE(!(px < px2 || px2 < px));
1860 }
1861}
1862
1863} // namespace n_static_cast
1864
1865namespace n_const_cast {
1866
1867struct X;
1868
1869void test() {
1870 {
1871 copp::memory::strong_rc_ptr<void const volatile> px;
1872
1873 copp::memory::strong_rc_ptr<void> px2 = copp::memory::const_pointer_cast<void>(px);
1874 CASE_EXPECT_TRUE(px2.get() == 0);
1875 }
1876
1877 {
1878 copp::memory::strong_rc_ptr<int const volatile> px;
1879
1880 copp::memory::strong_rc_ptr<int> px2 = copp::memory::const_pointer_cast<int>(px);
1881 CASE_EXPECT_TRUE(px2.get() == 0);
1882 }
1883
1884 {
1885 copp::memory::strong_rc_ptr<X const volatile> px;
1886
1887 copp::memory::strong_rc_ptr<X> px2 = copp::memory::const_pointer_cast<X>(px);
1888 CASE_EXPECT_TRUE(px2.get() == 0);
1889 }
1890
1891 {
1892 copp::memory::strong_rc_ptr<void const volatile> px(new int);
1893
1894 copp::memory::strong_rc_ptr<void> px2 = copp::memory::const_pointer_cast<void>(px);
1895 CASE_EXPECT_TRUE(px.get() == px2.get());
1896 CASE_EXPECT_TRUE(!(px < px2 || px2 < px));
1897 CASE_EXPECT_TRUE(px.use_count() == 2);
1898 CASE_EXPECT_TRUE(px2.use_count() == 2);
1899 }
1900
1901 {
1902 copp::memory::strong_rc_ptr<int const volatile> px(new int);
1903
1904 copp::memory::strong_rc_ptr<int> px2 = copp::memory::const_pointer_cast<int>(px);
1905 CASE_EXPECT_TRUE(px.get() == px2.get());
1906 CASE_EXPECT_TRUE(!(px < px2 || px2 < px));
1907 CASE_EXPECT_TRUE(px.use_count() == 2);
1908 CASE_EXPECT_TRUE(px2.use_count() == 2);
1909 }
1910}
1911
1912} // namespace n_const_cast
1913
1914#if defined(LIBCOPP_MACRO_ENABLE_RTTI) && LIBCOPP_MACRO_ENABLE_RTTI
1915
1916namespace n_dynamic_cast {
1917
1918struct V {
1919 virtual ~V() {}
1920};
1921
1922struct W : public V {};
1923
1924void test() {
1925 {
1926 copp::memory::strong_rc_ptr<V> pv;
1927 copp::memory::strong_rc_ptr<W> pw = copp::memory::dynamic_pointer_cast<W>(pv);
1928 CASE_EXPECT_TRUE(pw.get() == 0);
1929 }
1930
1931 {
1932 copp::memory::strong_rc_ptr<V> pv(static_cast<V *>(0));
1933
1934 copp::memory::strong_rc_ptr<W> pw = copp::memory::dynamic_pointer_cast<W>(pv);
1935 CASE_EXPECT_TRUE(pw.get() == 0);
1936
1937 copp::memory::strong_rc_ptr<V> pv2(pw);
1938 CASE_EXPECT_TRUE(!(pv < pv2 || pv2 < pv));
1939 }
1940
1941 {
1942 copp::memory::strong_rc_ptr<V> pv(static_cast<W *>(0));
1943
1944 copp::memory::strong_rc_ptr<W> pw = copp::memory::dynamic_pointer_cast<W>(pv);
1945 CASE_EXPECT_TRUE(pw.get() == 0);
1946
1947 copp::memory::strong_rc_ptr<V> pv2(pw);
1948 CASE_EXPECT_TRUE(!(pv < pv2 || pv2 < pv));
1949 }
1950
1951 {
1952 copp::memory::strong_rc_ptr<V> pv(new V);
1953
1954 copp::memory::strong_rc_ptr<W> pw = copp::memory::dynamic_pointer_cast<W>(pv);
1955 CASE_EXPECT_TRUE(pw.get() == 0);
1956
1957 copp::memory::strong_rc_ptr<V> pv2(pw);
1958 CASE_EXPECT_TRUE(pv < pv2 || pv2 < pv);
1959 }
1960
1961 {
1962 copp::memory::strong_rc_ptr<V> pv(new W);
1963
1964 copp::memory::strong_rc_ptr<W> pw = copp::memory::dynamic_pointer_cast<W>(pv);
1965 CASE_EXPECT_TRUE(pw.get() == pv.get());
1966 CASE_EXPECT_TRUE(pv.use_count() == 2);
1967 CASE_EXPECT_TRUE(pw.use_count() == 2);
1968
1969 copp::memory::strong_rc_ptr<V> pv2(pw);
1970 CASE_EXPECT_TRUE(!(pv < pv2 || pv2 < pv));
1971 }
1972}
1973
1974} // namespace n_dynamic_cast
1975
1976#endif
1977
1978namespace n_map {
1979
1980struct X {};
1981
1982void test() {
1983 std::vector<copp::memory::strong_rc_ptr<int>> vi;
1984
1985 {
1986 copp::memory::strong_rc_ptr<int> pi1(new int);
1987 copp::memory::strong_rc_ptr<int> pi2(new int);
1988 copp::memory::strong_rc_ptr<int> pi3(new int);
1989
1990 vi.push_back(pi1);
1991 vi.push_back(pi1);
1992 vi.push_back(pi1);
1993 vi.push_back(pi2);
1994 vi.push_back(pi1);
1995 vi.push_back(pi2);
1996 vi.push_back(pi1);
1997 vi.push_back(pi3);
1998 vi.push_back(pi3);
1999 vi.push_back(pi2);
2000 vi.push_back(pi1);
2001 }
2002
2003 std::vector<copp::memory::strong_rc_ptr<X>> vx;
2004
2005 {
2006 copp::memory::strong_rc_ptr<X> px1(new X);
2007 copp::memory::strong_rc_ptr<X> px2(new X);
2008 copp::memory::strong_rc_ptr<X> px3(new X);
2009
2010 vx.push_back(px2);
2011 vx.push_back(px2);
2012 vx.push_back(px1);
2013 vx.push_back(px2);
2014 vx.push_back(px1);
2015 vx.push_back(px1);
2016 vx.push_back(px1);
2017 vx.push_back(px2);
2018 vx.push_back(px1);
2019 vx.push_back(px3);
2020 vx.push_back(px2);
2021 }
2022
2023 std::map<copp::memory::strong_rc_ptr<void>, int64_t> m;
2024
2025 {
2026 for (std::vector<copp::memory::strong_rc_ptr<int>>::iterator i = vi.begin(); i != vi.end(); ++i) {
2027 ++m[*i];
2028 }
2029 }
2030
2031 {
2032 for (std::vector<copp::memory::strong_rc_ptr<X>>::iterator i = vx.begin(); i != vx.end(); ++i) {
2033 ++m[*i];
2034 }
2035 }
2036
2037 {
2038 for (std::map<copp::memory::strong_rc_ptr<void>, int64_t>::iterator i = m.begin(); i != m.end(); ++i) {
2039 CASE_EXPECT_TRUE(i->first.use_count() == static_cast<std::size_t>(i->second + 1));
2040 }
2041 }
2042}
2043
2044} // namespace n_map
2045
2046namespace n_transitive {
2047
2048struct X {
2049 X() : next() {}
2050 copp::memory::strong_rc_ptr<X> next;
2051};
2052
2053void test() {
2054 copp::memory::strong_rc_ptr<X> p(new X);
2055 p->next = copp::memory::strong_rc_ptr<X>(new X);
2056 CASE_EXPECT_TRUE(!p->next->next);
2057 p = p->next;
2058 CASE_EXPECT_TRUE(!p->next);
2059}
2060
2061} // namespace n_transitive
2062
2063namespace n_report_1 {
2064
2065class foo {
2066 public:
2067 foo() : m_self(this) {}
2068
2069 void suicide() { m_self.reset(); }
2070
2071 private:
2072 copp::memory::strong_rc_ptr<foo> m_self;
2073};
2074
2075void test() {
2076 foo *foo_ptr = new foo;
2077 foo_ptr->suicide();
2078}
2079
2080} // namespace n_report_1
2081
2082// Test case by Per Kristensen
2083namespace n_report_2 {
2084
2085class foo {
2086 public:
2087 void setWeak(copp::memory::strong_rc_ptr<foo> s) { w = s; }
2088
2089 private:
2090 copp::memory::weak_rc_ptr<foo> w;
2091};
2092
2093class deleter {
2094 public:
2095 deleter() : lock(0) {}
2096
2098
2099 void operator()(foo *p) {
2100 ++lock;
2101 delete p;
2102 --lock;
2103 }
2104
2105 private:
2106 int lock;
2107};
2108
2109void test() {
2110 copp::memory::strong_rc_ptr<foo> s(new foo, deleter());
2111 s->setWeak(s);
2112 s.reset();
2113}
2114
2115} // namespace n_report_2
2116
2117namespace n_spt_incomplete {
2118
2119class file;
2120
2121copp::memory::strong_rc_ptr<file> fopen(char const *name, char const *mode);
2122void fread(copp::memory::strong_rc_ptr<file> f, void *data, int64_t size);
2123
2125
2126void test() {
2128
2129 {
2130 copp::memory::strong_rc_ptr<file> pf = fopen("name", "mode");
2132 fread(pf, 0, 17041);
2133 }
2134
2136}
2137
2138} // namespace n_spt_incomplete
2139
2140namespace n_spt_pimpl {
2141
2142class file {
2143 private:
2144 class impl;
2145 copp::memory::strong_rc_ptr<impl> pimpl_;
2146
2147 public:
2148 file(char const *name, char const *mode);
2149
2150 // compiler generated members are fine and useful
2151
2152 void read(void *data, int64_t size);
2153
2154 int64_t total_size() const;
2155};
2156
2158
2159void test() {
2161
2162 {
2163 file f("name", "mode");
2165 f.read(0, 152);
2166
2167 file f2(f);
2169 f2.read(0, 894);
2170
2171 CASE_EXPECT_TRUE(f.total_size() == 152 + 894);
2172
2173 {
2174 file f3("name2", "mode2");
2176 }
2177
2179 }
2180
2182}
2183
2184} // namespace n_spt_pimpl
2185
2186namespace n_spt_abstract {
2187
2188class X {
2189 public:
2190 virtual void f(int) = 0;
2191 virtual int g() = 0;
2192
2193 protected:
2194 virtual ~X() {}
2195};
2196
2197copp::memory::strong_rc_ptr<X> createX();
2198
2200
2201void test() {
2203
2204 {
2205 copp::memory::strong_rc_ptr<X> px = createX();
2206
2208
2209 px->f(18);
2210 px->f(152);
2211
2212 CASE_EXPECT_TRUE(px->g() == 170);
2213 }
2214
2216}
2217
2218} // namespace n_spt_abstract
2219
2220namespace n_spt_preventing_delete {
2221
2223
2224class X {
2225 private:
2227
2229
2230 class deleter;
2231 friend class deleter;
2232
2233 class deleter {
2234 public:
2235 void operator()(X *p) { delete p; }
2236 };
2237
2238 public:
2239 static copp::memory::strong_rc_ptr<X> create() {
2240 copp::memory::strong_rc_ptr<X> px(new X, X::deleter());
2241 return px;
2242 }
2243};
2244
2245void test() {
2247
2248 {
2249 copp::memory::strong_rc_ptr<X> px = X::create();
2251 }
2252
2254}
2255
2256} // namespace n_spt_preventing_delete
2257
2258namespace n_spt_array {
2259
2261
2262struct X {
2264
2266};
2267
2268void test() {
2270
2271 {
2272 auto p = new X[4];
2273 copp::memory::strong_rc_ptr<X> px(p, checked_array_deleter<X>());
2275 }
2276
2278}
2279
2280} // namespace n_spt_array
2281
2282namespace n_spt_static {
2283
2284class X {
2285 public:
2286 X() {}
2287
2288 private:
2289 void operator delete(void *) {
2290 // Comeau 4.3.0.1 wants a definition
2291 CASE_EXPECT_ERROR("n_spt_static::X::operator delete() called.");
2292 }
2293};
2294
2296 void operator()(void const *) const {}
2297};
2298
2299static X x;
2300
2301void test() { copp::memory::strong_rc_ptr<X> px(&x, null_deleter()); }
2302
2303} // namespace n_spt_static
2304
2305namespace n_spt_intrusive {
2306
2308
2309struct X {
2310 int64_t count;
2311
2312 X() : count(0) { ++X_instances; }
2313
2315};
2316
2318
2320 if (--p->count == 0) delete p;
2321}
2322
2323template <class T>
2325 void operator()(T *p) {
2326 if (p != 0) intrusive_ptr_release(p);
2327 }
2328};
2329
2330copp::memory::strong_rc_ptr<X> make_shared_from_intrusive(X *p) {
2331 if (p != 0) intrusive_ptr_add_ref(p);
2332 copp::memory::strong_rc_ptr<X> px(p, intrusive_deleter<X>());
2333 return px;
2334}
2335
2336void test() {
2338
2339 {
2340 X *p = new X;
2342 CASE_EXPECT_TRUE(p->count == 0);
2343 copp::memory::strong_rc_ptr<X> px = make_shared_from_intrusive(p);
2344 CASE_EXPECT_TRUE(px.get() == p);
2345 CASE_EXPECT_TRUE(p->count == 1);
2346 copp::memory::strong_rc_ptr<X> px2(px);
2347 CASE_EXPECT_TRUE(px2.get() == p);
2348 CASE_EXPECT_TRUE(p->count == 1);
2349 }
2350
2352}
2353
2354} // namespace n_spt_intrusive
2355
2356namespace n_spt_another_sp {
2357
2358template <class T>
2359class another_ptr : private copp::memory::strong_rc_ptr<T> {
2360 private:
2361 typedef copp::memory::strong_rc_ptr<T> base_type;
2362
2363 public:
2364 explicit another_ptr(T *p = 0) : base_type(p) {}
2365
2366 void reset() { base_type::reset(); }
2367
2368 T *get() const { return base_type::get(); }
2369};
2370
2372 public:
2373 virtual ~event_handler() {}
2374 virtual void begin() = 0;
2375 virtual void handle(int event) = 0;
2376 virtual void end() = 0;
2377};
2378
2382
2384 public:
2385 void begin() override { ++begin_called; }
2386
2387 void handle(int event) override { handle_called = event; }
2388
2389 void end() override { ++end_called; }
2390};
2391
2396
2397copp::memory::strong_rc_ptr<event_handler> current_handler;
2398
2399void install_event_handler(copp::memory::strong_rc_ptr<event_handler> p) {
2400 p->begin();
2401 current_handler = p;
2402}
2403
2404void handle_event(int event) { current_handler->handle(event); }
2405
2407 current_handler->end();
2409}
2410
2411template <class P>
2413 private:
2415
2416 public:
2417 explicit smart_pointer_deleter(P const &p) : p_(p) {}
2418
2419 void operator()(void const *) { p_.reset(); }
2420};
2421
2422void test() {
2424
2425 copp::memory::strong_rc_ptr<event_handler> q(p.get(), smart_pointer_deleter<another_ptr<event_handler>>(p));
2426
2427 p.reset();
2428
2430
2432
2434
2436
2437 handle_event(17041);
2438
2440
2442
2444
2446}
2447
2448} // namespace n_spt_another_sp
2449
2450namespace n_spt_shared_from_this {
2451
2452class X {
2453 public:
2454 virtual void f() = 0;
2455
2456 protected:
2457 virtual ~X() {}
2458};
2459
2460class Y {
2461 public:
2462 virtual copp::memory::strong_rc_ptr<X> getX() = 0;
2463
2464 protected:
2465 virtual ~Y() {}
2466};
2467
2468class impl : public X, public Y {
2469 private:
2470 copp::memory::weak_rc_ptr<impl> weak_this;
2471
2472 impl(impl const &);
2474
2475 impl() {}
2476
2477 public:
2478 static copp::memory::strong_rc_ptr<impl> create() {
2479 copp::memory::strong_rc_ptr<impl> pi(new impl);
2480 pi->weak_this = pi;
2481 return pi;
2482 }
2483
2484 void f() override {}
2485
2486 copp::memory::strong_rc_ptr<X> getX() override {
2487 copp::memory::strong_rc_ptr<X> px = weak_this.lock();
2488 return px;
2489 }
2490};
2491
2492void test() {
2493 copp::memory::strong_rc_ptr<Y> py = impl::create();
2494 CASE_EXPECT_TRUE(py.get() != 0);
2495 CASE_EXPECT_TRUE(py.use_count() == 1);
2496
2497 copp::memory::strong_rc_ptr<X> px = py->getX();
2498 CASE_EXPECT_TRUE(px.get() != 0);
2499 CASE_EXPECT_TRUE(py.use_count() == 2);
2500
2501#if defined(LIBCOPP_MACRO_ENABLE_RTTI) && LIBCOPP_MACRO_ENABLE_RTTI
2502 copp::memory::strong_rc_ptr<Y> py2 = copp::memory::dynamic_pointer_cast<Y>(px);
2503 CASE_EXPECT_TRUE(py.get() == py2.get());
2504 CASE_EXPECT_TRUE(!(py < py2 || py2 < py));
2505 CASE_EXPECT_TRUE(py.use_count() == 3);
2506#endif
2507}
2508
2509} // namespace n_spt_shared_from_this
2510
2511namespace n_spt_wrap {
2512
2513void test() {}
2514
2515} // namespace n_spt_wrap
2516
2517CASE_TEST(rc_ptr, strong_rc_basic) {
2521 n_reset::test();
2524 n_swap::test();
2528#if defined(LIBCOPP_MACRO_ENABLE_RTTI) && LIBCOPP_MACRO_ENABLE_RTTI
2529 n_dynamic_cast::test();
2530#endif
2531
2532 n_map::test();
2533
2537
2548}
2549
2550namespace n_spt_incomplete {
2551
2552class file {
2553 public:
2555
2560
2562};
2563
2564copp::memory::strong_rc_ptr<file> fopen(char const *, char const *) {
2565 copp::memory::strong_rc_ptr<file> pf(new file);
2566 return pf;
2567}
2568
2569void fread(copp::memory::strong_rc_ptr<file> pf, void *, int64_t) { pf->fread_called = true; }
2570
2571} // namespace n_spt_incomplete
2572
2573namespace n_spt_pimpl {
2574
2576 private:
2577 impl(impl const &);
2579
2581
2582 public:
2583 impl(char const *, char const *) : total_size_(0) { ++file_instances; }
2584
2586
2587 void read(void *, int64_t size) { total_size_ += size; }
2588
2589 int64_t total_size() const { return total_size_; }
2590};
2591
2592file::file(char const *name, char const *mode) : pimpl_(new impl(name, mode)) {}
2593
2594void file::read(void *data, int64_t size) { pimpl_->read(data, size); }
2595
2596int64_t file::total_size() const { return pimpl_->total_size(); }
2597
2598} // namespace n_spt_pimpl
2599
2600namespace n_spt_abstract {
2601
2602class X_impl : public X {
2603 private:
2604 X_impl(X_impl const &);
2606
2607 int n_;
2608
2609 public:
2610 X_impl() : n_(0) { ++X_instances; }
2611
2613
2614 void f(int n) override { n_ += n; }
2615
2616 int g() override { return n_; }
2617};
2618
2619copp::memory::strong_rc_ptr<X> createX() {
2620 copp::memory::strong_rc_ptr<X> px(new X_impl);
2621 return px;
2622}
2623
2624} // namespace n_spt_abstract
2625} // namespace strong_rc
2626
2627namespace strong_rc_fn {
2628
2629static void f() {}
2630
2632 template <class Y>
2633 void operator()(Y *) {}
2634};
2635
2637 copp::memory::strong_rc_ptr<void()> pf(f, null_deleter());
2638
2639 CASE_EXPECT_EQ(f, pf.get());
2640
2641 copp::memory::weak_rc_ptr<void()> wp(pf);
2642
2643 CASE_EXPECT_EQ(wp.lock().get(), f);
2644 CASE_EXPECT_EQ(wp.use_count(), 1);
2645
2646 pf.reset();
2647
2648 CASE_EXPECT_EQ(wp.lock().get(), nullptr);
2649 CASE_EXPECT_EQ(wp.use_count(), 0);
2650}
2651} // namespace strong_rc_fn
2652
2654
2655struct X {
2656 static int64_t instances;
2657
2658 X() { ++instances; }
2659
2660 ~X() { --instances; }
2661
2662 private:
2663 X(X const &);
2664 X &operator=(X const &);
2665};
2666
2667int64_t X::instances = 0;
2668
2671
2672 {
2673 copp::memory::strong_rc_ptr<X> p(new X);
2675
2676 copp::memory::strong_rc_ptr<X> p2(std::move(p));
2678 CASE_EXPECT_TRUE(p.get() == 0);
2679
2680 copp::memory::strong_rc_ptr<void> p3(std::move(p2));
2682 CASE_EXPECT_TRUE(p2.get() == 0);
2683
2684 p3.reset();
2686 }
2687
2688 {
2689 copp::memory::strong_rc_ptr<X> p(new X);
2691
2692 copp::memory::strong_rc_ptr<X> p2;
2693 p2 = std::move(p);
2695 CASE_EXPECT_TRUE(p.get() == 0);
2696
2697 copp::memory::strong_rc_ptr<void> p3;
2698 p3 = std::move(p2);
2700 CASE_EXPECT_TRUE(p2.get() == 0);
2701
2702 p3.reset();
2704 }
2705
2706 {
2707 copp::memory::strong_rc_ptr<X> p(new X);
2709
2710 copp::memory::strong_rc_ptr<X> p2(new X);
2712 p2 = std::move(p);
2714 CASE_EXPECT_TRUE(p.get() == 0);
2715
2716 copp::memory::strong_rc_ptr<void> p3(new X);
2718 p3 = std::move(p2);
2720 CASE_EXPECT_TRUE(p2.get() == 0);
2721
2722 p3.reset();
2724 }
2725}
2726
2727} // namespace strong_rc_move
2728
2730
2731class X {
2732 private:
2733 X(X const &);
2734 X &operator=(X const &);
2735
2736 void *operator new(std::size_t n) {
2737 // lack of this definition causes link errors on Comeau C++
2738 CASE_EXPECT_ERROR("private X::new called");
2739 return ::operator new(n);
2740 }
2741
2742 void operator delete(void *p) {
2743 // lack of this definition causes link errors on MSVC
2744 CASE_EXPECT_ERROR("private X::delete called");
2745 ::operator delete(p);
2746 }
2747
2748 public:
2749 static int instances;
2750
2751 int v;
2752
2753 explicit X(int a1 = 0, int a2 = 0, int a3 = 0, int a4 = 0, int a5 = 0, int a6 = 0, int a7 = 0, int a8 = 0, int a9 = 0)
2754 : v(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9) {
2755 ++instances;
2756 }
2757
2758 ~X() { --instances; }
2759};
2760
2761int X::instances = 0;
2762
2764 {
2765 copp::memory::strong_rc_ptr<int> pi = copp::memory::make_strong_rc<int>();
2766
2767 CASE_EXPECT_TRUE(pi.get() != 0);
2768 CASE_EXPECT_TRUE(pi.use_count() == 1);
2769
2770 CASE_EXPECT_TRUE(*pi == 0);
2771 }
2772
2773 {
2774 copp::memory::strong_rc_ptr<int> pi = copp::memory::make_strong_rc<int>(5);
2775
2776 CASE_EXPECT_TRUE(pi.get() != 0);
2777 CASE_EXPECT_TRUE(pi.use_count() == 1);
2778
2779 CASE_EXPECT_TRUE(*pi == 5);
2780 }
2781
2783
2784 {
2785 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>();
2786 copp::memory::weak_rc_ptr<X> wp(pi);
2787
2789 CASE_EXPECT_TRUE(pi.get() != 0);
2790 CASE_EXPECT_TRUE(pi.use_count() == 1);
2791 CASE_EXPECT_TRUE(pi->v == 0);
2792
2793 pi.reset();
2794
2796 }
2797
2798 {
2799 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1);
2800 copp::memory::weak_rc_ptr<X> wp(pi);
2801
2803 CASE_EXPECT_TRUE(pi.get() != 0);
2804 CASE_EXPECT_TRUE(pi.use_count() == 1);
2805 CASE_EXPECT_TRUE(pi->v == 1);
2806
2807 pi.reset();
2808
2810 }
2811
2812 {
2813 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2);
2814 copp::memory::weak_rc_ptr<X> wp(pi);
2815
2817 CASE_EXPECT_TRUE(pi.get() != 0);
2818 CASE_EXPECT_TRUE(pi.use_count() == 1);
2819 CASE_EXPECT_TRUE(pi->v == 1 + 2);
2820
2821 pi.reset();
2822
2824 }
2825
2826 {
2827 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2, 3);
2828 copp::memory::weak_rc_ptr<X> wp(pi);
2829
2831 CASE_EXPECT_TRUE(pi.get() != 0);
2832 CASE_EXPECT_TRUE(pi.use_count() == 1);
2833 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3);
2834
2835 pi.reset();
2836
2838 }
2839
2840 {
2841 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2, 3, 4);
2842 copp::memory::weak_rc_ptr<X> wp(pi);
2843
2845 CASE_EXPECT_TRUE(pi.get() != 0);
2846 CASE_EXPECT_TRUE(pi.use_count() == 1);
2847 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4);
2848
2849 pi.reset();
2850
2852 }
2853
2854 {
2855 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2, 3, 4, 5);
2856 copp::memory::weak_rc_ptr<X> wp(pi);
2857
2859 CASE_EXPECT_TRUE(pi.get() != 0);
2860 CASE_EXPECT_TRUE(pi.use_count() == 1);
2861 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5);
2862
2863 pi.reset();
2864
2866 }
2867
2868 {
2869 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2, 3, 4, 5, 6);
2870 copp::memory::weak_rc_ptr<X> wp(pi);
2871
2873 CASE_EXPECT_TRUE(pi.get() != 0);
2874 CASE_EXPECT_TRUE(pi.use_count() == 1);
2875 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6);
2876
2877 pi.reset();
2878
2880 }
2881
2882 {
2883 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2, 3, 4, 5, 6, 7);
2884 copp::memory::weak_rc_ptr<X> wp(pi);
2885
2887 CASE_EXPECT_TRUE(pi.get() != 0);
2888 CASE_EXPECT_TRUE(pi.use_count() == 1);
2889 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6 + 7);
2890
2891 pi.reset();
2892
2894 }
2895
2896 {
2897 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2, 3, 4, 5, 6, 7, 8);
2898 copp::memory::weak_rc_ptr<X> wp(pi);
2899
2901 CASE_EXPECT_TRUE(pi.get() != 0);
2902 CASE_EXPECT_TRUE(pi.use_count() == 1);
2903 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8);
2904
2905 pi.reset();
2906
2908 }
2909
2910 {
2911 copp::memory::strong_rc_ptr<X> pi = copp::memory::make_strong_rc<X>(1, 2, 3, 4, 5, 6, 7, 8, 9);
2912 copp::memory::weak_rc_ptr<X> wp(pi);
2913
2915 CASE_EXPECT_TRUE(pi.get() != 0);
2916 CASE_EXPECT_TRUE(pi.use_count() == 1);
2917 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9);
2918
2919 pi.reset();
2920
2922 }
2923}
2924} // namespace make_strong_rc
2925
2926namespace weak_rc {
2927
2928namespace n_element_type {
2929
2930void f(int &) {}
2931
2932void test() {
2933 typedef copp::memory::weak_rc_ptr<int>::element_type T;
2934 T t;
2935 f(t);
2936}
2937
2938} // namespace n_element_type
2939
2940class incomplete;
2941
2942copp::memory::strong_rc_ptr<incomplete> create_incomplete();
2943
2944struct X {
2946};
2947
2948struct Y {
2950};
2951
2952struct Z : public X, public virtual Y {};
2953
2954namespace n_constructors {
2955
2957 {
2958 copp::memory::weak_rc_ptr<int> wp;
2959 CASE_EXPECT_TRUE(wp.use_count() == 0);
2960 }
2961
2962 {
2963 copp::memory::weak_rc_ptr<void> wp;
2964 CASE_EXPECT_TRUE(wp.use_count() == 0);
2965 }
2966
2967 {
2968 copp::memory::weak_rc_ptr<incomplete> wp;
2969 CASE_EXPECT_TRUE(wp.use_count() == 0);
2970 }
2971}
2972
2974 {
2975 copp::memory::strong_rc_ptr<int> sp;
2976
2977 copp::memory::weak_rc_ptr<int> wp(sp);
2978 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
2979
2980 copp::memory::weak_rc_ptr<void> wp2(sp);
2981 CASE_EXPECT_TRUE(wp2.use_count() == sp.use_count());
2982 }
2983
2984 {
2985 copp::memory::strong_rc_ptr<int> sp(static_cast<int *>(0));
2986
2987 {
2988 copp::memory::weak_rc_ptr<int> wp(sp);
2989 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
2990 CASE_EXPECT_TRUE(wp.use_count() == 1);
2991 copp::memory::strong_rc_ptr<int> sp2(wp);
2992 CASE_EXPECT_TRUE(wp.use_count() == 2);
2993 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
2994 }
2995
2996 {
2997 copp::memory::weak_rc_ptr<void> wp(sp);
2998 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
2999 CASE_EXPECT_TRUE(wp.use_count() == 1);
3000 copp::memory::strong_rc_ptr<void> sp2(wp);
3001 CASE_EXPECT_TRUE(wp.use_count() == 2);
3002 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3003 }
3004 }
3005
3006 {
3007 copp::memory::strong_rc_ptr<int> sp(new int);
3008
3009 {
3010 copp::memory::weak_rc_ptr<int> wp(sp);
3011 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3012 CASE_EXPECT_TRUE(wp.use_count() == 1);
3013 copp::memory::strong_rc_ptr<int> sp2(wp);
3014 CASE_EXPECT_TRUE(wp.use_count() == 2);
3015 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3016 }
3017
3018 {
3019 copp::memory::weak_rc_ptr<void> wp(sp);
3020 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3021 CASE_EXPECT_TRUE(wp.use_count() == 1);
3022 copp::memory::strong_rc_ptr<void> sp2(wp);
3023 CASE_EXPECT_TRUE(wp.use_count() == 2);
3024 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3025 }
3026 }
3027
3028 {
3029 copp::memory::strong_rc_ptr<void> sp;
3030
3031 copp::memory::weak_rc_ptr<void> wp(sp);
3032 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3033 }
3034
3035 {
3036 copp::memory::strong_rc_ptr<void> sp(static_cast<int *>(0));
3037
3038 copp::memory::weak_rc_ptr<void> wp(sp);
3039 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3040 CASE_EXPECT_TRUE(wp.use_count() == 1);
3041 copp::memory::strong_rc_ptr<void> sp2(wp);
3042 CASE_EXPECT_TRUE(wp.use_count() == 2);
3043 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3044 }
3045
3046 {
3047 copp::memory::strong_rc_ptr<void> sp(new int);
3048
3049 copp::memory::weak_rc_ptr<void> wp(sp);
3050 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3051 CASE_EXPECT_TRUE(wp.use_count() == 1);
3052 copp::memory::strong_rc_ptr<void> sp2(wp);
3053 CASE_EXPECT_TRUE(wp.use_count() == 2);
3054 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3055 }
3056
3057 {
3058 copp::memory::strong_rc_ptr<incomplete> sp;
3059
3060 copp::memory::weak_rc_ptr<incomplete> wp(sp);
3061 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3062
3063 copp::memory::weak_rc_ptr<void> wp2(sp);
3064 CASE_EXPECT_TRUE(wp2.use_count() == sp.use_count());
3065 }
3066
3067 {
3068 copp::memory::strong_rc_ptr<incomplete> sp = create_incomplete();
3069
3070 {
3071 copp::memory::weak_rc_ptr<incomplete> wp(sp);
3072 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3073 CASE_EXPECT_TRUE(wp.use_count() == 1);
3074 copp::memory::strong_rc_ptr<incomplete> sp2(wp);
3075 CASE_EXPECT_TRUE(wp.use_count() == 2);
3076 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3077 }
3078
3079 {
3080 copp::memory::weak_rc_ptr<void> wp(sp);
3081 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3082 CASE_EXPECT_TRUE(wp.use_count() == 1);
3083 copp::memory::strong_rc_ptr<void> sp2(wp);
3084 CASE_EXPECT_TRUE(wp.use_count() == 2);
3085 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3086 }
3087 }
3088
3089 {
3090 copp::memory::strong_rc_ptr<void> sp = create_incomplete();
3091
3092 copp::memory::weak_rc_ptr<void> wp(sp);
3093 CASE_EXPECT_TRUE(wp.use_count() == sp.use_count());
3094 CASE_EXPECT_TRUE(wp.use_count() == 1);
3095 copp::memory::strong_rc_ptr<void> sp2(wp);
3096 CASE_EXPECT_TRUE(wp.use_count() == 2);
3097 CASE_EXPECT_TRUE(!(sp < sp2 || sp2 < sp));
3098 }
3099}
3100
3102 {
3103 copp::memory::weak_rc_ptr<int> wp;
3104 copp::memory::weak_rc_ptr<int> wp2(wp);
3105 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3106 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3107 }
3108
3109 {
3110 copp::memory::weak_rc_ptr<void> wp;
3111 copp::memory::weak_rc_ptr<void> wp2(wp);
3112 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3113 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3114 }
3115
3116 {
3117 copp::memory::weak_rc_ptr<incomplete> wp;
3118 copp::memory::weak_rc_ptr<incomplete> wp2(wp);
3119 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3120 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3121 }
3122
3123 {
3124 copp::memory::strong_rc_ptr<int> sp(static_cast<int *>(0));
3125 copp::memory::weak_rc_ptr<int> wp(sp);
3126
3127 copp::memory::weak_rc_ptr<int> wp2(wp);
3128 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3129 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3130 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3131
3132 sp.reset();
3133 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3134
3135 copp::memory::weak_rc_ptr<int> wp3(wp);
3136 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3137 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3138 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3139 }
3140
3141 {
3142 copp::memory::strong_rc_ptr<int> sp(new int);
3143 copp::memory::weak_rc_ptr<int> wp(sp);
3144
3145 copp::memory::weak_rc_ptr<int> wp2(wp);
3146 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3147 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3148 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3149
3150 sp.reset();
3151 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3152
3153 copp::memory::weak_rc_ptr<int> wp3(wp);
3154 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3155 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3156 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3157 }
3158
3159 {
3160 copp::memory::strong_rc_ptr<void> sp(static_cast<int *>(0));
3161 copp::memory::weak_rc_ptr<void> wp(sp);
3162
3163 copp::memory::weak_rc_ptr<void> wp2(wp);
3164 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3165 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3166 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3167
3168 sp.reset();
3169 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3170
3171 copp::memory::weak_rc_ptr<void> wp3(wp);
3172 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3173 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3174 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3175 }
3176
3177 {
3178 copp::memory::strong_rc_ptr<void> sp(new int);
3179 copp::memory::weak_rc_ptr<void> wp(sp);
3180
3181 copp::memory::weak_rc_ptr<void> wp2(wp);
3182 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3183 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3184 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3185
3186 sp.reset();
3187 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3188
3189 copp::memory::weak_rc_ptr<void> wp3(wp);
3190 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3191 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3192 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3193 }
3194
3195 {
3196 copp::memory::strong_rc_ptr<incomplete> sp = create_incomplete();
3197 copp::memory::weak_rc_ptr<incomplete> wp(sp);
3198
3199 copp::memory::weak_rc_ptr<incomplete> wp2(wp);
3200 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3201 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3202 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3203
3204 sp.reset();
3205 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3206
3207 copp::memory::weak_rc_ptr<incomplete> wp3(wp);
3208 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3209 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3210 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3211 }
3212}
3213
3215 {
3216 copp::memory::weak_rc_ptr<int> wp;
3217 copp::memory::weak_rc_ptr<void> wp2(wp);
3218 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3219 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3220 }
3221
3222 {
3223 copp::memory::weak_rc_ptr<incomplete> wp;
3224 copp::memory::weak_rc_ptr<void> wp2(wp);
3225 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3226 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3227 }
3228
3229 {
3230 copp::memory::weak_rc_ptr<Z> wp;
3231
3232 copp::memory::weak_rc_ptr<X> wp2(wp);
3233 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3234 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3235
3236 copp::memory::weak_rc_ptr<Y> wp3(wp);
3237 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3238 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3239 }
3240
3241 {
3242 copp::memory::strong_rc_ptr<int> sp(static_cast<int *>(0));
3243 copp::memory::weak_rc_ptr<int> wp(sp);
3244
3245 copp::memory::weak_rc_ptr<void> wp2(wp);
3246 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3247 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3248 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3249
3250 sp.reset();
3251 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3252
3253 copp::memory::weak_rc_ptr<void> wp3(wp);
3254 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3255 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3256 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3257 }
3258
3259 {
3260 copp::memory::strong_rc_ptr<int> sp(new int);
3261 copp::memory::weak_rc_ptr<int> wp(sp);
3262
3263 copp::memory::weak_rc_ptr<void> wp2(wp);
3264 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3265 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3266 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3267
3268 sp.reset();
3269 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3270
3271 copp::memory::weak_rc_ptr<void> wp3(wp);
3272 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3273 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3274 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3275 }
3276
3277 {
3278 copp::memory::strong_rc_ptr<incomplete> sp = create_incomplete();
3279 copp::memory::weak_rc_ptr<incomplete> wp(sp);
3280
3281 copp::memory::weak_rc_ptr<void> wp2(wp);
3282 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3283 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3284 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3285
3286 sp.reset();
3287 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3288
3289 copp::memory::weak_rc_ptr<void> wp3(wp);
3290 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3291 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3292 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3293 }
3294
3295 {
3296 copp::memory::strong_rc_ptr<Z> sp(static_cast<Z *>(0));
3297 copp::memory::weak_rc_ptr<Z> wp(sp);
3298
3299 copp::memory::weak_rc_ptr<X> wp2(wp);
3300 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3301 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3302 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3303
3304 sp.reset();
3305 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3306
3307 copp::memory::weak_rc_ptr<X> wp3(wp);
3308 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3309 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3310 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3311 }
3312
3313 {
3314 copp::memory::strong_rc_ptr<Z> sp(static_cast<Z *>(0));
3315 copp::memory::weak_rc_ptr<Z> wp(sp);
3316
3317 copp::memory::weak_rc_ptr<Y> wp2(wp);
3318 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3319 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3320 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3321
3322 sp.reset();
3323 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3324
3325 copp::memory::weak_rc_ptr<Y> wp3(wp);
3326 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3327 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3328 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3329 }
3330
3331 {
3332 copp::memory::strong_rc_ptr<Z> sp(new Z);
3333 copp::memory::weak_rc_ptr<Z> wp(sp);
3334
3335 copp::memory::weak_rc_ptr<X> wp2(wp);
3336 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3337 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3338 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3339
3340 sp.reset();
3341 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3342
3343 copp::memory::weak_rc_ptr<X> wp3(wp);
3344 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3345 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3346 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3347 }
3348
3349 {
3350 copp::memory::strong_rc_ptr<Z> sp(new Z);
3351 copp::memory::weak_rc_ptr<Z> wp(sp);
3352
3353 copp::memory::weak_rc_ptr<Y> wp2(wp);
3354 CASE_EXPECT_TRUE(wp2.use_count() == wp.use_count());
3355 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3356 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3357
3358 sp.reset();
3359 // CASE_EXPECT_TRUE(!(wp < wp2 || wp2 < wp));
3360
3361 copp::memory::weak_rc_ptr<Y> wp3(wp);
3362 CASE_EXPECT_TRUE(wp3.use_count() == wp.use_count());
3363 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3364 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3365 }
3366}
3367
3374
3375} // namespace n_constructors
3376
3377namespace n_assignment {
3378
3379template <class T>
3380void copy_assignment(copp::memory::strong_rc_ptr<T> &sp) {
3381 CASE_EXPECT_TRUE(sp.unique());
3382
3383 copp::memory::weak_rc_ptr<T> p1;
3384
3385 p1 = p1;
3386 CASE_EXPECT_TRUE(p1.use_count() == 0);
3387
3388 copp::memory::weak_rc_ptr<T> p2;
3389
3390 p1 = p2;
3391 CASE_EXPECT_TRUE(p1.use_count() == 0);
3392
3393 copp::memory::weak_rc_ptr<T> p3(p1);
3394
3395 p1 = p3;
3396 CASE_EXPECT_TRUE(p1.use_count() == 0);
3397
3398 copp::memory::weak_rc_ptr<T> p4(sp);
3399
3400 p4 = p4;
3401 CASE_EXPECT_TRUE(p4.use_count() == 1);
3402
3403 p1 = p4;
3404 CASE_EXPECT_TRUE(p1.use_count() == 1);
3405
3406 p4 = p2;
3407 CASE_EXPECT_TRUE(p4.use_count() == 0);
3408
3409 sp.reset();
3410
3411 p1 = p1;
3412 CASE_EXPECT_TRUE(p1.use_count() == 0);
3413
3414 p4 = p1;
3415 CASE_EXPECT_TRUE(p4.use_count() == 0);
3416}
3417
3419 {
3420 copp::memory::weak_rc_ptr<void> p1;
3421
3422 copp::memory::weak_rc_ptr<incomplete> p2;
3423
3424 p1 = p2;
3425 CASE_EXPECT_TRUE(p1.use_count() == 0);
3426
3427 copp::memory::strong_rc_ptr<incomplete> sp = create_incomplete();
3428 copp::memory::weak_rc_ptr<incomplete> p3(sp);
3429
3430 p1 = p3;
3431 CASE_EXPECT_TRUE(p1.use_count() == 1);
3432
3433 sp.reset();
3434
3435 p1 = p3;
3436 CASE_EXPECT_TRUE(p1.use_count() == 0);
3437
3438 p1 = p2;
3439 CASE_EXPECT_TRUE(p1.use_count() == 0);
3440 }
3441
3442 {
3443 copp::memory::weak_rc_ptr<X> p1;
3444
3445 copp::memory::weak_rc_ptr<Z> p2;
3446
3447 p1 = p2;
3448 CASE_EXPECT_TRUE(p1.use_count() == 0);
3449
3450 copp::memory::strong_rc_ptr<Z> sp(new Z);
3451 copp::memory::weak_rc_ptr<Z> p3(sp);
3452
3453 p1 = p3;
3454 CASE_EXPECT_TRUE(p1.use_count() == 1);
3455
3456 sp.reset();
3457
3458 p1 = p3;
3459 CASE_EXPECT_TRUE(p1.use_count() == 0);
3460
3461 p1 = p2;
3462 CASE_EXPECT_TRUE(p1.use_count() == 0);
3463 }
3464
3465 {
3466 copp::memory::weak_rc_ptr<Y> p1;
3467
3468 copp::memory::weak_rc_ptr<Z> p2;
3469
3470 p1 = p2;
3471 CASE_EXPECT_TRUE(p1.use_count() == 0);
3472
3473 copp::memory::strong_rc_ptr<Z> sp(new Z);
3474 copp::memory::weak_rc_ptr<Z> p3(sp);
3475
3476 p1 = p3;
3477 CASE_EXPECT_TRUE(p1.use_count() == 1);
3478
3479 sp.reset();
3480
3481 p1 = p3;
3482 CASE_EXPECT_TRUE(p1.use_count() == 0);
3483
3484 p1 = p2;
3485 CASE_EXPECT_TRUE(p1.use_count() == 0);
3486 }
3487}
3488
3489template <class T, class U>
3490void shared_ptr_assignment(copp::memory::strong_rc_ptr<U> &sp, T * = 0) {
3491 CASE_EXPECT_TRUE(sp.unique());
3492
3493 copp::memory::weak_rc_ptr<T> p1;
3494 copp::memory::weak_rc_ptr<T> p2(p1);
3495 copp::memory::weak_rc_ptr<T> p3(sp);
3496 copp::memory::weak_rc_ptr<T> p4(p3);
3497
3498 p1 = sp;
3499 CASE_EXPECT_TRUE(p1.use_count() == 1);
3500
3501 p2 = sp;
3502 CASE_EXPECT_TRUE(p2.use_count() == 1);
3503
3504 p3 = sp;
3505 CASE_EXPECT_TRUE(p3.use_count() == 1);
3506
3507 p4 = sp;
3508 CASE_EXPECT_TRUE(p4.use_count() == 1);
3509
3510 sp.reset();
3511
3512 CASE_EXPECT_TRUE(p1.use_count() == 0);
3513 CASE_EXPECT_TRUE(p2.use_count() == 0);
3514 CASE_EXPECT_TRUE(p3.use_count() == 0);
3515 CASE_EXPECT_TRUE(p4.use_count() == 0);
3516
3517 p1 = sp;
3518}
3519
3520void test() {
3521 {
3522 copp::memory::strong_rc_ptr<int> p(new int);
3523 copy_assignment(p);
3524 }
3525
3526 {
3527 copp::memory::strong_rc_ptr<X> p(new X);
3528 copy_assignment(p);
3529 }
3530
3531 {
3532 copp::memory::strong_rc_ptr<void> p(new int);
3533 copy_assignment(p);
3534 }
3535
3536 {
3537 copp::memory::strong_rc_ptr<incomplete> p = create_incomplete();
3538 copy_assignment(p);
3539 }
3540
3542
3543 {
3544 copp::memory::strong_rc_ptr<int> p(new int);
3545 shared_ptr_assignment<int>(p);
3546 }
3547
3548 {
3549 copp::memory::strong_rc_ptr<int> p(new int);
3550 shared_ptr_assignment<void>(p);
3551 }
3552
3553 {
3554 copp::memory::strong_rc_ptr<X> p(new X);
3555 shared_ptr_assignment<X>(p);
3556 }
3557
3558 {
3559 copp::memory::strong_rc_ptr<X> p(new X);
3560 shared_ptr_assignment<void>(p);
3561 }
3562
3563 {
3564 copp::memory::strong_rc_ptr<void> p(new int);
3565 shared_ptr_assignment<void>(p);
3566 }
3567
3568 {
3569 copp::memory::strong_rc_ptr<incomplete> p = create_incomplete();
3570 shared_ptr_assignment<incomplete>(p);
3571 }
3572
3573 {
3574 copp::memory::strong_rc_ptr<incomplete> p = create_incomplete();
3575 shared_ptr_assignment<void>(p);
3576 }
3577}
3578
3579} // namespace n_assignment
3580
3581namespace n_reset {
3582
3583template <class T, class U>
3584void test2(copp::memory::strong_rc_ptr<U> &sp, T * = 0) {
3585 CASE_EXPECT_TRUE(sp.unique());
3586
3587 copp::memory::weak_rc_ptr<T> p1;
3588 copp::memory::weak_rc_ptr<T> p2(p1);
3589 copp::memory::weak_rc_ptr<T> p3(sp);
3590 copp::memory::weak_rc_ptr<T> p4(p3);
3591 copp::memory::weak_rc_ptr<T> p5(sp);
3592 copp::memory::weak_rc_ptr<T> p6(p5);
3593
3594 p1.reset();
3595 CASE_EXPECT_TRUE(p1.use_count() == 0);
3596
3597 p2.reset();
3598 CASE_EXPECT_TRUE(p2.use_count() == 0);
3599
3600 p3.reset();
3601 CASE_EXPECT_TRUE(p3.use_count() == 0);
3602
3603 p4.reset();
3604 CASE_EXPECT_TRUE(p4.use_count() == 0);
3605
3606 sp.reset();
3607
3608 p5.reset();
3609 CASE_EXPECT_TRUE(p5.use_count() == 0);
3610
3611 p6.reset();
3612 CASE_EXPECT_TRUE(p6.use_count() == 0);
3613}
3614
3615void test() {
3616 {
3617 copp::memory::strong_rc_ptr<int> p(new int);
3618 test2<int>(p);
3619 }
3620
3621 {
3622 copp::memory::strong_rc_ptr<int> p(new int);
3623 test2<void>(p);
3624 }
3625
3626 {
3627 copp::memory::strong_rc_ptr<X> p(new X);
3628 test2<X>(p);
3629 }
3630
3631 {
3632 copp::memory::strong_rc_ptr<X> p(new X);
3633 test2<void>(p);
3634 }
3635
3636 {
3637 copp::memory::strong_rc_ptr<void> p(new int);
3638 test2<void>(p);
3639 }
3640
3641 {
3642 copp::memory::strong_rc_ptr<incomplete> p = create_incomplete();
3643 test2<incomplete>(p);
3644 }
3645
3646 {
3647 copp::memory::strong_rc_ptr<incomplete> p = create_incomplete();
3648 test2<void>(p);
3649 }
3650}
3651
3652} // namespace n_reset
3653
3654namespace n_use_count {
3655
3656void test() {
3657 {
3658 copp::memory::weak_rc_ptr<X> wp;
3659 CASE_EXPECT_TRUE(wp.use_count() == 0);
3660 CASE_EXPECT_TRUE(wp.expired());
3661
3662 copp::memory::weak_rc_ptr<X> wp2;
3663 CASE_EXPECT_TRUE(wp.use_count() == 0);
3664 CASE_EXPECT_TRUE(wp.expired());
3665
3666 copp::memory::weak_rc_ptr<X> wp3(wp);
3667 CASE_EXPECT_TRUE(wp.use_count() == 0);
3668 CASE_EXPECT_TRUE(wp.expired());
3669 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3670 CASE_EXPECT_TRUE(wp3.expired());
3671 }
3672
3673 {
3674 copp::memory::strong_rc_ptr<X> sp(static_cast<X *>(0));
3675
3676 copp::memory::weak_rc_ptr<X> wp(sp);
3677 CASE_EXPECT_TRUE(wp.use_count() == 1);
3678 CASE_EXPECT_TRUE(!wp.expired());
3679
3680 copp::memory::weak_rc_ptr<X> wp2(sp);
3681 CASE_EXPECT_TRUE(wp.use_count() == 1);
3682 CASE_EXPECT_TRUE(!wp.expired());
3683
3684 copp::memory::weak_rc_ptr<X> wp3(wp);
3685 CASE_EXPECT_TRUE(wp.use_count() == 1);
3686 CASE_EXPECT_TRUE(!wp.expired());
3687 CASE_EXPECT_TRUE(wp3.use_count() == 1);
3688 CASE_EXPECT_TRUE(!wp3.expired());
3689
3690 copp::memory::strong_rc_ptr<X> sp2(sp);
3691
3692 CASE_EXPECT_TRUE(wp.use_count() == 2);
3693 CASE_EXPECT_TRUE(!wp.expired());
3694 CASE_EXPECT_TRUE(wp2.use_count() == 2);
3695 CASE_EXPECT_TRUE(!wp2.expired());
3696 CASE_EXPECT_TRUE(wp3.use_count() == 2);
3697 CASE_EXPECT_TRUE(!wp3.expired());
3698
3699 copp::memory::strong_rc_ptr<void> sp3(sp);
3700
3701 CASE_EXPECT_TRUE(wp.use_count() == 3);
3702 CASE_EXPECT_TRUE(!wp.expired());
3703 CASE_EXPECT_TRUE(wp2.use_count() == 3);
3704 CASE_EXPECT_TRUE(!wp2.expired());
3705 CASE_EXPECT_TRUE(wp3.use_count() == 3);
3706 CASE_EXPECT_TRUE(!wp3.expired());
3707
3708 sp.reset();
3709
3710 CASE_EXPECT_TRUE(wp.use_count() == 2);
3711 CASE_EXPECT_TRUE(!wp.expired());
3712 CASE_EXPECT_TRUE(wp2.use_count() == 2);
3713 CASE_EXPECT_TRUE(!wp2.expired());
3714 CASE_EXPECT_TRUE(wp3.use_count() == 2);
3715 CASE_EXPECT_TRUE(!wp3.expired());
3716
3717 sp2.reset();
3718
3719 CASE_EXPECT_TRUE(wp.use_count() == 1);
3720 CASE_EXPECT_TRUE(!wp.expired());
3721 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3722 CASE_EXPECT_TRUE(!wp2.expired());
3723 CASE_EXPECT_TRUE(wp3.use_count() == 1);
3724 CASE_EXPECT_TRUE(!wp3.expired());
3725
3726 sp3.reset();
3727
3728 CASE_EXPECT_TRUE(wp.use_count() == 0);
3729 CASE_EXPECT_TRUE(wp.expired());
3730 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3731 CASE_EXPECT_TRUE(wp2.expired());
3732 CASE_EXPECT_TRUE(wp3.use_count() == 0);
3733 CASE_EXPECT_TRUE(wp3.expired());
3734 }
3735}
3736
3737} // namespace n_use_count
3738
3739namespace n_swap {
3740
3741void test() {
3742 {
3743 copp::memory::weak_rc_ptr<X> wp;
3744 copp::memory::weak_rc_ptr<X> wp2;
3745
3746 wp.swap(wp2);
3747
3748 CASE_EXPECT_TRUE(wp.use_count() == 0);
3749 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3750
3751 using std::swap;
3752 swap(wp, wp2);
3753
3754 CASE_EXPECT_TRUE(wp.use_count() == 0);
3755 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3756 }
3757
3758 {
3759 copp::memory::strong_rc_ptr<X> sp(new X);
3760 copp::memory::weak_rc_ptr<X> wp;
3761 copp::memory::weak_rc_ptr<X> wp2(sp);
3762 copp::memory::weak_rc_ptr<X> wp3(sp);
3763
3764 wp.swap(wp2);
3765
3766 CASE_EXPECT_TRUE(wp.use_count() == 1);
3767 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3768 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3769
3770 using std::swap;
3771 swap(wp, wp2);
3772
3773 CASE_EXPECT_TRUE(wp.use_count() == 0);
3774 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3775 // CASE_EXPECT_TRUE(!(wp2 < wp3 || wp3 < wp2));
3776
3777 sp.reset();
3778
3779 wp.swap(wp2);
3780
3781 CASE_EXPECT_TRUE(wp.use_count() == 0);
3782 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3783 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3784
3785 swap(wp, wp2);
3786
3787 CASE_EXPECT_TRUE(wp.use_count() == 0);
3788 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3789 // CASE_EXPECT_TRUE(!(wp2 < wp3 || wp3 < wp2));
3790 }
3791
3792 {
3793 copp::memory::strong_rc_ptr<X> sp(new X);
3794 copp::memory::strong_rc_ptr<X> sp2(new X);
3795 copp::memory::weak_rc_ptr<X> wp(sp);
3796 copp::memory::weak_rc_ptr<X> wp2(sp2);
3797 copp::memory::weak_rc_ptr<X> wp3(sp2);
3798
3799 wp.swap(wp2);
3800
3801 CASE_EXPECT_TRUE(wp.use_count() == 1);
3802 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3803 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3804
3805 using std::swap;
3806 swap(wp, wp2);
3807
3808 CASE_EXPECT_TRUE(wp.use_count() == 1);
3809 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3810 // CASE_EXPECT_TRUE(!(wp2 < wp3 || wp3 < wp2));
3811
3812 sp.reset();
3813
3814 wp.swap(wp2);
3815
3816 CASE_EXPECT_TRUE(wp.use_count() == 1);
3817 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3818 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3819
3820 swap(wp, wp2);
3821
3822 CASE_EXPECT_TRUE(wp.use_count() == 0);
3823 CASE_EXPECT_TRUE(wp2.use_count() == 1);
3824 // CASE_EXPECT_TRUE(!(wp2 < wp3 || wp3 < wp2));
3825
3826 sp2.reset();
3827
3828 wp.swap(wp2);
3829
3830 CASE_EXPECT_TRUE(wp.use_count() == 0);
3831 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3832 // CASE_EXPECT_TRUE(!(wp < wp3 || wp3 < wp));
3833
3834 swap(wp, wp2);
3835
3836 CASE_EXPECT_TRUE(wp.use_count() == 0);
3837 CASE_EXPECT_TRUE(wp2.use_count() == 0);
3838 // CASE_EXPECT_TRUE(!(wp2 < wp3 || wp3 < wp2));
3839 }
3840}
3841
3842} // namespace n_swap
3843
3844namespace n_lock {
3845
3846void test() {}
3847
3848} // namespace n_lock
3849
3850CASE_TEST(rc_ptr, weak_rc_ptr_basic) {
3854 n_reset::test();
3856 n_swap::test();
3857 n_lock::test();
3858}
3859
3860class incomplete {};
3861
3862copp::memory::strong_rc_ptr<incomplete> create_incomplete() {
3863 copp::memory::strong_rc_ptr<incomplete> px(new incomplete);
3864 return px;
3865}
3866
3867} // namespace weak_rc
3868
3870
3871struct X {
3872 static int64_t instances;
3873
3874 X() { ++instances; }
3875
3876 ~X() { --instances; }
3877
3878 private:
3879 X(X const &);
3880 X &operator=(X const &);
3881};
3882
3883int64_t X::instances = 0;
3884
3887
3888 {
3889 copp::memory::strong_rc_ptr<X> p_(new X);
3890 copp::memory::weak_rc_ptr<X> p(p_);
3892 CASE_EXPECT_TRUE(p.use_count() == 1);
3893
3894 copp::memory::weak_rc_ptr<X> p2(std::move(p));
3896 CASE_EXPECT_TRUE(p2.use_count() == 1);
3897 CASE_EXPECT_TRUE(p.expired());
3898
3899 copp::memory::weak_rc_ptr<void> p3(std::move(p2));
3901 CASE_EXPECT_TRUE(p3.use_count() == 1);
3902 CASE_EXPECT_TRUE(p2.expired());
3903
3904 p_.reset();
3906 CASE_EXPECT_TRUE(p3.expired());
3907 }
3908
3909 {
3910 copp::memory::strong_rc_ptr<X> p_(new X);
3911 copp::memory::weak_rc_ptr<X> p(p_);
3913 CASE_EXPECT_TRUE(p.use_count() == 1);
3914
3915 copp::memory::weak_rc_ptr<X> p2;
3916 p2 = static_cast<copp::memory::weak_rc_ptr<X> &&>(p);
3918 CASE_EXPECT_TRUE(p2.use_count() == 1);
3919 CASE_EXPECT_TRUE(p.expired());
3920
3921 copp::memory::weak_rc_ptr<void> p3;
3922 p3 = std::move(p2);
3924 CASE_EXPECT_TRUE(p3.use_count() == 1);
3925 CASE_EXPECT_TRUE(p2.expired());
3926
3927 p_.reset();
3929 CASE_EXPECT_TRUE(p3.expired());
3930 }
3931
3932 {
3933 copp::memory::strong_rc_ptr<X> p_(new X);
3934 copp::memory::weak_rc_ptr<X> p(p_);
3936 CASE_EXPECT_TRUE(p.use_count() == 1);
3937
3938 copp::memory::strong_rc_ptr<X> p_2(new X);
3939 copp::memory::weak_rc_ptr<X> p2(p_2);
3941 p2 = std::move(p);
3943 CASE_EXPECT_TRUE(p2.use_count() == 1);
3944 CASE_EXPECT_TRUE(p.expired());
3945 CASE_EXPECT_TRUE(p2.lock() != p_2);
3946
3947 copp::memory::strong_rc_ptr<void> p_3(new X);
3948 copp::memory::weak_rc_ptr<void> p3(p_3);
3950 p3 = std::move(p2);
3952 CASE_EXPECT_TRUE(p3.use_count() == 1);
3953 CASE_EXPECT_TRUE(p2.expired());
3954 CASE_EXPECT_TRUE(p3.lock() != p_3);
3955 }
3956}
3957} // namespace weak_rc_ptr_move
3958
3959template <class L, class R>
3960static bool owner_before_comp(const L &l, const R &r) noexcept {
3961 return l.owner_before(r);
3962}
3963
3964CASE_TEST(rc_ptr, owner_before) {
3965 {
3966 copp::memory::strong_rc_ptr<int> x;
3967 copp::memory::strong_rc_ptr<int> y;
3968 copp::memory::weak_rc_ptr<int> w;
3970 }
3971 {
3972 copp::memory::strong_rc_ptr<int> z(reinterpret_cast<int *>(0));
3973 copp::memory::weak_rc_ptr<int> w;
3975 {
3976 copp::memory::strong_rc_ptr<int> zz(z);
3977 w = copp::memory::weak_rc_ptr<int>(zz);
3980 }
3982 }
3983 {
3984 copp::memory::strong_rc_ptr<int> x;
3985 copp::memory::strong_rc_ptr<int> z(reinterpret_cast<int *>(0));
3987 }
3988 {
3989 copp::memory::strong_rc_ptr<int> a(reinterpret_cast<int *>(0));
3990 copp::memory::strong_rc_ptr<int> b(reinterpret_cast<int *>(0));
3992 copp::memory::weak_rc_ptr<int> w(a);
3995 }
3996
3997 {
3998 copp::memory::strong_rc_ptr<int> a(reinterpret_cast<int *>(0));
3999 copp::memory::weak_rc_ptr<int> wa(a);
4000 copp::memory::strong_rc_ptr<int> b(reinterpret_cast<int *>(0));
4001 copp::memory::weak_rc_ptr<int> wb(b);
4006 }
4007}
4008
4009template <class L, class R>
4010static bool owner_equal_comp(const L &l, const R &r) noexcept {
4011 return l.owner_equal(r);
4012}
4013
4014CASE_TEST(rc_ptr, owner_equal) {
4015 {
4016 copp::memory::strong_rc_ptr<int> p1(new int);
4017 copp::memory::strong_rc_ptr<int> p2(p1);
4018
4021
4022 copp::memory::strong_rc_ptr<int> p3(new int);
4023
4026
4027 copp::memory::strong_rc_ptr<int> p4;
4028 copp::memory::strong_rc_ptr<int> p5;
4029
4032
4035
4036 copp::memory::strong_rc_ptr<int> p6(static_cast<int *>(0));
4037
4040
4041 copp::memory::strong_rc_ptr<void> p7(p1);
4042
4045
4046 copp::memory::strong_rc_ptr<void> p8;
4047
4050
4053
4054 copp::memory::weak_rc_ptr<int> q1(p1);
4055
4058
4059 copp::memory::weak_rc_ptr<int> q2(p1);
4060
4063
4064 copp::memory::weak_rc_ptr<int> q3(p3);
4065
4068
4071
4072 copp::memory::weak_rc_ptr<int> q4;
4073
4076
4079
4080 copp::memory::weak_rc_ptr<void> q5;
4081
4084
4085 copp::memory::weak_rc_ptr<void> q7(p7);
4086
4089
4092
4093 p1.reset();
4094 p2.reset();
4095 p3.reset();
4096 p7.reset();
4097
4098 CASE_EXPECT_TRUE(q1.expired());
4099 CASE_EXPECT_TRUE(q2.expired());
4100 CASE_EXPECT_TRUE(q3.expired());
4101 CASE_EXPECT_TRUE(q7.expired());
4102
4105
4108
4111
4114 }
4115}
4116
4117template <class P>
4118static std::size_t get_owner_hash(const P &l) noexcept {
4119 return l.owner_hash();
4120}
4121
4122CASE_TEST(rc_ptr, owner_hash) {
4123 copp::memory::strong_rc_ptr<int> p1(new int);
4124 copp::memory::strong_rc_ptr<int> p2(p1);
4125
4127
4128 copp::memory::strong_rc_ptr<int> p3(new int);
4129
4131
4132 copp::memory::strong_rc_ptr<int> p4;
4133 copp::memory::strong_rc_ptr<int> p5;
4134
4137
4138 copp::memory::strong_rc_ptr<int> p6(static_cast<int *>(0));
4139
4141
4142 copp::memory::strong_rc_ptr<void> p7(p1);
4143
4145
4146 copp::memory::strong_rc_ptr<void> p8;
4147
4150
4151 copp::memory::weak_rc_ptr<int> q1(p1);
4152
4154
4155 copp::memory::weak_rc_ptr<int> q2(p1);
4156
4158
4159 copp::memory::weak_rc_ptr<int> q3(p3);
4160
4163
4164 copp::memory::weak_rc_ptr<int> q4;
4165
4168
4169 copp::memory::weak_rc_ptr<void> q5;
4170
4172
4173 copp::memory::weak_rc_ptr<void> q7(p7);
4174
4177
4178 p1.reset();
4179 p2.reset();
4180 p3.reset();
4181 p7.reset();
4182
4183 CASE_EXPECT_TRUE(q1.expired());
4184 CASE_EXPECT_TRUE(q2.expired());
4185 CASE_EXPECT_TRUE(q3.expired());
4186 CASE_EXPECT_TRUE(q7.expired());
4187
4192}
4193
4195
4196class X {
4197 public:
4198 virtual void f() = 0;
4199
4200 protected:
4201 virtual ~X() {}
4202};
4203
4204class Y {
4205 public:
4206 virtual copp::memory::strong_rc_ptr<X> getX() = 0;
4207
4208 protected:
4209 virtual ~Y() {}
4210};
4211
4212copp::memory::strong_rc_ptr<Y> createY();
4213
4214void test() {
4215 copp::memory::strong_rc_ptr<Y> py = createY();
4216 CASE_EXPECT_TRUE(py.get() != 0);
4217 CASE_EXPECT_TRUE(py.use_count() == 1);
4218
4219#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4220 try {
4221 copp::memory::strong_rc_ptr<X> px = py->getX();
4222 CASE_EXPECT_TRUE(px.get() != 0);
4223 CASE_EXPECT_TRUE(py.use_count() == 2);
4224
4225 px->f();
4226
4227# if defined(LIBCOPP_MACRO_ENABLE_RTTI) && LIBCOPP_MACRO_ENABLE_RTTI
4228 copp::memory::strong_rc_ptr<Y> py2 = copp::memory::dynamic_pointer_cast<Y>(px);
4229 CASE_EXPECT_TRUE(py.get() == py2.get());
4230 CASE_EXPECT_TRUE(!(py < py2 || py2 < py));
4231 CASE_EXPECT_TRUE(py.use_count() == 3);
4232# endif
4233 } catch (std::bad_weak_ptr const &) {
4234 CASE_EXPECT_ERROR("py->getX() failed");
4235 }
4236#endif
4237}
4238
4239void test2();
4240void test3();
4241
4243 test();
4244 test2();
4245 test3();
4246}
4247
4248// virtual inheritance to stress the implementation
4249// (prevents Y* -> impl*, enable_shared_rc_from_this<impl>* -> impl* casts)
4250
4251class impl : public X, public virtual Y, public virtual copp::memory::enable_shared_rc_from_this<impl> {
4252 public:
4253 void f() override {}
4254
4255 copp::memory::strong_rc_ptr<X> getX() override {
4256 copp::memory::strong_rc_ptr<impl> pi = shared_from_this();
4257 CASE_EXPECT_TRUE(pi.get() == this);
4258 return pi;
4259 }
4260};
4261
4262// intermediate impl2 to stress the implementation
4263
4264class impl2 : public impl {};
4265
4266copp::memory::strong_rc_ptr<Y> createY() {
4267 copp::memory::strong_rc_ptr<Y> pi(new impl2);
4268 return pi;
4269}
4270
4271void test2() { copp::memory::strong_rc_ptr<Y> pi(static_cast<impl2 *>(0)); }
4272
4273//
4274
4275struct V : public copp::memory::enable_shared_rc_from_this<V> {};
4276
4277void test3() {
4278 copp::memory::strong_rc_ptr<V> p(new V);
4279
4280#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4281 try {
4282 copp::memory::strong_rc_ptr<V> q = p->shared_from_this();
4283 CASE_EXPECT_TRUE(p == q);
4284 CASE_EXPECT_TRUE(!(p < q) && !(q < p));
4285 } catch (std::bad_weak_ptr const &) {
4286 CASE_EXPECT_ERROR("p->shared_from_this() failed");
4287 }
4288
4289 V v2(*p);
4290
4291 try {
4292 copp::memory::strong_rc_ptr<V> r = v2.shared_from_this();
4293 CASE_EXPECT_ERROR("v2.shared_from_this() failed to throw");
4294 } catch (std::bad_weak_ptr const &) {
4295 }
4296
4297 try {
4298 *p = V();
4299 copp::memory::strong_rc_ptr<V> r = p->shared_from_this();
4300 CASE_EXPECT_ERROR("*p = V() failed to throw");
4301 } catch (std::bad_weak_ptr const &) {
4302 }
4303#endif
4304}
4305
4306} // namespace shared_from_this
4307
4308namespace sp_unique_ptr {
4309struct X : public ::copp::memory::enable_shared_rc_from_this<X> {
4310 static int instances;
4311
4312 X() { ++instances; }
4313
4314 ~X() { --instances; }
4315
4316 private:
4317 X(X const &);
4318 X &operator=(X const &);
4319};
4320
4321int X::instances = 0;
4322
4323struct Y {
4324 static int instances;
4325
4327
4328 Y() : deleted_(false) { ++instances; }
4329
4330 ~Y() {
4332 --instances;
4333 }
4334
4335 private:
4336 Y(Y const &);
4337 Y &operator=(Y const &);
4338};
4339
4340int Y::instances = 0;
4341
4342struct YD {
4343 void operator()(Y *p) const {
4344 if (p) {
4345 p->deleted_ = true;
4346 delete p;
4347 } else {
4348 CASE_EXPECT_ERROR("YD::operator()(0) called");
4349 }
4350 }
4351};
4352
4353template <class U, class T, class D>
4354static void test_null_unique_ptr(std::unique_ptr<T, D> p1, std::unique_ptr<T, D> p2) {
4355 CASE_EXPECT_TRUE(T::instances == 0);
4356
4357 ::copp::memory::strong_rc_ptr<U> sp(std::move(p1));
4358
4359 CASE_EXPECT_TRUE(sp.get() == 0);
4360 CASE_EXPECT_TRUE(sp.use_count() == 0);
4361
4362 sp.reset(new T, typename std::remove_reference<D>::type());
4363
4364 CASE_EXPECT_TRUE(sp.get() != 0);
4365 CASE_EXPECT_TRUE(sp.use_count() == 1);
4366
4367 CASE_EXPECT_TRUE(T::instances == 1);
4368
4369 sp = std::move(p2);
4370
4371 CASE_EXPECT_TRUE(sp.get() == 0);
4372 CASE_EXPECT_TRUE(sp.use_count() == 0);
4373
4374 CASE_EXPECT_TRUE(T::instances == 0);
4375}
4376
4378 {
4380
4381 std::unique_ptr<X> p(new X);
4383
4384 ::copp::memory::strong_rc_ptr<X> p2(std::move(p));
4386 CASE_EXPECT_TRUE(p.get() == 0);
4387
4388 ::copp::memory::strong_rc_ptr<X> p3 = p2->shared_from_this();
4389 CASE_EXPECT_TRUE(p2 == p3);
4390 CASE_EXPECT_TRUE(!(p2 < p3) && !(p3 < p2));
4391
4392 p2.reset();
4393 p3.reset();
4395
4396 p2 = std::unique_ptr<X>(new X);
4398
4399 p2 = std::unique_ptr<X>(new X);
4401
4402 p2.reset();
4404 }
4405
4406 {
4408
4409 std::unique_ptr<X> p(new X);
4411
4412 ::copp::memory::strong_rc_ptr<X const> p2(std::move(p));
4414 CASE_EXPECT_TRUE(p.get() == 0);
4415
4416 ::copp::memory::strong_rc_ptr<X const> p3 = p2->shared_from_this();
4417 CASE_EXPECT_TRUE(p2 == p3);
4418 CASE_EXPECT_TRUE(!(p2 < p3) && !(p3 < p2));
4419
4420 p2.reset();
4421 p3.reset();
4423
4424 p2 = std::unique_ptr<X>(new X);
4426
4427 p2 = std::unique_ptr<X>(new X);
4429
4430 p2.reset();
4432 }
4433
4434 {
4436
4437 std::unique_ptr<X> p(new X);
4439
4440 ::copp::memory::strong_rc_ptr<void> p2(std::move(p));
4442 CASE_EXPECT_TRUE(p.get() == 0);
4443
4444 p2.reset();
4446
4447 p2 = std::unique_ptr<X>(new X);
4449
4450 p2 = std::unique_ptr<X>(new X);
4452
4453 p2.reset();
4455 }
4456
4457 {
4459
4460 std::unique_ptr<Y, YD> p(new Y, YD());
4462
4463 ::copp::memory::strong_rc_ptr<Y> p2(std::move(p));
4465 CASE_EXPECT_TRUE(p.get() == 0);
4466
4467 p2.reset();
4469
4470 p2 = std::unique_ptr<Y, YD>(new Y, YD());
4472
4473 p2 = std::unique_ptr<Y, YD>(new Y, YD());
4475
4476 p2.reset();
4478 }
4479
4480 {
4482
4483 YD yd;
4484
4485 std::unique_ptr<Y, YD &> p(new Y, yd);
4487
4488 ::copp::memory::strong_rc_ptr<Y> p2(std::move(p));
4490 CASE_EXPECT_TRUE(p.get() == 0);
4491
4492 p2.reset();
4494
4495 p2 = std::unique_ptr<Y, YD &>(new Y, yd);
4497
4498 p2 = std::unique_ptr<Y, YD &>(new Y, yd);
4500
4501 p2.reset();
4503 }
4504
4505 {
4507
4508 YD yd;
4509
4510 std::unique_ptr<Y, YD const &> p(new Y, yd);
4512
4513 ::copp::memory::strong_rc_ptr<Y> p2(std::move(p));
4515 CASE_EXPECT_TRUE(p.get() == 0);
4516
4517 p2.reset();
4519
4520 p2 = std::unique_ptr<Y, YD const &>(new Y, yd);
4522
4523 p2 = std::unique_ptr<Y, YD const &>(new Y, yd);
4525
4526 p2.reset();
4528 }
4529
4530 {
4531 test_null_unique_ptr<X>(std::unique_ptr<X>(), std::unique_ptr<X>());
4532 test_null_unique_ptr<X const>(std::unique_ptr<X>(), std::unique_ptr<X>());
4533 test_null_unique_ptr<void>(std::unique_ptr<X>(), std::unique_ptr<X>());
4534 test_null_unique_ptr<void const>(std::unique_ptr<X>(), std::unique_ptr<X>());
4535 }
4536
4537 {
4538 test_null_unique_ptr<Y>(std::unique_ptr<Y, YD>(0, YD()), std::unique_ptr<Y, YD>(0, YD()));
4539 test_null_unique_ptr<Y const>(std::unique_ptr<Y, YD>(0, YD()), std::unique_ptr<Y, YD>(0, YD()));
4540 test_null_unique_ptr<void>(std::unique_ptr<Y, YD>(0, YD()), std::unique_ptr<Y, YD>(0, YD()));
4541 test_null_unique_ptr<void const>(std::unique_ptr<Y, YD>(0, YD()), std::unique_ptr<Y, YD>(0, YD()));
4542 }
4543
4544 {
4545 YD yd;
4546
4547 test_null_unique_ptr<Y>(std::unique_ptr<Y, YD &>(0, yd), std::unique_ptr<Y, YD &>(0, yd));
4548 test_null_unique_ptr<Y const>(std::unique_ptr<Y, YD &>(0, yd), std::unique_ptr<Y, YD &>(0, yd));
4549 test_null_unique_ptr<void>(std::unique_ptr<Y, YD &>(0, yd), std::unique_ptr<Y, YD &>(0, yd));
4550 test_null_unique_ptr<void const>(std::unique_ptr<Y, YD &>(0, yd), std::unique_ptr<Y, YD &>(0, yd));
4551 }
4552}
4553} // namespace sp_unique_ptr
4554
4555CASE_TEST(rc_ptr, compat) {
4556 static_assert(
4557 std::is_same<copp::memory::compat_strong_ptr_type_trait<std::string,
4558 copp::memory::compat_strong_ptr_mode::kStl>::shared_ptr,
4559 std::shared_ptr<std::string>>::value,
4560 "check shared_ptr failed");
4561 static_assert(std::is_same<copp::memory::compat_strong_ptr_type_trait<
4562 std::string, copp::memory::compat_strong_ptr_mode::kStrongRc>::shared_ptr,
4563 copp::memory::strong_rc_ptr<std::string>>::value,
4564 "check strong_rc_ptr failed");
4565
4566 static_assert(
4567 std::is_same<
4568 copp::memory::compat_strong_ptr_type_trait<std::string, copp::memory::compat_strong_ptr_mode::kStl>::weak_ptr,
4569 std::weak_ptr<std::string>>::value,
4570 "check weak_ptr failed");
4571 static_assert(std::is_same<copp::memory::compat_strong_ptr_type_trait<
4572 std::string, copp::memory::compat_strong_ptr_mode::kStrongRc>::weak_ptr,
4573 copp::memory::weak_rc_ptr<std::string>>::value,
4574 "check strong_rc_ptr failed");
4575
4576 static_assert(std::is_same<copp::memory::compat_strong_ptr_function_trait<
4577 copp::memory::compat_strong_ptr_mode::kStl>::enable_shared_from_this<std::string>,
4578 std::enable_shared_from_this<std::string>>::value,
4579 "check enable_shared_from_this failed");
4580 static_assert(std::is_same<copp::memory::compat_strong_ptr_function_trait<
4581 copp::memory::compat_strong_ptr_mode::kStrongRc>::enable_shared_from_this<std::string>,
4582 copp::memory::enable_shared_rc_from_this<std::string>>::value,
4583 "check enable_shared_from_this failed");
4584
4585 static_assert(std::is_same<decltype(copp::memory::compat_strong_ptr_function_trait<
4586 copp::memory::compat_strong_ptr_mode::kStl>::make_shared<std::string>()),
4587 std::shared_ptr<std::string>>::value,
4588 "check make_shared failed");
4589 static_assert(std::is_same<decltype(copp::memory::compat_strong_ptr_function_trait<
4590 copp::memory::compat_strong_ptr_mode::kStrongRc>::make_shared<std::string>()),
4591 copp::memory::strong_rc_ptr<std::string>>::value,
4592 "check make_shared failed");
4593}
4594
4596class X {
4597 private:
4598 X(X const &);
4599 X &operator=(X const &);
4600
4601 void *operator new(std::size_t n) {
4602 // lack of this definition causes link errors on Comeau C++
4603 CASE_EXPECT_ERROR("private X::new called");
4604 return ::operator new(n);
4605 }
4606
4607 void operator delete(void *p) {
4608 // lack of this definition causes link errors on MSVC
4609 CASE_EXPECT_ERROR("private X::delete called");
4610 ::operator delete(p);
4611 }
4612
4613 public:
4614 static int instances;
4615
4616 int v;
4617
4618 explicit X(int a1 = 0, int a2 = 0, int a3 = 0, int a4 = 0, int a5 = 0, int a6 = 0, int a7 = 0, int a8 = 0, int a9 = 0)
4619 : v(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9) {
4620 ++instances;
4621 }
4622
4623 ~X() { --instances; }
4624};
4625
4626int X::instances = 0;
4627
4629 {
4630 copp::memory::strong_rc_ptr<int> pi = copp::memory::allocate_strong_rc<int>(std::allocator<int>());
4631
4632 CASE_EXPECT_TRUE(pi.get() != 0);
4633 CASE_EXPECT_TRUE(*pi == 0);
4634 }
4635
4636 {
4637 copp::memory::strong_rc_ptr<int> pi = copp::memory::allocate_strong_rc<int>(std::allocator<int>(), 5);
4638
4639 CASE_EXPECT_TRUE(pi.get() != 0);
4640 CASE_EXPECT_TRUE(*pi == 5);
4641 }
4642
4644
4645 {
4646 copp::memory::strong_rc_ptr<X> pi = copp::memory::allocate_strong_rc<X>(std::allocator<void>());
4647 copp::memory::weak_rc_ptr<X> wp(pi);
4648
4650 CASE_EXPECT_TRUE(pi.get() != 0);
4651 CASE_EXPECT_TRUE(pi->v == 0);
4652
4653 pi.reset();
4654
4656 }
4657
4658 {
4659 copp::memory::strong_rc_ptr<X> pi = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1);
4660 copp::memory::weak_rc_ptr<X> wp(pi);
4661
4663 CASE_EXPECT_TRUE(pi.get() != 0);
4664 CASE_EXPECT_TRUE(pi->v == 1);
4665
4666 pi.reset();
4667
4669 }
4670
4671 {
4672 copp::memory::strong_rc_ptr<X> pi = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2);
4673 copp::memory::weak_rc_ptr<X> wp(pi);
4674
4676 CASE_EXPECT_TRUE(pi.get() != 0);
4677 CASE_EXPECT_TRUE(pi->v == 1 + 2);
4678
4679 pi.reset();
4680
4682 }
4683
4684 {
4685 copp::memory::strong_rc_ptr<X> pi = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3);
4686 copp::memory::weak_rc_ptr<X> wp(pi);
4687
4689 CASE_EXPECT_TRUE(pi.get() != 0);
4690 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3);
4691
4692 pi.reset();
4693
4695 }
4696
4697 {
4698 copp::memory::strong_rc_ptr<X> pi = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4);
4699 copp::memory::weak_rc_ptr<X> wp(pi);
4700
4702 CASE_EXPECT_TRUE(pi.get() != 0);
4703 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4);
4704
4705 pi.reset();
4706
4708 }
4709
4710 {
4711 copp::memory::strong_rc_ptr<X> pi = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5);
4712 copp::memory::weak_rc_ptr<X> wp(pi);
4713
4715 CASE_EXPECT_TRUE(pi.get() != 0);
4716 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5);
4717
4718 pi.reset();
4719
4721 }
4722
4723 {
4724 copp::memory::strong_rc_ptr<X> pi = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6);
4725 copp::memory::weak_rc_ptr<X> wp(pi);
4726
4728 CASE_EXPECT_TRUE(pi.get() != 0);
4729 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6);
4730
4731 pi.reset();
4732
4734 }
4735
4736 {
4737 copp::memory::strong_rc_ptr<X> pi =
4738 copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7);
4739 copp::memory::weak_rc_ptr<X> wp(pi);
4740
4742 CASE_EXPECT_TRUE(pi.get() != 0);
4743 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6 + 7);
4744
4745 pi.reset();
4746
4748 }
4749
4750 {
4751 copp::memory::strong_rc_ptr<X> pi =
4752 copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8);
4753 copp::memory::weak_rc_ptr<X> wp(pi);
4754
4756 CASE_EXPECT_TRUE(pi.get() != 0);
4757 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8);
4758
4759 pi.reset();
4760
4762 }
4763
4764 {
4765 copp::memory::strong_rc_ptr<X> pi =
4766 copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8, 9);
4767 copp::memory::weak_rc_ptr<X> wp(pi);
4768
4770 CASE_EXPECT_TRUE(pi.get() != 0);
4771 CASE_EXPECT_TRUE(pi->v == 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9);
4772
4773 pi.reset();
4774
4776 }
4777}
4778} // namespace allocate_strong_rc_test
4779
4781class X : public copp::memory::enable_shared_rc_from_this<X> {
4782 private:
4783 X(X const &);
4784 X &operator=(X const &);
4785
4786 public:
4787 static int instances;
4788
4789 explicit X(int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0) { ++instances; }
4790
4791 ~X() { --instances; }
4792};
4793
4794int X::instances = 0;
4795
4798
4799 {
4800 copp::memory::strong_rc_ptr<X> px = copp::memory::allocate_strong_rc<X>(std::allocator<void>());
4802#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4803 try {
4804 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4805
4806 CASE_EXPECT_TRUE(px == qx);
4807 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4808
4809 px.reset();
4811 } catch (std::bad_weak_ptr const &) {
4812 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4813 }
4814#endif
4815 }
4816
4818
4820
4821 {
4822 copp::memory::strong_rc_ptr<X> px = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1);
4824#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4825 try {
4826 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4827
4828 CASE_EXPECT_TRUE(px == qx);
4829 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4830
4831 px.reset();
4833 } catch (std::bad_weak_ptr const &) {
4834 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4835 }
4836#endif
4837 }
4838
4840
4841 {
4842 copp::memory::strong_rc_ptr<X> px = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2);
4844#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4845 try {
4846 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4847
4848 CASE_EXPECT_TRUE(px == qx);
4849 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4850
4851 px.reset();
4853 } catch (std::bad_weak_ptr const &) {
4854 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4855 }
4856#endif
4857 }
4858
4860
4861 {
4862 copp::memory::strong_rc_ptr<X> px = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3);
4864#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4865 try {
4866 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4867
4868 CASE_EXPECT_TRUE(px == qx);
4869 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4870
4871 px.reset();
4873 } catch (std::bad_weak_ptr const &) {
4874 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4875 }
4876#endif
4877 }
4878
4880
4881 {
4882 copp::memory::strong_rc_ptr<X> px = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4);
4884#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4885 try {
4886 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4887
4888 CASE_EXPECT_TRUE(px == qx);
4889 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4890
4891 px.reset();
4893 } catch (std::bad_weak_ptr const &) {
4894 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4895 }
4896#endif
4897 }
4898
4900
4901 {
4902 copp::memory::strong_rc_ptr<X> px = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5);
4904#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4905 try {
4906 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4907
4908 CASE_EXPECT_TRUE(px == qx);
4909 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4910
4911 px.reset();
4913 } catch (std::bad_weak_ptr const &) {
4914 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4915 }
4916#endif
4917 }
4918
4920
4921 {
4922 copp::memory::strong_rc_ptr<X> px = copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6);
4924#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4925 try {
4926 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4927
4928 CASE_EXPECT_TRUE(px == qx);
4929 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4930
4931 px.reset();
4933 } catch (std::bad_weak_ptr const &) {
4934 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4935 }
4936#endif
4937 }
4938
4940
4941 {
4942 copp::memory::strong_rc_ptr<X> px =
4943 copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7);
4945#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4946 try {
4947 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4948
4949 CASE_EXPECT_TRUE(px == qx);
4950 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4951
4952 px.reset();
4954 } catch (std::bad_weak_ptr const &) {
4955 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4956 }
4957#endif
4958 }
4959
4961
4962 {
4963 copp::memory::strong_rc_ptr<X> px =
4964 copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8);
4966#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4967 try {
4968 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4969
4970 CASE_EXPECT_TRUE(px == qx);
4971 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4972
4973 px.reset();
4975 } catch (std::bad_weak_ptr const &) {
4976 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4977 }
4978#endif
4979 }
4980
4982
4983 {
4984 copp::memory::strong_rc_ptr<X> px =
4985 copp::memory::allocate_strong_rc<X>(std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8, 9);
4987#if defined(LIBCOPP_MACRO_ENABLE_EXCEPTION) && LIBCOPP_MACRO_ENABLE_EXCEPTION
4988 try {
4989 copp::memory::strong_rc_ptr<X> qx = px->shared_from_this();
4990
4991 CASE_EXPECT_TRUE(px == qx);
4992 CASE_EXPECT_TRUE(!(px < qx) && !(qx < px));
4993
4994 px.reset();
4996 } catch (std::bad_weak_ptr const &) {
4997 CASE_EXPECT_ERROR("px->shared_from_this() failed");
4998 }
4999#endif
5000 }
5001
5003}
5004} // namespace allocate_strong_rc_esft_test
5005
5006#if defined(__GNUC__) && !defined(__clang__) && !defined(__apple_build_version__)
5007# if (__GNUC__ * 100 + __GNUC_MINOR__ * 10) >= 460
5008# pragma GCC diagnostic pop
5009# endif
5010#elif defined(__clang__) || defined(__apple_build_version__)
5011# pragma clang diagnostic pop
5012#endif
X(int=0, int=0, int=0, int=0, int=0, int=0, int=0, int=0, int=0)
X(int a1=0, int a2=0, int a3=0, int a4=0, int a5=0, int a6=0, int a7=0, int a8=0, int a9=0)
X & operator=(X const &)
X(int a1=0, int a2=0, int a3=0, int a4=0, int a5=0, int a6=0, int a7=0, int a8=0, int a9=0)
virtual void f()=0
virtual copp::memory::strong_rc_ptr< X > getX()=0
copp::memory::strong_rc_ptr< X > getX() override
copp::memory::strong_rc_ptr< foo > m_self
void setWeak(copp::memory::strong_rc_ptr< foo > s)
copp::memory::weak_rc_ptr< foo > w
X_impl & operator=(X_impl const &)
virtual void f(int)=0
copp::memory::strong_rc_ptr< T > base_type
impl(char const *, char const *)
impl & operator=(impl const &)
void read(void *, int64_t size)
file(char const *name, char const *mode)
void read(void *data, int64_t size)
copp::memory::strong_rc_ptr< impl > pimpl_
static copp::memory::strong_rc_ptr< X > create()
virtual copp::memory::strong_rc_ptr< X > getX()=0
static copp::memory::strong_rc_ptr< impl > create()
copp::memory::strong_rc_ptr< X > getX() override
copp::memory::weak_rc_ptr< impl > weak_this
copp::memory::strong_rc_ptr< Y > createY()
static void test_null_unique_ptr(std::unique_ptr< T, D > p1, std::unique_ptr< T, D > p2)
LIBCOPP_COPP_API_HEAD_ONLY void swap(LIBCOPP_COPP_NAMESPACE_ID::memory::strong_rc_ptr< T > &a, LIBCOPP_COPP_NAMESPACE_ID::memory::strong_rc_ptr< T > &b) noexcept
Support std::swap for strong_rc_ptr.
Definition rc_ptr.h:1377
void deleter(incomplete *)
void deleter2(void *p)
copp::memory::strong_rc_ptr< X > createX()
another_ptr< event_handler > get_event_handler()
void install_event_handler(copp::memory::strong_rc_ptr< event_handler > p)
copp::memory::strong_rc_ptr< event_handler > current_handler
copp::memory::strong_rc_ptr< file > fopen(char const *name, char const *mode)
void fread(copp::memory::strong_rc_ptr< file > f, void *data, int64_t size)
copp::memory::strong_rc_ptr< X > make_shared_from_intrusive(X *p)
static void f()
void shared_ptr_assignment(copp::memory::strong_rc_ptr< U > &sp, T *=0)
void copy_assignment(copp::memory::strong_rc_ptr< T > &sp)
void test2(copp::memory::strong_rc_ptr< U > &sp, T *=0)
copp::memory::strong_rc_ptr< incomplete > create_incomplete()
static bool owner_equal_comp(const L &l, const R &r) noexcept
static std::size_t get_owner_hash(const P &l) noexcept
static bool owner_before_comp(const L &l, const R &r) noexcept
X & operator=(X const &)
void operator()(Y *p) const
Y & operator=(Y const &)
static int64_t instances
X & operator=(X const &)
Y & operator=(Y const &)
static int64_t instances
void operator()(void const *) const
copp::memory::strong_rc_ptr< X > next
static int64_t instances
X & operator=(X const &)
static int64_t instances
X & operator=(X const &)
#define CASE_EXPECT_EQ(l, r)
Definition test_macros.h:99
#define CASE_EXPECT_NE(l, r)
#define CASE_TEST(test_name, case_name)
Definition test_macros.h:47
#define CASE_EXPECT_TRUE(c)
Definition test_macros.h:97
#define CASE_EXPECT_ERROR(msg)
Definition test_macros.h:96