1// Common tests for the circular buffer and its adaptor.
2
3// Copyright (c) 2003-2008 Jan Gaspar
4// Copyright (c) 2013 Antony Polukhin
5// Copyright (c) 2014 Glen Fernandes // C++11 allocator model support.
6
7// Use, modification, and distribution is subject to the Boost Software
8// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10
11#include <boost/type_traits/is_nothrow_move_constructible.hpp>
12#include <boost/type_traits/is_nothrow_move_assignable.hpp>
13#include <boost/type_traits/has_nothrow_constructor.hpp>
14
15template <class Alloc>
16void generic_test(CB_CONTAINER<MyInteger, Alloc>& cb) {
17
18 vector<int> v;
19 v.push_back(x: 11);
20 v.push_back(x: 12);
21 v.push_back(x: 13);
22 v.push_back(x: 14);
23 v.push_back(x: 15);
24 v.push_back(x: 16);
25 v.push_back(x: 17);
26
27 if (cb.capacity() == 0) {
28
29 cb.insert(cb.begin(), 1);
30 cb.insert(cb.begin(), v.begin(), v.end());
31 cb.rinsert(cb.end(), 2);
32 cb.rinsert(cb.end(), v.begin(), v.end());
33 cb.push_back(3);
34 cb.push_front(4);
35 cb.linearize();
36
37 BOOST_CHECK(cb.empty());
38 BOOST_CHECK(cb.full());
39
40 } else {
41
42 cb.insert(cb.end(), 1);
43 BOOST_CHECK(!cb.empty());
44 BOOST_CHECK(cb[cb.size() - 1] == 1);
45
46 size_t size = cb.size();
47 cb.rerase(cb.end() - 1, cb.end());
48 BOOST_CHECK(size == cb.size() + 1);
49
50 cb.insert(cb.end(), v.begin(), v.end());
51 BOOST_CHECK(!cb.empty());
52 BOOST_CHECK(cb[cb.size() - 1] == 17);
53
54 size = cb.size();
55 cb.erase(cb.end() - 1, cb.end());
56 BOOST_CHECK(size == cb.size() + 1);
57
58 size = cb.size();
59 cb.rinsert(cb.begin(), 2);
60 BOOST_CHECK(size + 1 == cb.size());
61 BOOST_CHECK(cb[0] == 2);
62
63 size = cb.size();
64 cb.erase(cb.begin());
65 BOOST_CHECK(size == cb.size() + 1);
66
67 cb.rinsert(cb.begin(), v.begin(), v.end());
68 BOOST_CHECK(!cb.empty());
69 BOOST_CHECK(cb[0] == 11);
70
71 size = cb.size();
72 cb.pop_front();
73 BOOST_CHECK(size == cb.size() + 1);
74
75 cb.push_back(3);
76 BOOST_CHECK(!cb.empty());
77 BOOST_CHECK(cb[cb.size() - 1] == 3);
78
79 size = cb.size();
80 cb.pop_back();
81 BOOST_CHECK(size == cb.size() + 1);
82
83 cb.push_front(4);
84 BOOST_CHECK(!cb.empty());
85 BOOST_CHECK(cb[0] == 4);
86
87 cb.linearize();
88 BOOST_CHECK(!cb.empty());
89 BOOST_CHECK(cb[0] == 4);
90
91 size = cb.size();
92 cb.rerase(cb.begin());
93 BOOST_CHECK(size == cb.size() + 1);
94 }
95}
96
97void basic_test() {
98
99 vector<int> v;
100 v.push_back(x: 1);
101 v.push_back(x: 2);
102 v.push_back(x: 3);
103 v.push_back(x: 4);
104 v.push_back(x: 5);
105 v.push_back(x: 6);
106 v.push_back(x: 7);
107 CB_CONTAINER<MyInteger> cb1(3, v.begin(), v.end());
108 CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.end());
109 CB_CONTAINER<MyInteger> cb3(7, v.begin(), v.end());
110
111 BOOST_CHECK(cb1.full());
112 BOOST_CHECK(cb1.capacity() == 3);
113 BOOST_CHECK(cb1.size() == 3);
114 BOOST_CHECK(cb1[0] == 5);
115 BOOST_CHECK(cb1[2] == 7);
116 BOOST_CHECK(!cb2.full());
117 BOOST_CHECK(cb2[2] == 3);
118 BOOST_CHECK(cb3.full());
119 BOOST_CHECK(cb3[0] == 1);
120 BOOST_CHECK(cb3[6] == 7);
121
122 generic_test(cb&: cb1);
123 generic_test(cb&: cb2);
124 generic_test(cb&: cb3);
125}
126
127void constructor_and_element_access_test() {
128
129 CB_CONTAINER<int> cb(5, 3);
130 cb[1] = 10;
131
132 BOOST_CHECK(cb.full());
133 BOOST_CHECK(cb[1] == 10);
134 BOOST_CHECK(cb[4] == 3);
135}
136
137void size_test() {
138
139 CB_CONTAINER<MyInteger> cb1(3);
140 cb1.push_back(item: 1);
141 cb1.push_back(item: 2);
142 cb1.push_back(item: 3);
143 cb1.push_back(item: 4);
144 CB_CONTAINER<MyInteger> cb2(5);
145
146 BOOST_CHECK(cb1.size() == 3);
147 BOOST_CHECK(cb2.size() == 0);
148 BOOST_CHECK(cb1.max_size() == cb2.max_size());
149
150 generic_test(cb&: cb1);
151 generic_test(cb&: cb2);
152}
153
154template<class T>
155class my_allocator {
156 typedef std::allocator<T> base_t;
157 base_t base_;
158public:
159 typedef T value_type;
160
161
162 typedef value_type& reference;
163 typedef const value_type& const_reference;
164 typedef typename base_t::size_type size_type;
165 typedef typename base_t::difference_type difference_type;
166
167private:
168 template<class U>
169 struct const_pointer_;
170
171 template<class U>
172 struct pointer_ {
173 pointer_(){}
174 pointer_(void* p) : hidden_ptr_((U*)p) {}
175 difference_type operator-(const const_pointer_<U>& rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
176 difference_type operator-(pointer_ rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
177 pointer_ operator-(size_type rhs) const { return hidden_ptr_ - rhs; }
178 bool operator == (pointer_ rhs) const { return hidden_ptr_ == rhs.hidden_ptr_; }
179 bool operator != (pointer_ rhs) const { return hidden_ptr_ != rhs.hidden_ptr_; }
180 bool operator < (pointer_ rhs) const { return hidden_ptr_ < rhs.hidden_ptr_; }
181 bool operator >= (pointer_ rhs) const { return hidden_ptr_ >= rhs.hidden_ptr_; }
182 pointer_& operator++() { ++hidden_ptr_; return *this; }
183 pointer_& operator--() { --hidden_ptr_; return *this; }
184 pointer_& operator+=(size_type s) { hidden_ptr_ += s; return *this; }
185 pointer_ operator+(size_type s) const { return hidden_ptr_ + s; }
186 pointer_ operator++(int) { pointer_ p = *this; ++hidden_ptr_; return p; }
187 pointer_ operator--(int) { pointer_ p = *this; --hidden_ptr_; return p; }
188 U& operator*() const { return *hidden_ptr_; }
189
190 U* hidden_ptr_;
191 };
192
193 template<class U>
194 struct const_pointer_ {
195 const_pointer_(){}
196 const_pointer_(pointer_<U> p) : hidden_ptr_(p.hidden_ptr_) {}
197 const_pointer_(const void* p) : hidden_ptr_((const U*)p) {}
198 difference_type operator-(pointer_<U> rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
199 difference_type operator-(const_pointer_ rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
200 const_pointer_ operator-(size_type rhs) const { return hidden_ptr_ - rhs; }
201 bool operator == (const_pointer_ rhs) const { return hidden_ptr_ == rhs.hidden_ptr_; }
202 bool operator != (const_pointer_ rhs) const { return hidden_ptr_ != rhs.hidden_ptr_; }
203 bool operator < (const_pointer_ rhs) const { return hidden_ptr_ < rhs.hidden_ptr_; }
204 bool operator >= (const_pointer_ rhs) const { return hidden_ptr_ >= rhs.hidden_ptr_; }
205 const_pointer_& operator++() { ++hidden_ptr_; return *this; }
206 const_pointer_& operator--() { --hidden_ptr_; return *this; }
207 const_pointer_& operator+=(size_type s) { hidden_ptr_ += s; return hidden_ptr_; }
208 const_pointer_ operator+(size_type s) const { return hidden_ptr_ + s; }
209 const_pointer_ operator++(int) { const_pointer_ p = *this; ++hidden_ptr_; return p; }
210 const_pointer_ operator--(int) { const_pointer_ p = *this; --hidden_ptr_; return p; }
211 const U& operator*() const { return *hidden_ptr_; }
212
213 const U* hidden_ptr_;
214 };
215
216public:
217 typedef pointer_<T> pointer;
218 typedef const_pointer_<T> const_pointer;
219
220 template<class T2>
221 struct rebind
222 {
223 typedef my_allocator<T2> other;
224 };
225
226 size_type max_size() const
227 { return base_.max_size(); }
228
229 pointer allocate(size_type count, const void* hint = 0) {
230 return pointer(base_.allocate(count, hint));
231 }
232
233 void deallocate(const pointer &ptr, size_type s)
234 { base_.deallocate(ptr.hidden_ptr_, s); }
235
236 template<class P>
237 void construct(const pointer &ptr, BOOST_FWD_REF(P) p)
238 { ::new(ptr.hidden_ptr_) value_type(::boost::forward<P>(p)); }
239
240 void destroy(const pointer &ptr)
241 { (*ptr.hidden_ptr_).~value_type(); }
242
243};
244
245void allocator_test() {
246
247 CB_CONTAINER<MyInteger> cb1(10, 0);
248 const CB_CONTAINER<MyInteger> cb2(10, 0);
249 CB_CONTAINER<MyInteger>::allocator_type& alloc_ref = cb1.get_allocator();
250 CB_CONTAINER<MyInteger>::allocator_type alloc = cb2.get_allocator();
251 alloc_ref.max_size();
252 alloc.max_size();
253
254 generic_test(cb&: cb1);
255
256
257 CB_CONTAINER<MyInteger, my_allocator<MyInteger> > cb_a(10, 0);
258 generic_test(cb&: cb_a);
259}
260
261#if !defined(BOOST_NO_CXX11_ALLOCATOR)
262template<class T>
263class cxx11_allocator {
264public:
265 typedef T value_type;
266
267 cxx11_allocator() {
268 }
269
270 template<class U>
271 cxx11_allocator(const cxx11_allocator<U> &) {
272 }
273
274 T* allocate(std::size_t n) {
275 return static_cast<T*>(::operator new(n * sizeof(T)));
276 }
277
278 void deallocate(T * p, std::size_t n) {
279 ::operator delete( p );
280 }
281};
282
283void cxx11_allocator_test() {
284 CB_CONTAINER<MyInteger, cxx11_allocator<MyInteger> > cb(10, 0);
285 generic_test(cb);
286}
287#endif
288
289void begin_and_end_test() {
290
291 vector<int> v;
292 v.push_back(x: 11);
293 v.push_back(x: 12);
294 v.push_back(x: 13);
295
296 CB_CONTAINER<MyInteger> cb1(10, v.begin(), v.end());
297 const CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.end());
298
299 CB_CONTAINER<MyInteger> cb3(10);
300 cb3.push_back(item: 1);
301 cb3.push_back(item: 2);
302 cb3.insert(pos: cb3.begin(), item: 3);
303 int i = 0;
304 CB_CONTAINER<MyInteger>::const_iterator it = cb3.begin();
305 for (; it != cb3.end(); it++) {
306 i += *it;
307 }
308 CB_CONTAINER<MyInteger> cb4(20);
309 const CB_CONTAINER<MyInteger> cb5(20);
310
311 BOOST_CHECK(*cb1.begin() == 11);
312 BOOST_CHECK(*cb2.begin() == 11);
313 BOOST_CHECK(i == 6);
314 BOOST_CHECK(cb4.begin() == cb4.end());
315 BOOST_CHECK(cb5.begin() == cb5.end());
316
317 generic_test(cb&: cb1);
318 generic_test(cb&: cb3);
319 generic_test(cb&: cb4);
320}
321
322void rbegin_and_rend_test() {
323
324 vector<int> v;
325 v.push_back(x: 11);
326 v.push_back(x: 12);
327 v.push_back(x: 13);
328
329 CB_CONTAINER<MyInteger> cb1(10, v.begin(), v.end());
330 const CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.end());
331
332 CB_CONTAINER<MyInteger> cb3(3);
333 cb3.push_back(item: 1);
334 cb3.push_back(item: 2);
335 cb3.insert(pos: cb3.begin(), item: 3);
336 cb3.push_back(item: 1);
337 int i = 0;
338 CB_CONTAINER<MyInteger>::reverse_iterator it = cb3.rbegin();
339 for (; it != cb3.rend(); it++) {
340 i += *it;
341 }
342 CB_CONTAINER<MyInteger> cb4(20);
343 const CB_CONTAINER<MyInteger> cb5(20);
344
345 BOOST_CHECK(*cb1.rbegin() == 13);
346 BOOST_CHECK(*cb2.rbegin() == 13);
347 BOOST_CHECK(i == 4);
348 BOOST_CHECK(cb4.rbegin() == cb4.rend());
349 BOOST_CHECK(cb5.rbegin() == cb5.rend());
350
351 generic_test(cb&: cb1);
352 generic_test(cb&: cb3);
353 generic_test(cb&: cb4);
354}
355
356void element_access_and_insert_test() {
357
358 CB_CONTAINER<MyInteger> cb(3);
359 cb.push_back(item: 1);
360 cb.push_back(item: 2);
361 cb.insert(pos: cb.begin(), item: 3);
362 cb.push_back(item: 4);
363 const CB_CONTAINER<MyInteger> ccb = cb;
364
365 BOOST_CHECK(cb[0] == 1);
366 BOOST_CHECK(cb[1] == 2);
367 BOOST_CHECK(cb[2] == 4);
368 BOOST_CHECK(ccb[2] == 4);
369
370 generic_test(cb);
371}
372
373void at_test() {
374
375#if !defined(BOOST_NO_EXCEPTIONS)
376
377 CB_CONTAINER<MyInteger> cb(3);
378 cb.push_back(item: 1);
379
380 try {
381 BOOST_CHECK(cb.at(0) == 1);
382 }
383 catch (out_of_range&) {
384 BOOST_ERROR("An unexpected exception has been thrown!");
385 }
386
387 BOOST_CHECK_THROW(cb.at(2), out_of_range);
388
389 generic_test(cb);
390
391#endif // #if !defined(BOOST_NO_EXCEPTIONS)
392}
393
394void front_and_back_test() {
395
396 CB_CONTAINER<MyInteger> cb(1);
397 cb.push_back(item: 2);
398 cb.push_back(item: 3);
399
400 BOOST_CHECK(cb.front() == cb.back());
401 BOOST_CHECK(cb.back() == 3);
402
403 generic_test(cb);
404}
405
406void linearize_test() {
407
408 vector<int> v;
409 v.push_back(x: 1);
410 v.push_back(x: 2);
411 v.push_back(x: 3);
412 v.push_back(x: 4);
413 v.push_back(x: 5);
414 v.push_back(x: 6);
415 v.push_back(x: 7);
416 v.push_back(x: 8);
417 v.push_back(x: 9);
418 v.push_back(x: 10);
419 v.push_back(x: 11);
420 v.push_back(x: 12);
421 CB_CONTAINER<MyInteger> cb1(10, v.begin(), v.begin() + 10);
422 cb1.push_back(item: 11);
423 cb1.push_back(item: 12);
424 cb1.push_back(item: 13);
425 CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.begin() + 10);
426 cb2.push_back(item: 11);
427 cb2.push_back(item: 12);
428 cb2.push_back(item: 13);
429 cb2.push_back(item: 14);
430 cb2.push_back(item: 15);
431 cb2.push_back(item: 16);
432 cb2.push_back(item: 17);
433 CB_CONTAINER<MyInteger> cb3(10, v.begin(), v.begin() + 10);
434 cb3.push_back(item: 11);
435 cb3.push_back(item: 12);
436 cb3.push_back(item: 13);
437 cb3.pop_front();
438 cb3.pop_front();
439 CB_CONTAINER<MyInteger> cb4(5);
440 CB_CONTAINER<MyInteger> cb5(12, v.begin(), v.end());
441 cb5.push_back(item: 13);
442 cb5.push_back(item: 14);
443 cb5.push_back(item: 15);
444 cb5.pop_front();
445 cb5.pop_front();
446 cb5.pop_front();
447 cb5.pop_front();
448 cb5.pop_front();
449 cb5.pop_front();
450 CB_CONTAINER<MyInteger> cb6(6);
451 cb6.push_back(item: -2);
452 cb6.push_back(item: -1);
453 cb6.push_back(item: 0);
454 cb6.push_back(item: 1);
455 cb6.push_back(item: 2);
456 cb6.push_back(item: 3);
457 cb6.push_back(item: 4);
458 cb6.push_back(item: 5);
459 cb6.push_back(item: 6);
460 cb6.pop_back();
461 CB_CONTAINER<MyInteger> cb7(6);
462 cb7.push_back(item: 0);
463 cb7.push_back(item: 1);
464 cb7.push_back(item: 2);
465 cb7.push_back(item: 3);
466 cb7.push_back(item: 4);
467
468 BOOST_CHECK(!cb1.is_linearized());
469 BOOST_CHECK(*cb1.linearize() == 4);
470 BOOST_CHECK(cb1.is_linearized());
471 BOOST_CHECK(cb1.linearize() == cb1.array_one().first);
472 BOOST_CHECK(&cb1[0] < &cb1[1]
473 && &cb1[1] < &cb1[2]
474 && &cb1[2] < &cb1[3]
475 && &cb1[3] < &cb1[4]
476 && &cb1[4] < &cb1[5]
477 && &cb1[5] < &cb1[6]
478 && &cb1[6] < &cb1[7]
479 && &cb1[7] < &cb1[8]
480 && &cb1[8] < &cb1[9]);
481 BOOST_CHECK(*(cb1.linearize() + 1) == 5);
482 BOOST_CHECK(*(cb1.linearize() + 2) == 6);
483 BOOST_CHECK(*(cb1.linearize() + 3) == 7);
484 BOOST_CHECK(*(cb1.linearize() + 4) == 8);
485 BOOST_CHECK(*(cb1.linearize() + 5) == 9);
486 BOOST_CHECK(*(cb1.linearize() + 6) == 10);
487 BOOST_CHECK(*(cb1.linearize() + 7) == 11);
488 BOOST_CHECK(*(cb1.linearize() + 8) == 12);
489 BOOST_CHECK(*(cb1.linearize() + 9) == 13);
490 BOOST_CHECK(!cb2.is_linearized());
491 BOOST_CHECK(*cb2.linearize() == 8);
492 BOOST_CHECK(cb2.is_linearized());
493 BOOST_CHECK(&cb2[0] < &cb2[1]
494 && &cb2[1] < &cb2[2]
495 && &cb2[2] < &cb2[3]
496 && &cb2[3] < &cb2[4]
497 && &cb2[4] < &cb2[5]
498 && &cb2[5] < &cb2[6]
499 && &cb2[6] < &cb2[7]
500 && &cb2[7] < &cb2[8]
501 && &cb2[8] < &cb2[9]);
502 BOOST_CHECK(*(cb2.linearize() + 1) == 9);
503 BOOST_CHECK(*(cb2.linearize() + 2) == 10);
504 BOOST_CHECK(*(cb2.linearize() + 3) == 11);
505 BOOST_CHECK(*(cb2.linearize() + 4) == 12);
506 BOOST_CHECK(*(cb2.linearize() + 5) == 13);
507 BOOST_CHECK(*(cb2.linearize() + 6) == 14);
508 BOOST_CHECK(*(cb2.linearize() + 7) == 15);
509 BOOST_CHECK(*(cb2.linearize() + 8) == 16);
510 BOOST_CHECK(*(cb2.linearize() + 9) == 17);
511 BOOST_CHECK(cb2.is_linearized());
512 BOOST_CHECK(*cb3.linearize() == 6);
513 BOOST_CHECK(cb3.is_linearized());
514 BOOST_CHECK(&cb3[0] < &cb3[1]
515 && &cb3[1] < &cb3[2]
516 && &cb3[2] < &cb3[3]
517 && &cb3[3] < &cb3[4]
518 && &cb3[4] < &cb3[5]
519 && &cb3[5] < &cb3[6]
520 && &cb3[6] < &cb3[7]);
521 BOOST_CHECK(*(cb3.linearize() + 1) == 7);
522 BOOST_CHECK(*(cb3.linearize() + 2) == 8);
523 BOOST_CHECK(*(cb3.linearize() + 3) == 9);
524 BOOST_CHECK(*(cb3.linearize() + 4) == 10);
525 BOOST_CHECK(*(cb3.linearize() + 5) == 11);
526 BOOST_CHECK(*(cb3.linearize() + 6) == 12);
527 BOOST_CHECK(*(cb3.linearize() + 7) == 13);
528 BOOST_CHECK(cb4.linearize() == 0);
529 BOOST_CHECK(cb4.is_linearized());
530 BOOST_CHECK(*cb5.linearize() == 10);
531 BOOST_CHECK(cb5.is_linearized());
532 BOOST_CHECK(&cb5[0] < &cb5[1]
533 && &cb5[1] < &cb5[2]
534 && &cb5[2] < &cb5[3]
535 && &cb5[3] < &cb5[4]
536 && &cb5[4] < &cb5[5]);
537 BOOST_CHECK(*(cb5.linearize() + 1) == 11);
538 BOOST_CHECK(*(cb5.linearize() + 2) == 12);
539 BOOST_CHECK(*(cb5.linearize() + 3) == 13);
540 BOOST_CHECK(*(cb5.linearize() + 4) == 14);
541 BOOST_CHECK(*(cb5.linearize() + 5) == 15);
542 BOOST_CHECK(*cb6.linearize() == 1);
543 BOOST_CHECK(cb6.is_linearized());
544 BOOST_CHECK(&cb6[0] < &cb6[1]
545 && &cb6[1] < &cb6[2]
546 && &cb6[2] < &cb6[3]
547 && &cb6[3] < &cb6[4]);
548 BOOST_CHECK(*(cb6.linearize() + 1) == 2);
549 BOOST_CHECK(*(cb6.linearize() + 2) == 3);
550 BOOST_CHECK(*(cb6.linearize() + 3) == 4);
551 BOOST_CHECK(*(cb6.linearize() + 4) == 5);
552 BOOST_CHECK(cb7.is_linearized());
553
554 generic_test(cb&: cb1);
555 generic_test(cb&: cb2);
556 generic_test(cb&: cb3);
557 generic_test(cb&: cb4);
558 generic_test(cb&: cb5);
559 generic_test(cb&: cb6);
560 generic_test(cb&: cb7);
561}
562
563void array_range_test() {
564
565 CB_CONTAINER<MyInteger> cb(7);
566 CB_CONTAINER<MyInteger>::array_range a1 = cb.array_one();
567 CB_CONTAINER<MyInteger>::array_range a2 = cb.array_two();
568 CB_CONTAINER<MyInteger>::const_array_range ca1 = cb.array_one();
569 CB_CONTAINER<MyInteger>::const_array_range ca2 = cb.array_two();
570
571 BOOST_CHECK(a1.second == 0);
572 BOOST_CHECK(a2.second == 0);
573 BOOST_CHECK(ca1.second == 0);
574 BOOST_CHECK(ca2.second == 0);
575
576 cb.push_back(item: 1);
577 cb.push_back(item: 2);
578 cb.push_back(item: 3);
579 a1 = cb.array_one();
580 a2 = cb.array_two();
581 ca1 = cb.array_one();
582 ca2 = cb.array_two();
583
584 BOOST_CHECK(a1.first[0] == 1);
585 BOOST_CHECK(a1.first[2] == 3);
586 BOOST_CHECK(ca1.first[0] == 1);
587 BOOST_CHECK(ca1.first[2] == 3);
588 BOOST_CHECK(a1.second == 3);
589 BOOST_CHECK(a2.second == 0);
590 BOOST_CHECK(ca1.second == 3);
591 BOOST_CHECK(ca2.second == 0);
592
593 cb.push_back(item: 4);
594 cb.push_back(item: 5);
595 cb.push_back(item: 6);
596 cb.push_back(item: 7);
597 cb.push_back(item: 8);
598 cb.push_back(item: 9);
599 cb.push_back(item: 10);
600 a1 = cb.array_one();
601 a2 = cb.array_two();
602 ca1 = cb.array_one();
603 ca2 = cb.array_two();
604
605 BOOST_CHECK(a1.first[0] == 4);
606 BOOST_CHECK(a1.first[3] == 7);
607 BOOST_CHECK(a2.first[0] == 8);
608 BOOST_CHECK(a2.first[2] == 10);
609 BOOST_CHECK(ca1.first[0] == 4);
610 BOOST_CHECK(ca1.first[3] == 7);
611 BOOST_CHECK(ca2.first[0] == 8);
612 BOOST_CHECK(ca2.first[2] == 10);
613 BOOST_CHECK(a1.second == 4);
614 BOOST_CHECK(a2.second == 3);
615 BOOST_CHECK(ca1.second == 4);
616 BOOST_CHECK(ca2.second == 3);
617
618 cb.pop_front();
619 cb.pop_back();
620 a1 = cb.array_one();
621 a2 = cb.array_two();
622 ca1 = cb.array_one();
623 ca2 = cb.array_two();
624
625 BOOST_CHECK(a1.first[0] == 5);
626 BOOST_CHECK(a1.first[2] == 7);
627 BOOST_CHECK(a2.first[0] == 8);
628 BOOST_CHECK(a2.first[1] == 9);
629 BOOST_CHECK(ca1.first[0] == 5);
630 BOOST_CHECK(ca1.first[2] == 7);
631 BOOST_CHECK(ca2.first[0] == 8);
632 BOOST_CHECK(ca2.first[1] == 9);
633 BOOST_CHECK(a1.second == 3);
634 BOOST_CHECK(a2.second == 2);
635 BOOST_CHECK(ca1.second == 3);
636 BOOST_CHECK(ca2.second == 2);
637
638 cb.pop_back();
639 cb.pop_back();
640 cb.pop_back();
641 a1 = cb.array_one();
642 a2 = cb.array_two();
643 ca1 = cb.array_one();
644 ca2 = cb.array_two();
645
646 BOOST_CHECK(a1.first[0] == 5);
647 BOOST_CHECK(a1.first[1] == 6);
648 BOOST_CHECK(ca1.first[0] == 5);
649 BOOST_CHECK(ca1.first[1] == 6);
650 BOOST_CHECK(a1.second == 2);
651 BOOST_CHECK(a2.second == 0);
652 BOOST_CHECK(ca1.second == 2);
653 BOOST_CHECK(ca2.second == 0);
654
655 CB_CONTAINER<MyInteger> cb0(0);
656 a1 = cb0.array_one();
657 a2 = cb0.array_two();
658
659 BOOST_CHECK(a1.second == 0);
660 BOOST_CHECK(a2.second == 0);
661
662 const CB_CONTAINER<MyInteger> ccb(10, 1);
663 ca1 = ccb.array_one();
664 ca2 = ccb.array_two();
665
666 BOOST_CHECK(ca1.second == 10);
667 BOOST_CHECK(*(ca1.first) == 1);
668 BOOST_CHECK(ca2.second == 0);
669
670 generic_test(cb);
671 generic_test(cb&: cb0);
672}
673
674void capacity_and_reserve_test() {
675
676 CB_CONTAINER<MyInteger> cb1(0);
677 CB_CONTAINER<MyInteger> cb2(10);
678
679 BOOST_CHECK(cb1.capacity() == 0);
680 BOOST_CHECK(cb1.size() == 0);
681 BOOST_CHECK(cb1.reserve() == 0);
682 BOOST_CHECK(cb1.full());
683 BOOST_CHECK(cb1.empty());
684 BOOST_CHECK(cb1.reserve() == cb1.capacity() - cb1.size());
685 BOOST_CHECK(cb2.capacity() == 10);
686 BOOST_CHECK(cb2.size() == 0);
687 BOOST_CHECK(cb2.reserve() == 10);
688 BOOST_CHECK(cb2.reserve() == cb2.capacity() - cb2.size());
689
690 cb1.push_back(item: 1);
691 cb2.push_back(item: 2);
692 cb2.push_back(item: 2);
693 cb2.push_back(item: 2);
694
695 BOOST_CHECK(cb1.capacity() == 0);
696 BOOST_CHECK(cb1.size() == 0);
697 BOOST_CHECK(cb1.reserve() == 0);
698 BOOST_CHECK(cb1.full());
699 BOOST_CHECK(cb1.empty());
700 BOOST_CHECK(cb1.reserve() == cb1.capacity() - cb1.size());
701 BOOST_CHECK(cb2.capacity() == 10);
702 BOOST_CHECK(cb2.size() == 3);
703 BOOST_CHECK(cb2.reserve() == 7);
704 BOOST_CHECK(cb2.reserve() == cb2.capacity() - cb2.size());
705
706 generic_test(cb&: cb1);
707 generic_test(cb&: cb2);
708}
709
710void full_and_empty_test() {
711
712 CB_CONTAINER<MyInteger> cb1(10);
713 CB_CONTAINER<MyInteger> cb2(3);
714 CB_CONTAINER<MyInteger> cb3(2);
715 CB_CONTAINER<MyInteger> cb4(2);
716 cb2.push_back(item: 1);
717 cb2.push_back(item: 3);
718 cb2.push_back(item: 1);
719 cb2.push_back(item: 1);
720 cb2.push_back(item: 1);
721 cb3.push_back(item: 3);
722 cb3.push_back(item: 1);
723 cb4.push_back(item: 1);
724
725 BOOST_CHECK(cb1.empty());
726 BOOST_CHECK(cb2.full());
727 BOOST_CHECK(cb3.full());
728 BOOST_CHECK(!cb4.empty());
729 BOOST_CHECK(!cb4.full());
730
731 generic_test(cb&: cb1);
732 generic_test(cb&: cb2);
733 generic_test(cb&: cb3);
734 generic_test(cb&: cb4);
735}
736
737void set_capacity_test() {
738
739 CB_CONTAINER<MyInteger> cb1(10);
740 cb1.push_back(item: 2);
741 cb1.push_back(item: 3);
742 cb1.push_back(item: 1);
743 cb1.set_capacity(5);
744 CB_CONTAINER<MyInteger> cb2(3);
745 cb2.push_back(item: 2);
746 cb2.push_back(item: 3);
747 cb2.push_back(item: 1);
748 cb2.set_capacity(10);
749 CB_CONTAINER<MyInteger> cb3(5);
750 cb3.push_back(item: 2);
751 cb3.push_back(item: 3);
752 cb3.push_back(item: 1);
753 cb3.set_capacity(2);
754
755 BOOST_CHECK(cb1.size() == 3);
756 BOOST_CHECK(cb1[0] == 2);
757 BOOST_CHECK(cb1[2] == 1);
758 BOOST_CHECK(cb1.capacity() == 5);
759 BOOST_CHECK(cb2.size() == 3);
760 BOOST_CHECK(cb2[0] == 2);
761 BOOST_CHECK(cb2[2] == 1);
762 BOOST_CHECK(cb2.capacity() == 10);
763 BOOST_CHECK(cb3.size() == 2);
764 BOOST_CHECK(cb3[0] == 2);
765 BOOST_CHECK(cb3[1] == 3);
766 BOOST_CHECK(cb3.capacity() == 2);
767
768 cb3.set_capacity(2);
769
770 BOOST_CHECK(cb3.size() == 2);
771 BOOST_CHECK(cb3[0] == 2);
772 BOOST_CHECK(cb3[1] == 3);
773 BOOST_CHECK(cb3.capacity() == 2);
774
775 cb3.set_capacity(0);
776
777 BOOST_CHECK(cb3.size() == 0);
778 BOOST_CHECK(cb3.capacity() == 0);
779
780 generic_test(cb&: cb1);
781 generic_test(cb&: cb2);
782 generic_test(cb&: cb3);
783}
784
785void rset_capacity_test() {
786
787 CB_CONTAINER<MyInteger> cb1(10);
788 cb1.push_back(item: 2);
789 cb1.push_back(item: 3);
790 cb1.push_back(item: 1);
791 cb1.rset_capacity(new_capacity: 5);
792 CB_CONTAINER<MyInteger> cb2(3);
793 cb2.push_back(item: 2);
794 cb2.push_back(item: 3);
795 cb2.push_back(item: 1);
796 cb2.rset_capacity(new_capacity: 10);
797 CB_CONTAINER<MyInteger> cb3(5);
798 cb3.push_back(item: 2);
799 cb3.push_back(item: 3);
800 cb3.push_back(item: 1);
801 cb3.rset_capacity(new_capacity: 2);
802
803 BOOST_CHECK(cb1.size() == 3);
804 BOOST_CHECK(cb1[0] == 2);
805 BOOST_CHECK(cb1[2] == 1);
806 BOOST_CHECK(cb1.capacity() == 5);
807 BOOST_CHECK(cb2.size() == 3);
808 BOOST_CHECK(cb2[0] == 2);
809 BOOST_CHECK(cb2[2] == 1);
810 BOOST_CHECK(cb2.capacity() == 10);
811 BOOST_CHECK(cb3.size() == 2);
812 BOOST_CHECK(cb3[0] == 3);
813 BOOST_CHECK(cb3[1] == 1);
814 BOOST_CHECK(cb3.capacity() == 2);
815
816 cb3.rset_capacity(new_capacity: 2);
817
818 BOOST_CHECK(cb3.size() == 2);
819 BOOST_CHECK(cb3[0] == 3);
820 BOOST_CHECK(cb3[1] == 1);
821 BOOST_CHECK(cb3.capacity() == 2);
822
823 cb3.rset_capacity(new_capacity: 0);
824
825 BOOST_CHECK(cb3.size() == 0);
826 BOOST_CHECK(cb3.capacity() == 0);
827
828 generic_test(cb&: cb1);
829 generic_test(cb&: cb2);
830 generic_test(cb&: cb3);
831}
832
833void resize_test() {
834
835 CB_CONTAINER<MyInteger> cb1(10);
836 cb1.push_back(item: 1);
837 cb1.push_back(item: 2);
838 cb1.push_back(item: 3);
839 cb1.push_back(item: 4);
840 cb1.resize(new_size: 20, item: 5);
841 CB_CONTAINER<MyInteger> cb2(10);
842 cb2.push_back(item: 1);
843 cb2.push_back(item: 2);
844 cb2.push_back(item: 3);
845 cb2.push_back(item: 4);
846 cb2.resize(new_size: 2);
847 CB_CONTAINER<MyInteger> cb3(10, 1);
848 cb3.resize(new_size: 0);
849 CB_CONTAINER<MyInteger> cb4(10, 1);
850 cb4.resize(new_size: 10);
851
852 BOOST_CHECK(cb1.size() == 20);
853 BOOST_CHECK(cb1.capacity() == 20);
854 BOOST_CHECK(cb1[0] == 1);
855 BOOST_CHECK(cb1[3] == 4);
856 BOOST_CHECK(cb1[4] == 5);
857 BOOST_CHECK(cb1[19] == 5);
858 BOOST_CHECK(cb2.size() == 2);
859 BOOST_CHECK(cb2.capacity() == 10);
860 BOOST_CHECK(cb2[0] == 1);
861 BOOST_CHECK(cb2[1] == 2);
862 BOOST_CHECK(cb3.size() == 0);
863 BOOST_CHECK(cb3.capacity() == 10);
864 BOOST_CHECK(cb4.size() == 10);
865 BOOST_CHECK(cb4.capacity() == 10);
866 BOOST_CHECK(cb4[0] == 1);
867 BOOST_CHECK(cb4[9] == 1);
868
869 generic_test(cb&: cb1);
870 generic_test(cb&: cb2);
871 generic_test(cb&: cb3);
872 generic_test(cb&: cb4);
873}
874
875void rresize_test() {
876
877 CB_CONTAINER<MyInteger> cb1(10);
878 cb1.push_back(item: 1);
879 cb1.push_back(item: 2);
880 cb1.push_back(item: 3);
881 cb1.push_back(item: 4);
882 cb1.rresize(new_size: 20, item: 5);
883 CB_CONTAINER<MyInteger> cb2(10);
884 cb2.push_back(item: 1);
885 cb2.push_back(item: 2);
886 cb2.push_back(item: 3);
887 cb2.push_back(item: 4);
888 cb2.rresize(new_size: 2);
889 CB_CONTAINER<MyInteger> cb3(10, 1);
890 cb3.rresize(new_size: 0);
891 CB_CONTAINER<MyInteger> cb4(10, 1);
892 cb4.rresize(new_size: 10);
893
894 BOOST_CHECK(cb1.size() == 20);
895 BOOST_CHECK(cb1.capacity() == 20);
896 BOOST_CHECK(cb1[0] == 5);
897 BOOST_CHECK(cb1[15] == 5);
898 BOOST_CHECK(cb1[16] == 1);
899 BOOST_CHECK(cb1[19] == 4);
900 BOOST_CHECK(cb2.size() == 2);
901 BOOST_CHECK(cb2.capacity() == 10);
902 BOOST_CHECK(cb2[0] == 3);
903 BOOST_CHECK(cb2[1] == 4);
904 BOOST_CHECK(cb3.size() == 0);
905 BOOST_CHECK(cb3.capacity() == 10);
906 BOOST_CHECK(cb4.size() == 10);
907 BOOST_CHECK(cb4.capacity() == 10);
908 BOOST_CHECK(cb4[0] == 1);
909 BOOST_CHECK(cb4[9] == 1);
910
911 generic_test(cb&: cb1);
912 generic_test(cb&: cb2);
913 generic_test(cb&: cb3);
914 generic_test(cb&: cb4);
915}
916
917void constructor_test() {
918
919 CB_CONTAINER<MyInteger> cb0;
920 BOOST_CHECK(cb0.capacity() == 0);
921 BOOST_CHECK(cb0.size() == 0);
922
923 cb0.push_back(item: 1);
924 cb0.push_back(item: 2);
925 cb0.push_back(item: 3);
926
927 BOOST_CHECK(cb0.size() == 0);
928 BOOST_CHECK(cb0.capacity() == 0);
929
930 CB_CONTAINER<MyInteger> cb1(3);
931 CB_CONTAINER<MyInteger> cb2(3, 2);
932 vector<int> v;
933 v.push_back(x: 1);
934 v.push_back(x: 2);
935 v.push_back(x: 3);
936 v.push_back(x: 4);
937 v.push_back(x: 5);
938 CB_CONTAINER<MyInteger> cb3(v.begin(), v.end());
939 CB_CONTAINER<MyInteger> cb4(3, v.begin(), v.end());
940 CB_CONTAINER<MyInteger> cb5(10, v.begin(), v.end());
941 CB_CONTAINER<MyInteger> cb6(10, 3, MyInteger(2));
942
943 BOOST_CHECK(cb1.size() == 0);
944 BOOST_CHECK(cb1.capacity() == 3);
945 BOOST_CHECK(cb2[0] == 2);
946 BOOST_CHECK(cb2.full());
947 BOOST_CHECK(cb2[0] == 2);
948 BOOST_CHECK(cb2[1] == 2);
949 BOOST_CHECK(cb2[2] == 2);
950 BOOST_CHECK(cb3.size() == 5);
951 BOOST_CHECK(cb3.capacity() == 5);
952 BOOST_CHECK(cb3.full());
953 BOOST_CHECK(cb3[0] == 1);
954 BOOST_CHECK(cb3[4] == 5);
955 BOOST_CHECK(cb4.size() == 3);
956 BOOST_CHECK(cb4.capacity() == 3);
957 BOOST_CHECK(cb4.full());
958 BOOST_CHECK(cb4[0] == 3);
959 BOOST_CHECK(cb4[2] == 5);
960 BOOST_CHECK(cb5.size() == 5);
961 BOOST_CHECK(cb5.capacity() == 10);
962 BOOST_CHECK(!cb5.full());
963 BOOST_CHECK(cb5[0] == 1);
964 BOOST_CHECK(cb5[4] == 5);
965 BOOST_CHECK(cb6.size() == 3);
966 BOOST_CHECK(cb6.capacity() == 10);
967 BOOST_CHECK(!cb6.full());
968 BOOST_CHECK(cb6[0] == 2);
969 BOOST_CHECK(cb6[2] == 2);
970
971 cb5.push_back(item: 6);
972 cb6.push_back(item: 6);
973
974 BOOST_CHECK(cb5[5] == 6);
975 BOOST_CHECK(cb5[0] == 1);
976 BOOST_CHECK(cb5.size() == 6);
977 BOOST_CHECK(cb6[3] == 6);
978 BOOST_CHECK(cb6.size() == 4);
979 BOOST_CHECK(cb6[0] == 2);
980
981#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
982
983 CB_CONTAINER<int> cb7(MyInputIterator(v.begin()), MyInputIterator(v.end()));
984 CB_CONTAINER<int> cb8(3, MyInputIterator(v.begin()), MyInputIterator(v.end()));
985
986 BOOST_CHECK(cb7.capacity() == 5);
987 BOOST_CHECK(cb8.capacity() == 3);
988
989#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
990
991 generic_test(cb&: cb1);
992 generic_test(cb&: cb2);
993 generic_test(cb&: cb3);
994 generic_test(cb&: cb4);
995 generic_test(cb&: cb5);
996 generic_test(cb&: cb6);
997}
998
999void assign_test() {
1000
1001 CB_CONTAINER<MyInteger> cb1(4);
1002 cb1.push_back(item: 1);
1003 cb1.push_back(item: 2);
1004 cb1.push_back(item: 3);
1005 cb1.push_back(item: 4);
1006 cb1.push_back(item: 5);
1007 cb1.assign(first: 3, last: 8);
1008 BOOST_CHECK(cb1.size() == 3);
1009 BOOST_CHECK(cb1.capacity() == 3);
1010 BOOST_CHECK(cb1[0] == 8);
1011 BOOST_CHECK(cb1[2] == 8);
1012
1013 cb1.assign(first: 6, last: 7);
1014 BOOST_CHECK(cb1.size() == 6);
1015 BOOST_CHECK(cb1.capacity() == 6);
1016 BOOST_CHECK(cb1[0] == 7);
1017 BOOST_CHECK(cb1[5] == 7);
1018
1019 CB_CONTAINER<float> cb2(4);
1020 cb2.assign(n: 3, item: 1.1f);
1021 BOOST_CHECK(cb2[0] == 1.1f);
1022
1023 CB_CONTAINER<MyInteger> cb3(5);
1024 cb3.push_back(item: 1);
1025 cb3.push_back(item: 2);
1026 cb3.push_back(item: 3);
1027 cb3.assign(n: (size_t)10, item: 1); // The size_t cast is not needed. It is present here just because of testing purposes.
1028 BOOST_CHECK(cb3[0] == 1);
1029 BOOST_CHECK(cb3[9] == 1);
1030 BOOST_CHECK(cb3.size() == 10);
1031 BOOST_CHECK(cb3.capacity() == 10);
1032
1033#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
1034
1035 vector<int> v;
1036 v.push_back(x: 1);
1037 v.push_back(x: 2);
1038 v.push_back(x: 3);
1039 v.push_back(x: 4);
1040 v.push_back(x: 5);
1041
1042 CB_CONTAINER<int> cb4(3);
1043 cb4.assign(first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1044 CB_CONTAINER<int> cb5(3);
1045 cb5.assign(buffer_capacity: 4, first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1046
1047 BOOST_CHECK(cb4.capacity() == 5);
1048 BOOST_CHECK(cb5.capacity() == 4);
1049
1050#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
1051
1052 generic_test(cb&: cb1);
1053 generic_test(cb&: cb3);
1054}
1055
1056void copy_constructor_and_assign_test() {
1057
1058 CB_CONTAINER<MyInteger> cb1(4);
1059 cb1.push_back(item: 1);
1060 cb1.push_back(item: 2);
1061 cb1.push_back(item: 3);
1062 cb1.push_back(item: 4);
1063 cb1.push_back(item: 5);
1064 CB_CONTAINER<MyInteger> cb2 = cb1;
1065
1066 BOOST_CHECK(cb1 == cb2);
1067 BOOST_CHECK(cb2.capacity() == 4);
1068 BOOST_CHECK(cb2[0] == 2);
1069 BOOST_CHECK(cb2[3] == 5);
1070
1071 CB_CONTAINER<MyInteger> cb3(20);
1072 cb1.pop_back();
1073 CB_CONTAINER<MyInteger> cb4(3);
1074 cb3 = cb2;
1075 cb3 = cb3;
1076 cb4 = cb1;
1077 CB_CONTAINER<MyInteger> cb5 = cb1;
1078
1079 BOOST_CHECK(cb3 == cb2);
1080 BOOST_CHECK(cb4 == cb1);
1081 BOOST_CHECK(cb2.full());
1082 BOOST_CHECK(cb2[0] == 2);
1083 BOOST_CHECK(cb3.full());
1084 BOOST_CHECK(cb3.capacity() == 4);
1085 BOOST_CHECK(cb4.capacity() == 4);
1086 BOOST_CHECK(!cb4.full());
1087 BOOST_CHECK(*(cb4.end() - 1) == 4);
1088 BOOST_CHECK(cb1 == cb5);
1089 BOOST_CHECK(cb5.capacity() == 4);
1090 BOOST_CHECK(cb2[0] == 2);
1091 BOOST_CHECK(cb2[2] == 4);
1092
1093 generic_test(cb&: cb1);
1094 generic_test(cb&: cb2);
1095 generic_test(cb&: cb3);
1096 generic_test(cb&: cb4);
1097 generic_test(cb&: cb5);
1098}
1099
1100void swap_test() {
1101
1102 CB_CONTAINER<MyInteger> cb1(2);
1103 cb1.push_back(item: 1);
1104 cb1.push_back(item: 2);
1105 cb1.push_back(item: 3);
1106 CB_CONTAINER<MyInteger> cb2(5);
1107 cb2.push_back(item: 8);
1108 cb2.swap(cb&: cb1);
1109 cb2.swap(cb&: cb2);
1110
1111 BOOST_CHECK(cb2.capacity() == 2);
1112 BOOST_CHECK(cb2[0] == 2);
1113 BOOST_CHECK(cb2.full());
1114 BOOST_CHECK(cb1.capacity() == 5);
1115 BOOST_CHECK(cb1[0] == 8);
1116 BOOST_CHECK(cb1.size() == 1);
1117
1118 generic_test(cb&: cb1);
1119 generic_test(cb&: cb2);
1120}
1121
1122void push_back_test() {
1123
1124 CB_CONTAINER<MyDefaultConstructible> cb1(5);
1125 cb1.push_back();
1126 cb1.push_back(item: MyDefaultConstructible(2));
1127 BOOST_CHECK(cb1[0].m_n == 1);
1128 BOOST_CHECK(cb1[1].m_n == 2);
1129
1130 CB_CONTAINER<MyInteger> cb2(5);
1131 cb2.push_back();
1132 BOOST_CHECK(cb2.back() == CB_CONTAINER<MyInteger>::value_type());
1133
1134 cb2.push_back(item: 1);
1135 BOOST_CHECK(cb2.back() == 1);
1136
1137 generic_test(cb&: cb2);
1138}
1139
1140void pop_back_test() {
1141
1142 CB_CONTAINER<MyInteger> cb(4);
1143 cb.push_back(item: 1);
1144 cb.push_back(item: 2);
1145 cb.push_back(item: 3);
1146 cb.push_back(item: 4);
1147 cb.push_back(item: 5);
1148 cb.pop_back();
1149
1150 BOOST_CHECK(cb.size() == 3);
1151 BOOST_CHECK(!cb.full());
1152 BOOST_CHECK(cb[0] == 2);
1153
1154 generic_test(cb);
1155}
1156
1157void insert_test() {
1158
1159 CB_CONTAINER<MyInteger> cb1(4);
1160 cb1.push_back(item: 1);
1161 cb1.push_back(item: 2);
1162 cb1.push_back(item: 3);
1163 CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 1;
1164 it1 = cb1.insert(pos: it1, item: 10);
1165 CB_CONTAINER<MyInteger> cb2(4);
1166 cb2.push_back(item: 1);
1167 cb2.insert(pos: cb2.begin());
1168 cb2.insert(pos: cb2.begin(), item: -1);
1169 CB_CONTAINER<MyInteger>::iterator it2 = cb2.begin() + 1;
1170 it2 = cb2.insert(pos: it2, item: 5);
1171 CB_CONTAINER<MyInteger> cb3(2);
1172 cb3.insert(pos: cb3.end(), item: 10);
1173 cb3.insert(pos: cb3.end(), item: 20);
1174 cb3.insert(pos: cb3.begin(), item: 30);
1175 cb3.insert(pos: cb3.end(), item: 40);
1176
1177 BOOST_CHECK(cb1[1] == 10);
1178 BOOST_CHECK(*it1 == 10);
1179 BOOST_CHECK(cb1.full());
1180 BOOST_CHECK(cb2[1] == 5);
1181 BOOST_CHECK(*it2 == 5);
1182 BOOST_CHECK(cb2.full());
1183 BOOST_CHECK(cb3[0] == 20);
1184 BOOST_CHECK(cb3[1] == 40);
1185
1186 generic_test(cb&: cb1);
1187 generic_test(cb&: cb2);
1188 generic_test(cb&: cb3);
1189}
1190
1191void insert_n_test() {
1192
1193 CB_CONTAINER<MyInteger> cb1(4);
1194 cb1.push_back(item: 1);
1195 cb1.push_back(item: 2);
1196 cb1.push_back(item: 3);
1197 cb1.insert(pos: cb1.begin() + 1, first: 2, last: 10);
1198 CB_CONTAINER<MyInteger> cb2(2, 3);
1199 cb2.insert(pos: cb2.begin(), first: 10, last: 5);
1200 CB_CONTAINER<MyInteger> cb3(4);
1201 cb3.insert(pos: cb3.end(), first: 1, last: 6);
1202 CB_CONTAINER<MyInteger> cb4(6);
1203 cb4.push_back(item: 1);
1204 cb4.push_back(item: 2);
1205 cb4.push_back(item: 3);
1206 cb4.push_back(item: 4);
1207 cb4.insert(pos: cb4.begin() + 2, first: 5, last: 6);
1208 cb4.insert(pos: cb4.begin() + 2, first: 0, last: 7);
1209
1210 BOOST_CHECK(cb1.full());
1211 BOOST_CHECK(cb1[0] == 10);
1212 BOOST_CHECK(cb1[1] == 10);
1213 BOOST_CHECK(cb1[2] == 2);
1214 BOOST_CHECK(cb1[3] == 3);
1215 BOOST_CHECK(cb2[0] == 3);
1216 BOOST_CHECK(cb2[1] == 3);
1217 BOOST_CHECK(cb3[0] == 6);
1218 BOOST_CHECK(cb3.size() == 1);
1219 BOOST_CHECK(cb4.size() == 6);
1220 BOOST_CHECK(cb4[0] == 6);
1221 BOOST_CHECK(cb4[1] == 6);
1222 BOOST_CHECK(cb4[2] == 6);
1223 BOOST_CHECK(cb4[3] == 6);
1224 BOOST_CHECK(cb4[4] == 3);
1225 BOOST_CHECK(cb4[5] == 4);
1226
1227 generic_test(cb&: cb1);
1228 generic_test(cb&: cb2);
1229 generic_test(cb&: cb3);
1230 generic_test(cb&: cb4);
1231}
1232
1233void insert_range_test() {
1234
1235 vector<int> v;
1236 v.push_back(x: 11);
1237 v.push_back(x: 12);
1238 v.push_back(x: 13);
1239 CB_CONTAINER<MyInteger> cb1(4);
1240 cb1.push_back(item: 1);
1241 cb1.push_back(item: 2);
1242 cb1.push_back(item: 3);
1243 cb1.insert(pos: cb1.begin() + 1, first: v.begin(), last: v.end());
1244 CB_CONTAINER<MyInteger> cb2(2, 2);
1245 cb2.insert(pos: cb2.end(), first: v.begin(), last: v.end());
1246 CB_CONTAINER<MyInteger> cb3(5);
1247 cb3.insert(pos: cb3.end(), first: v.end(), last: v.end());
1248 CB_CONTAINER<MyInteger> cb4(5);
1249 cb4.insert(pos: cb4.end(), first: v.begin(), last: v.begin() + 1);
1250 MyInteger array[] = { 5, 6, 7, 8, 9 };
1251 CB_CONTAINER<MyInteger> cb5(6);
1252 cb5.push_back(item: 1);
1253 cb5.push_back(item: 2);
1254 cb5.push_back(item: 3);
1255 cb5.push_back(item: 4);
1256 cb5.insert(pos: cb5.begin() + 2, first: array, last: array + 5);
1257 cb5.insert(pos: cb5.begin(), first: array, last: array + 5);
1258
1259 BOOST_CHECK(cb1.full());
1260 BOOST_CHECK(cb1[0] == 12);
1261 BOOST_CHECK(cb1[1] == 13);
1262 BOOST_CHECK(cb1[2] == 2);
1263 BOOST_CHECK(cb1[3] == 3);
1264 BOOST_CHECK(cb2[0] == 12);
1265 BOOST_CHECK(cb2[1] == 13);
1266 BOOST_CHECK(cb3.empty());
1267 BOOST_CHECK(cb4[0] == 11);
1268 BOOST_CHECK(cb4.size() == 1);
1269 BOOST_CHECK(cb5.size() == 6);
1270 BOOST_CHECK(cb5[0] == 6);
1271 BOOST_CHECK(cb5[1] == 7);
1272 BOOST_CHECK(cb5[2] == 8);
1273 BOOST_CHECK(cb5[3] == 9);
1274 BOOST_CHECK(cb5[4] == 3);
1275 BOOST_CHECK(cb5[5] == 4);
1276
1277#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
1278
1279 v.clear();
1280 v.push_back(x: 1);
1281 v.push_back(x: 2);
1282 v.push_back(x: 3);
1283 v.push_back(x: 4);
1284 v.push_back(x: 5);
1285
1286 CB_CONTAINER<int> cb6(4);
1287 cb6.push_back(item: 0);
1288 cb6.push_back(item: -1);
1289 cb6.push_back(item: -2);
1290 cb6.insert(pos: cb6.begin() + 1, first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1291 v.clear();
1292 v.push_back(x: 11);
1293 v.push_back(x: 12);
1294 v.push_back(x: 13);
1295 CB_CONTAINER<int> cb7(4);
1296 cb7.push_back(item: 1);
1297 cb7.push_back(item: 2);
1298 cb7.push_back(item: 3);
1299 cb7.insert(pos: cb7.begin() + 1, first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1300 CB_CONTAINER<int> cb8(2, 2);
1301 cb8.insert(pos: cb8.end(), first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1302 CB_CONTAINER<int> cb9(5);
1303 cb9.insert(pos: cb9.end(), first: MyInputIterator(v.end()), last: MyInputIterator(v.end()));
1304 CB_CONTAINER<int> cb10(5);
1305 cb10.insert(pos: cb10.end(), first: MyInputIterator(v.begin()), last: MyInputIterator(v.begin() + 1));
1306 v.clear();
1307 v.push_back(x: 5);
1308 v.push_back(x: 6);
1309 v.push_back(x: 7);
1310 v.push_back(x: 8);
1311 v.push_back(x: 9);
1312 CB_CONTAINER<int> cb11(6);
1313 cb11.push_back(item: 1);
1314 cb11.push_back(item: 2);
1315 cb11.push_back(item: 3);
1316 cb11.push_back(item: 4);
1317 cb11.insert(pos: cb11.begin() + 2, first: MyInputIterator(v.begin()), last: MyInputIterator(v.begin() + 5));
1318 cb11.insert(pos: cb11.begin(), first: MyInputIterator(v.begin()), last: MyInputIterator(v.begin() + 5));
1319
1320 BOOST_CHECK(cb6.capacity() == 4);
1321 BOOST_CHECK(cb6[0] == 4);
1322 BOOST_CHECK(cb6[3] == -2);
1323 BOOST_CHECK(cb7.full());
1324 BOOST_CHECK(cb7[0] == 12);
1325 BOOST_CHECK(cb7[1] == 13);
1326 BOOST_CHECK(cb7[2] == 2);
1327 BOOST_CHECK(cb7[3] == 3);
1328 BOOST_CHECK(cb8[0] == 12);
1329 BOOST_CHECK(cb8[1] == 13);
1330 BOOST_CHECK(cb9.empty());
1331 BOOST_CHECK(cb10[0] == 11);
1332 BOOST_CHECK(cb10.size() == 1);
1333 BOOST_CHECK(cb11.size() == 6);
1334 BOOST_CHECK(cb11[0] == 6);
1335 BOOST_CHECK(cb11[1] == 7);
1336 BOOST_CHECK(cb11[2] == 8);
1337 BOOST_CHECK(cb11[3] == 9);
1338 BOOST_CHECK(cb11[4] == 3);
1339 BOOST_CHECK(cb11[5] == 4);
1340
1341#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
1342
1343 generic_test(cb&: cb1);
1344 generic_test(cb&: cb2);
1345 generic_test(cb&: cb3);
1346 generic_test(cb&: cb4);
1347 generic_test(cb&: cb5);
1348}
1349
1350void push_front_test() {
1351
1352 CB_CONTAINER<MyDefaultConstructible> cb1(5);
1353 cb1.push_front();
1354 cb1.push_front(item: MyDefaultConstructible(2));
1355 BOOST_CHECK(cb1[0].m_n == 2);
1356 BOOST_CHECK(cb1[1].m_n == 1);
1357
1358 CB_CONTAINER<MyInteger> cb2(5);
1359 cb2.push_front();
1360 BOOST_CHECK(cb2.front() == CB_CONTAINER<MyInteger>::value_type());
1361
1362 cb2.push_front(item: 1);
1363 BOOST_CHECK(cb2.front() == 1);
1364
1365 CB_CONTAINER<MyInteger> cb3(0);
1366 cb3.push_front(item: 10);
1367 BOOST_CHECK(cb3.empty());
1368
1369 generic_test(cb&: cb2);
1370 generic_test(cb&: cb3);
1371}
1372
1373void pop_front_test() {
1374
1375 CB_CONTAINER<MyInteger> cb(4);
1376 cb.push_front(item: 1);
1377 cb.push_front(item: 2);
1378 cb.push_front(item: 3);
1379 cb.push_front(item: 4);
1380 cb.push_front(item: 5);
1381 cb.pop_front();
1382
1383 BOOST_CHECK(cb.size() == 3);
1384 BOOST_CHECK(!cb.full());
1385 BOOST_CHECK(cb[0] == 4);
1386
1387 generic_test(cb);
1388}
1389
1390void rinsert_test() {
1391
1392 CB_CONTAINER<MyInteger> cb1(4);
1393 cb1.push_front(item: 1);
1394 cb1.push_front(item: 2);
1395 cb1.push_front(item: 3);
1396 CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 1;
1397 it1 = cb1.rinsert(pos: it1, item: 10);
1398 CB_CONTAINER<MyInteger> cb2(4);
1399 cb2.push_front(item: 1);
1400 cb2.rinsert(pos: cb2.begin());
1401 cb2.rinsert(pos: cb2.begin(), item: -1);
1402 CB_CONTAINER<MyInteger>::iterator it2 = cb2.end() - 2;
1403 it2 = cb2.rinsert(pos: it2, item: 5);
1404 CB_CONTAINER<MyInteger> cb3(2);
1405 cb3.rinsert(pos: cb3.begin(), item: 10);
1406 cb3.rinsert(pos: cb3.begin(), item: 20);
1407 cb3.rinsert(pos: cb3.end(), item: 30);
1408 cb3.rinsert(pos: cb3.begin(), item: 40);
1409 CB_CONTAINER<MyInteger> cb4(4);
1410 cb4.push_back(item: 1);
1411 cb4.push_back(item: 2);
1412 cb4.push_back(item: 3);
1413 CB_CONTAINER<MyInteger>::iterator it3 = cb4.begin() + 1;
1414 it3 = cb4.rinsert(pos: it3, item: 10);
1415 CB_CONTAINER<MyInteger> cb5(4);
1416 cb5.push_back(item: 1);
1417 cb5.rinsert(pos: cb5.begin(), item: 0);
1418 cb5.rinsert(pos: cb5.begin(), item: -1);
1419 CB_CONTAINER<MyInteger>::iterator it4 = cb5.begin() + 1;
1420 it4 = cb5.rinsert(pos: it4, item: 5);
1421 CB_CONTAINER<MyInteger> cb6(2);
1422 cb6.rinsert(pos: cb6.end(), item: 10);
1423 cb6.rinsert(pos: cb6.end(), item: 20);
1424 cb6.rinsert(pos: cb6.begin(), item: 30);
1425 cb6.rinsert(pos: cb6.end(), item: 40);
1426 CB_CONTAINER<MyInteger> cb7(6);
1427 cb7.push_back(item: 1);
1428 cb7.push_back(item: 2);
1429 cb7.push_back(item: 3);
1430 cb7.push_back(item: 4);
1431 cb7.rinsert(pos: cb7.begin() + 2, first: 5, last: 6);
1432
1433 BOOST_CHECK(cb1[1] == 10);
1434 BOOST_CHECK(*it1 == 10);
1435 BOOST_CHECK(cb1.full());
1436 BOOST_CHECK(cb2[1] == 5);
1437 BOOST_CHECK(*it2 == 5);
1438 BOOST_CHECK(cb2.full());
1439 BOOST_CHECK(cb2[3] == 1);
1440 BOOST_CHECK(cb3[0] == 40);
1441 BOOST_CHECK(cb3[1] == 20);
1442 BOOST_CHECK(cb4[1] == 10);
1443 BOOST_CHECK(*it3 == 10);
1444 BOOST_CHECK(cb4.full());
1445 BOOST_CHECK(cb5[1] == 5);
1446 BOOST_CHECK(*it4 == 5);
1447 BOOST_CHECK(cb5.full());
1448 BOOST_CHECK(cb6[0] == 30);
1449 BOOST_CHECK(cb6[1] == 10);
1450 BOOST_CHECK(cb7.size() == 6);
1451 BOOST_CHECK(cb7[0] == 1);
1452 BOOST_CHECK(cb7[1] == 2);
1453 BOOST_CHECK(cb7[2] == 6);
1454 BOOST_CHECK(cb7[3] == 6);
1455 BOOST_CHECK(cb7[4] == 6);
1456 BOOST_CHECK(cb7[5] == 6);
1457
1458 generic_test(cb&: cb1);
1459 generic_test(cb&: cb2);
1460 generic_test(cb&: cb3);
1461 generic_test(cb&: cb4);
1462 generic_test(cb&: cb5);
1463 generic_test(cb&: cb6);
1464 generic_test(cb&: cb7);
1465}
1466
1467void rinsert_n_test() {
1468
1469 CB_CONTAINER<MyInteger> cb1(4);
1470 cb1.push_front(item: 1);
1471 cb1.push_front(item: 2);
1472 cb1.push_front(item: 3);
1473 cb1.rinsert(pos: cb1.begin() + 1, first: 2, last: 10);
1474 CB_CONTAINER<MyInteger> cb2(2, 3);
1475 cb2.rinsert(pos: cb2.begin(), first: 10, last: 5);
1476 CB_CONTAINER<MyInteger> cb3(4);
1477 cb3.rinsert(pos: cb3.end(), first: 1, last: 6);
1478 CB_CONTAINER<MyInteger> cb4(4);
1479 cb4.push_back(item: 1);
1480 cb4.push_back(item: 2);
1481 cb4.push_back(item: 3);
1482 cb4.rinsert(pos: cb4.begin() + 1, first: 2, last: 10);
1483 MyInteger array[] = { 5, 6, 7, 8, 9 };
1484 CB_CONTAINER<MyInteger> cb5(6);
1485 cb5.push_back(item: 1);
1486 cb5.push_back(item: 2);
1487 cb5.push_back(item: 3);
1488 cb5.push_back(item: 4);
1489 cb5.rinsert(pos: cb5.begin() + 2, first: array, last: array + 5);
1490 cb5.rinsert(pos: cb5.end(), first: array, last: array + 5);
1491
1492 BOOST_CHECK(cb1.full());
1493 BOOST_CHECK(cb1[0] == 3);
1494 BOOST_CHECK(cb1[1] == 10);
1495 BOOST_CHECK(cb1[2] == 10);
1496 BOOST_CHECK(cb1[3] == 2);
1497 BOOST_CHECK(cb2[0] == 5);
1498 BOOST_CHECK(cb2[1] == 5);
1499 BOOST_CHECK(cb3[0] == 6);
1500 BOOST_CHECK(cb3.size() == 1);
1501 BOOST_CHECK(cb4.full());
1502 BOOST_CHECK(cb4[0] == 1);
1503 BOOST_CHECK(cb4[1] == 10);
1504 BOOST_CHECK(cb4[2] == 10);
1505 BOOST_CHECK(cb4[3] == 2);
1506 BOOST_CHECK(cb5.size() == 6);
1507 BOOST_CHECK(cb5[0] == 1);
1508 BOOST_CHECK(cb5[1] == 2);
1509 BOOST_CHECK(cb5[2] == 5);
1510 BOOST_CHECK(cb5[3] == 6);
1511 BOOST_CHECK(cb5[4] == 7);
1512 BOOST_CHECK(cb5[5] == 8);
1513
1514 generic_test(cb&: cb1);
1515 generic_test(cb&: cb2);
1516 generic_test(cb&: cb3);
1517 generic_test(cb&: cb4);
1518 generic_test(cb&: cb5);
1519}
1520
1521void rinsert_range_test() {
1522
1523 vector<int> v;
1524 v.push_back(x: 11);
1525 v.push_back(x: 12);
1526 v.push_back(x: 13);
1527 v.push_back(x: 14);
1528 CB_CONTAINER<MyInteger> cb1(4);
1529 cb1.push_back(item: 1);
1530 cb1.push_back(item: 2);
1531 cb1.push_back(item: 3);
1532 cb1.rinsert(pos: cb1.begin() + 1, first: v.begin(), last: v.end());
1533 CB_CONTAINER<MyInteger> cb2(2, 2);
1534 cb2.rinsert(pos: cb2.begin(), first: v.begin(), last: v.end());
1535 CB_CONTAINER<MyInteger> cb3(5);
1536 cb3.rinsert(pos: cb3.begin(), first: v.end(), last: v.end());
1537 CB_CONTAINER<MyInteger> cb4(5);
1538 cb4.rinsert(pos: cb4.begin(), first: v.begin(), last: v.begin() + 1);
1539
1540 BOOST_CHECK(cb1.full());
1541 BOOST_CHECK(cb1[0] == 1);
1542 BOOST_CHECK(cb1[1] == 11);
1543 BOOST_CHECK(cb1[2] == 12);
1544 BOOST_CHECK(cb1[3] == 13);
1545 BOOST_CHECK(cb2[0] == 11);
1546 BOOST_CHECK(cb2[1] == 12);
1547 BOOST_CHECK(cb3.empty());
1548 BOOST_CHECK(cb4[0] == 11);
1549 BOOST_CHECK(cb4.size() == 1);
1550
1551#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
1552
1553 v.clear();
1554 v.push_back(x: 1);
1555 v.push_back(x: 2);
1556 v.push_back(x: 3);
1557 v.push_back(x: 4);
1558 v.push_back(x: 5);
1559
1560 CB_CONTAINER<int> cb10(4);
1561 cb10.push_back(item: 0);
1562 cb10.push_back(item: -1);
1563 cb10.push_back(item: -2);
1564 cb10.rinsert(pos: cb10.begin() + 1, first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1565 v.clear();
1566 v.push_back(x: 11);
1567 v.push_back(x: 12);
1568 v.push_back(x: 13);
1569 v.push_back(x: 14);
1570 CB_CONTAINER<int> cb11(4);
1571 cb11.push_back(item: 1);
1572 cb11.push_back(item: 2);
1573 cb11.push_back(item: 3);
1574 cb11.rinsert(pos: cb11.begin() + 1, first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1575 CB_CONTAINER<int> cb12(2, 2);
1576 cb12.rinsert(pos: cb12.begin(), first: MyInputIterator(v.begin()), last: MyInputIterator(v.end()));
1577 CB_CONTAINER<int> cb13(5);
1578 cb13.rinsert(pos: cb13.begin(), first: MyInputIterator(v.end()), last: MyInputIterator(v.end()));
1579 CB_CONTAINER<int> cb14(5);
1580 cb14.rinsert(pos: cb14.begin(), first: MyInputIterator(v.begin()), last: MyInputIterator(v.begin() + 1));
1581
1582 BOOST_CHECK(cb10.capacity() == 4);
1583 BOOST_CHECK(cb10[0] == 0);
1584 BOOST_CHECK(cb10[3] == 3);
1585 BOOST_CHECK(cb11.full());
1586 BOOST_CHECK(cb11[0] == 1);
1587 BOOST_CHECK(cb11[1] == 11);
1588 BOOST_CHECK(cb11[2] == 12);
1589 BOOST_CHECK(cb11[3] == 13);
1590 BOOST_CHECK(cb12[0] == 11);
1591 BOOST_CHECK(cb12[1] == 12);
1592 BOOST_CHECK(cb13.empty());
1593 BOOST_CHECK(cb14[0] == 11);
1594 BOOST_CHECK(cb14.size() == 1);
1595
1596#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
1597
1598 generic_test(cb&: cb1);
1599 generic_test(cb&: cb2);
1600 generic_test(cb&: cb3);
1601 generic_test(cb&: cb4);
1602}
1603
1604void erase_test() {
1605
1606 CB_CONTAINER<MyInteger> cb1(4);
1607 cb1.push_back(item: 1);
1608 cb1.push_back(item: 2);
1609 cb1.push_back(item: 3);
1610 CB_CONTAINER<MyInteger>::iterator it1 = cb1.erase(pos: cb1.begin() + 1);
1611
1612 CB_CONTAINER<MyInteger> cb2(1, 1);
1613 CB_CONTAINER<MyInteger>::iterator it2 = cb2.erase(pos: cb2.begin());
1614
1615 CB_CONTAINER<MyInteger> cb3(4);
1616 cb3.push_back(item: 1);
1617 cb3.push_back(item: 2);
1618 cb3.push_back(item: 3);
1619 CB_CONTAINER<MyInteger>::iterator it3 = cb3.erase(pos: cb3.begin() + 2);
1620
1621 BOOST_CHECK(cb1.size() == 2);
1622 BOOST_CHECK(cb1.capacity() == 4);
1623 BOOST_CHECK(*it1 == 3);
1624 BOOST_CHECK(cb1[0] == 1);
1625 BOOST_CHECK(cb1[1] == 3);
1626 BOOST_CHECK(cb2.size() == 0);
1627 BOOST_CHECK(cb2.capacity() == 1);
1628 BOOST_CHECK(it2 == cb2.end());
1629 BOOST_CHECK(cb3.size() == 2);
1630 BOOST_CHECK(cb3.capacity() == 4);
1631 BOOST_CHECK(it3 == cb3.end());
1632 BOOST_CHECK(cb3[0] == 1);
1633 BOOST_CHECK(cb3[1] == 2);
1634
1635 generic_test(cb&: cb1);
1636 generic_test(cb&: cb2);
1637 generic_test(cb&: cb3);
1638}
1639
1640void erase_range_test() {
1641
1642 CB_CONTAINER<MyInteger> cb1(4);
1643 cb1.push_back(item: 1);
1644 cb1.push_back(item: 2);
1645 cb1.push_back(item: 3);
1646 cb1.push_back(item: 4);
1647 CB_CONTAINER<MyInteger>::iterator it1 = cb1.erase(first: cb1.begin() + 1, last: cb1.begin() + 3);
1648
1649 CB_CONTAINER<MyInteger> cb2(4);
1650 cb2.push_back(item: 1);
1651 cb2.push_back(item: 2);
1652 cb2.push_back(item: 3);
1653 cb2.push_back(item: 4);
1654 CB_CONTAINER<MyInteger>::iterator it2 = cb2.erase(first: cb2.begin(), last: cb2.begin());
1655
1656 CB_CONTAINER<MyInteger> cb3(4);
1657 cb3.push_back(item: 1);
1658 cb3.push_back(item: 2);
1659 cb3.push_back(item: 3);
1660 cb3.push_back(item: 4);
1661 CB_CONTAINER<MyInteger>::iterator it3 = cb3.erase(first: cb3.begin() + 2, last: cb3.end());
1662
1663 CB_CONTAINER<MyInteger> cb4(10, 1);
1664 CB_CONTAINER<MyInteger>::iterator it4 = cb4.erase(first: cb4.begin(), last: cb4.end());
1665
1666 BOOST_CHECK(cb1.size() == 2);
1667 BOOST_CHECK(cb1.capacity() == 4);
1668 BOOST_CHECK(cb1[0] == 1);
1669 BOOST_CHECK(cb1[1] == 4);
1670 BOOST_CHECK(*it1 == 4);
1671 BOOST_CHECK(cb2.size() == 4);
1672 BOOST_CHECK(cb2[0] == 1);
1673 BOOST_CHECK(cb2[3] == 4);
1674 BOOST_CHECK(*it2 == 1);
1675 BOOST_CHECK(cb3.size() == 2);
1676 BOOST_CHECK(cb3.capacity() == 4);
1677 BOOST_CHECK(cb3[0] == 1);
1678 BOOST_CHECK(cb3[1] == 2);
1679 BOOST_CHECK(it3 == cb3.end());
1680 BOOST_CHECK(cb4.size() == 0);
1681 BOOST_CHECK(cb4.capacity() == 10);
1682 BOOST_CHECK(it4 == cb4.end());
1683
1684 generic_test(cb&: cb1);
1685 generic_test(cb&: cb2);
1686 generic_test(cb&: cb3);
1687 generic_test(cb&: cb4);
1688}
1689
1690void rerase_test() {
1691
1692 CB_CONTAINER<MyInteger> cb1(4);
1693 cb1.push_back(item: 1);
1694 cb1.push_back(item: 2);
1695 cb1.push_back(item: 3);
1696 CB_CONTAINER<MyInteger>::iterator it1 = cb1.rerase(pos: cb1.begin() + 1);
1697
1698 CB_CONTAINER<MyInteger> cb2(1, 1);
1699 CB_CONTAINER<MyInteger>::iterator it2 = cb2.rerase(pos: cb2.begin());
1700
1701 CB_CONTAINER<MyInteger> cb3(4);
1702 cb3.push_back(item: 1);
1703 cb3.push_back(item: 2);
1704 cb3.push_back(item: 3);
1705 CB_CONTAINER<MyInteger>::iterator it3 = cb3.rerase(pos: cb3.begin());
1706
1707 BOOST_CHECK(cb1.size() == 2);
1708 BOOST_CHECK(cb1.capacity() == 4);
1709 BOOST_CHECK(*it1 == 1);
1710 BOOST_CHECK(cb1[0] == 1);
1711 BOOST_CHECK(cb1[1] == 3);
1712 BOOST_CHECK(cb2.size() == 0);
1713 BOOST_CHECK(cb2.capacity() == 1);
1714 BOOST_CHECK(it2 == cb2.begin());
1715 BOOST_CHECK(cb3.size() == 2);
1716 BOOST_CHECK(cb3.capacity() == 4);
1717 BOOST_CHECK(it3 == cb3.begin());
1718 BOOST_CHECK(*it3 == 2);
1719 BOOST_CHECK(cb3[0] == 2);
1720 BOOST_CHECK(cb3[1] == 3);
1721
1722 generic_test(cb&: cb1);
1723 generic_test(cb&: cb2);
1724 generic_test(cb&: cb3);
1725}
1726
1727void rerase_range_test() {
1728
1729 CB_CONTAINER<MyInteger> cb1(4);
1730 cb1.push_back(item: 1);
1731 cb1.push_back(item: 2);
1732 cb1.push_back(item: 3);
1733 cb1.push_back(item: 4);
1734 CB_CONTAINER<MyInteger>::iterator it1 = cb1.rerase(first: cb1.begin() + 1, last: cb1.begin() + 3);
1735
1736 CB_CONTAINER<MyInteger> cb2(4);
1737 cb2.push_back(item: 1);
1738 cb2.push_back(item: 2);
1739 cb2.push_back(item: 3);
1740 cb2.push_back(item: 4);
1741 CB_CONTAINER<MyInteger>::iterator it2 = cb2.rerase(first: cb2.begin(), last: cb2.begin());
1742
1743 CB_CONTAINER<MyInteger> cb3(4);
1744 cb3.push_back(item: 1);
1745 cb3.push_back(item: 2);
1746 cb3.push_back(item: 3);
1747 cb3.push_back(item: 4);
1748 CB_CONTAINER<MyInteger>::iterator it3 = cb3.rerase(first: cb3.begin(), last: cb3.begin() + 2);
1749
1750 CB_CONTAINER<MyInteger> cb4(10, 1);
1751 CB_CONTAINER<MyInteger>::iterator it4 = cb4.rerase(first: cb4.begin(), last: cb4.end());
1752
1753 BOOST_CHECK(cb1.size() == 2);
1754 BOOST_CHECK(cb1.capacity() == 4);
1755 BOOST_CHECK(cb1[0] == 1);
1756 BOOST_CHECK(cb1[1] == 4);
1757 BOOST_CHECK(*it1 == 1);
1758 BOOST_CHECK(cb2.size() == 4);
1759 BOOST_CHECK(cb2[0] == 1);
1760 BOOST_CHECK(cb2[3] == 4);
1761 BOOST_CHECK(*it2 == 1);
1762 BOOST_CHECK(cb3.size() == 2);
1763 BOOST_CHECK(cb3.capacity() == 4);
1764 BOOST_CHECK(cb3[0] == 3);
1765 BOOST_CHECK(cb3[1] == 4);
1766 BOOST_CHECK(it3 == cb3.begin());
1767 BOOST_CHECK(cb4.size() == 0);
1768 BOOST_CHECK(cb4.capacity() == 10);
1769 BOOST_CHECK(it4 == cb4.begin());
1770
1771 generic_test(cb&: cb1);
1772 generic_test(cb&: cb2);
1773 generic_test(cb&: cb3);
1774 generic_test(cb&: cb4);
1775}
1776
1777void clear_test() {
1778
1779 CB_CONTAINER<MyInteger> cb(4);
1780 cb.push_back(item: 1);
1781 cb.push_back(item: 2);
1782 cb.push_back(item: 3);
1783 cb.push_back(item: 4);
1784 cb.clear();
1785
1786 BOOST_CHECK(cb.empty());
1787
1788 generic_test(cb);
1789}
1790
1791void equality_test() {
1792
1793 CB_CONTAINER<MyInteger> cb1(4);
1794 cb1.push_back(item: 1);
1795 cb1.push_back(item: 2);
1796 cb1.push_back(item: 3);
1797 cb1.push_back(item: 4);
1798 CB_CONTAINER<MyInteger> cb2(10);
1799 cb2.push_back(item: 1);
1800 cb2.push_back(item: 2);
1801 cb2.push_back(item: 3);
1802 cb2.push_back(item: 4);
1803
1804 BOOST_CHECK(cb1 == cb2);
1805 BOOST_CHECK(!(cb2 != cb1));
1806
1807 generic_test(cb&: cb1);
1808 generic_test(cb&: cb2);
1809}
1810
1811void lexicographical_comparison_test() {
1812
1813 CB_CONTAINER<char> cb1(10);
1814 cb1.push_back(item: 'a');
1815 cb1.push_back(item: 'd');
1816 cb1.push_back(item: 'a');
1817 cb1.push_back(item: 'm');
1818 CB_CONTAINER<char> cb2(5);
1819 cb2.push_back(item: 'j');
1820 cb2.push_back(item: 'o');
1821 cb2.push_back(item: 'h');
1822 cb2.push_back(item: 'n');
1823
1824 BOOST_CHECK(cb2 > cb1);
1825 BOOST_CHECK(cb1 < cb2);
1826}
1827
1828void assign_range_test() {
1829
1830 vector<int> v;
1831 v.push_back(x: 11);
1832 v.push_back(x: 12);
1833 v.push_back(x: 13);
1834 CB_CONTAINER<MyInteger> cb1(4);
1835 cb1.push_back(item: 1);
1836 cb1.push_back(item: 2);
1837 cb1.push_back(item: 3);
1838 cb1.assign(first: v.begin() + 1, last: v.end());
1839 CB_CONTAINER<MyInteger> cb2(2);
1840 cb2.push_back(item: 1);
1841 cb2.push_back(item: 2);
1842 cb2.assign(first: v.begin(), last: v.end());
1843
1844 BOOST_CHECK(cb1.capacity() == 2);
1845 BOOST_CHECK(cb1[0] == 12);
1846 BOOST_CHECK(cb1[1] == 13);
1847 BOOST_CHECK(cb2.full());
1848 BOOST_CHECK(cb2.capacity() == 3);
1849 BOOST_CHECK(cb2[0] == 11);
1850 BOOST_CHECK(cb2[1] == 12);
1851 BOOST_CHECK(cb2[2] == 13);
1852 BOOST_CHECK(cb2.size() == (size_t)distance(v.begin(), v.end()));
1853
1854 generic_test(cb&: cb1);
1855 generic_test(cb&: cb2);
1856}
1857
1858// test of the example (introduced in the documentation)
1859void example_test() {
1860
1861 CB_CONTAINER<int> cb1(3);
1862 cb1.push_back(item: 1);
1863 cb1.push_back(item: 2);
1864
1865 BOOST_CHECK(cb1[0] == 1);
1866 BOOST_CHECK(cb1[1] == 2);
1867 BOOST_CHECK(!cb1.full());
1868 BOOST_CHECK(cb1.size() == 2);
1869 BOOST_CHECK(cb1.capacity() == 3);
1870
1871 cb1.push_back(item: 3);
1872 cb1.push_back(item: 4);
1873 int sum = accumulate(first: cb1.begin(), last: cb1.end(), init: 0);
1874
1875 BOOST_CHECK(cb1[0] == 2);
1876 BOOST_CHECK(cb1[1] == 3);
1877 BOOST_CHECK(cb1[2] == 4);
1878 BOOST_CHECK(*cb1.begin() == 2);
1879 BOOST_CHECK(cb1.front() == 2);
1880 BOOST_CHECK(cb1.back() == 4);
1881 BOOST_CHECK(sum == 9);
1882 BOOST_CHECK(cb1.full());
1883 BOOST_CHECK(cb1.size() == 3);
1884 BOOST_CHECK(cb1.capacity() == 3);
1885
1886 CB_CONTAINER<int> cb2(5, 1);
1887 cb2.insert(pos: cb2.begin(), item: 2);
1888
1889 BOOST_CHECK(cb2[0] == 1);
1890 BOOST_CHECK(cb2[1] == 1);
1891 BOOST_CHECK(cb2[2] == 1);
1892 BOOST_CHECK(cb2[3] == 1);
1893 BOOST_CHECK(cb2[4] == 1);
1894
1895 vector<int> v;
1896 v.push_back(x: 100);
1897 v.push_back(x: 200);
1898 v.push_back(x: 300);
1899 cb2.insert(pos: cb2.begin() + 1, first: v.begin(), last: v.end());
1900
1901 BOOST_CHECK(cb2[0] == 300);
1902 BOOST_CHECK(cb2[1] == 1);
1903 BOOST_CHECK(cb2[2] == 1);
1904 BOOST_CHECK(cb2[3] == 1);
1905 BOOST_CHECK(cb2[4] == 1);
1906
1907 CB_CONTAINER<int> cb3(3);
1908 cb3.push_back(item: 1);
1909 cb3.push_back(item: 2);
1910 cb3.push_back(item: 3);
1911
1912 BOOST_CHECK(cb3[0] == 1);
1913 BOOST_CHECK(cb3[1] == 2);
1914 BOOST_CHECK(cb3[2] == 3);
1915
1916 cb3.push_back(item: 4);
1917 cb3.push_back(item: 5);
1918
1919 BOOST_CHECK(cb3[0] == 3);
1920 BOOST_CHECK(cb3[1] == 4);
1921 BOOST_CHECK(cb3[2] == 5);
1922
1923 cb3.pop_back();
1924 cb3.pop_front();
1925
1926 BOOST_CHECK(cb3[0] == 4);
1927}
1928
1929void element_destruction_test() {
1930
1931 CB_CONTAINER<InstanceCounter> cb(5);
1932 cb.push_back(item: InstanceCounter());
1933 cb.push_back(item: InstanceCounter());
1934 cb.push_back(item: InstanceCounter());
1935 int prevCount = InstanceCounter::count();
1936 cb.clear();
1937
1938 BOOST_CHECK(cb.empty());
1939 BOOST_CHECK(prevCount == 3);
1940 BOOST_CHECK(InstanceCounter::count() == 0);
1941}
1942
1943void const_methods_test() {
1944
1945 vector<int> v;
1946 v.push_back(x: 1);
1947 v.push_back(x: 2);
1948 v.push_back(x: 3);
1949 v.push_back(x: 4);
1950 v.push_back(x: 5);
1951 const CB_CONTAINER<MyInteger> cb(5, v.begin(), v.end());
1952
1953 BOOST_CHECK(*cb.begin() == 1);
1954 BOOST_CHECK(*(cb.end() - 1) == 5);
1955 BOOST_CHECK(*cb.rbegin() == 5);
1956 BOOST_CHECK(*(cb.rend() - 1) == 1);
1957 BOOST_CHECK(cb[0] == 1);
1958 BOOST_CHECK(cb.at(1) == 2);
1959 BOOST_CHECK(cb.front() == 1);
1960 BOOST_CHECK(cb.back() == 5);
1961}
1962
1963void rotate_test() {
1964
1965 CB_CONTAINER<MyInteger> cb1(10);
1966 cb1.push_back(item: 1);
1967 cb1.push_back(item: 2);
1968 cb1.push_back(item: 3);
1969 cb1.push_back(item: 4);
1970 cb1.push_back(item: 5);
1971 cb1.push_back(item: 6);
1972 cb1.push_back(item: 7);
1973 CB_CONTAINER<MyInteger> cb2 = cb1;
1974 CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 2;
1975 int v1_0 = *it1;
1976 int v1_1 = *(it1 + 1);
1977 int v1_2 = *(it1 + 2);
1978 int v1_3 = *(it1 + 3);
1979 int v1_4 = *(it1 + 4);
1980 int v1_r1 = *(it1 - 1);
1981 int v1_r2 = *(it1 - 2);
1982 cb1.rotate(new_begin: it1);
1983 rotate(first: cb2.begin(), middle: cb2.begin() + 2, last: cb2.end());
1984
1985 CB_CONTAINER<MyInteger> cb3(7);
1986 cb3.push_back(item: 1);
1987 cb3.push_back(item: 2);
1988 cb3.push_back(item: 3);
1989 cb3.push_back(item: 4);
1990 cb3.push_back(item: 5);
1991 cb3.push_back(item: 6);
1992 cb3.push_back(item: 7);
1993 cb3.push_back(item: 8);
1994 cb3.push_back(item: 9);
1995 CB_CONTAINER<MyInteger> cb4 = cb3;
1996 CB_CONTAINER<MyInteger>::iterator it2 = cb3.begin() + 1;
1997 int v2_0 = *it2;
1998 int v2_1 = *(it2 + 1);
1999 int v2_2 = *(it2 + 2);
2000 int v2_3 = *(it2 + 3);
2001 int v2_4 = *(it2 + 4);
2002 int v2_5 = *(it2 + 5);
2003 int v2_r1 = *(it2 - 1);
2004 cb3.rotate(new_begin: it2);
2005 rotate(first: cb4.begin(), middle: cb4.begin() + 1, last: cb4.end());
2006
2007 CB_CONTAINER<MyInteger> cb5(10);
2008 cb5.push_back(item: 1);
2009 cb5.push_back(item: 2);
2010 cb5.push_back(item: 3);
2011 cb5.push_back(item: 4);
2012 cb5.push_back(item: 5);
2013 cb5.push_back(item: 6);
2014 cb5.push_back(item: 7);
2015 CB_CONTAINER<MyInteger> cb6 = cb5;
2016 CB_CONTAINER<MyInteger>::iterator it3 = cb5.begin() + 5;
2017 int v3_0 = *it3;
2018 int v3_1 = *(it3 + 1);
2019 int v3_r1 = *(it3 - 1);
2020 int v3_r2 = *(it3 - 2);
2021 int v3_r3 = *(it3 - 3);
2022 int v3_r4 = *(it3 - 4);
2023 int v3_r5 = *(it3 - 5);
2024 cb5.rotate(new_begin: it3);
2025 rotate(first: cb6.begin(), middle: cb6.begin() + 5, last: cb6.end());
2026
2027 BOOST_CHECK(!cb1.full());
2028 BOOST_CHECK(cb1 == cb2);
2029 BOOST_CHECK(v1_0 == *it1);
2030 BOOST_CHECK(v1_1 == *(it1 + 1));
2031 BOOST_CHECK(v1_2 == *(it1 + 2));
2032 BOOST_CHECK(v1_3 == *(it1 + 3));
2033 BOOST_CHECK(v1_4 == *(it1 + 4));
2034 BOOST_CHECK(v1_r1 == *(it1 + 6));
2035 BOOST_CHECK(v1_r2 == *(it1 + 5));
2036 BOOST_CHECK(cb1.begin() == it1);
2037 BOOST_CHECK(v1_0 == cb1[0]);
2038 BOOST_CHECK(v1_1 == cb1[1]);
2039 BOOST_CHECK(v1_2 == cb1[2]);
2040 BOOST_CHECK(v1_3 == cb1[3]);
2041 BOOST_CHECK(v1_4 == cb1[4]);
2042 BOOST_CHECK(v1_r1 == cb1[6]);
2043 BOOST_CHECK(v1_r2 == cb1[5]);
2044 BOOST_CHECK(cb3.full());
2045 BOOST_CHECK(cb3 == cb4);
2046 BOOST_CHECK(v2_0 == *it2);
2047 BOOST_CHECK(v2_1 == *(it2 + 1));
2048 BOOST_CHECK(v2_2 == *(it2 + 2));
2049 BOOST_CHECK(v2_3 == *(it2 + 3));
2050 BOOST_CHECK(v2_4 == *(it2 + 4));
2051 BOOST_CHECK(v2_5 == *(it2 + 5));
2052 BOOST_CHECK(v2_r1 == *(it2 + 6));
2053 BOOST_CHECK(cb3.begin() == it2);
2054 BOOST_CHECK(v2_0 == cb3[0]);
2055 BOOST_CHECK(v2_1 == cb3[1]);
2056 BOOST_CHECK(v2_2 == cb3[2]);
2057 BOOST_CHECK(v2_3 == cb3[3]);
2058 BOOST_CHECK(v2_4 == cb3[4]);
2059 BOOST_CHECK(v2_5 == cb3[5]);
2060 BOOST_CHECK(v2_r1 == cb3[6]);
2061 BOOST_CHECK(!cb5.full());
2062 BOOST_CHECK(cb5 == cb6);
2063 BOOST_CHECK(v3_0 == cb5[0]);
2064 BOOST_CHECK(v3_1 == cb5[1]);
2065 BOOST_CHECK(v3_r1 == cb5[6]);
2066 BOOST_CHECK(v3_r2 == cb5[5]);
2067 BOOST_CHECK(v3_r3 == cb5[4]);
2068 BOOST_CHECK(v3_r4 == cb5[3]);
2069 BOOST_CHECK(v3_r5 == cb5[2]);
2070
2071 generic_test(cb&: cb1);
2072 generic_test(cb&: cb2);
2073 generic_test(cb&: cb3);
2074 generic_test(cb&: cb4);
2075 generic_test(cb&: cb5);
2076 generic_test(cb&: cb6);
2077}
2078
2079int MyInteger::ms_exception_trigger = 0;
2080int InstanceCounter::ms_count = 0;
2081
2082void move_container_on_cpp11() {
2083#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
2084 CB_CONTAINER<MyInteger> cb1(10);
2085 cb1.push_back(item: 1);
2086 cb1.push_back(item: 2);
2087 cb1.push_back(item: 3);
2088 cb1.push_back(item: 4);
2089 cb1.push_back(item: 5);
2090 cb1.push_back(item: 6);
2091
2092 // Checking move constructor
2093 CB_CONTAINER<MyInteger> cb2(static_cast<CB_CONTAINER<MyInteger>&& >(cb1));
2094 CB_CONTAINER<MyInteger>::iterator it2 = cb2.begin() + 1;
2095
2096 BOOST_CHECK(cb1.empty());
2097 BOOST_CHECK(!cb2.empty());
2098 BOOST_CHECK(it2[0] == 2);
2099 BOOST_CHECK(it2[-1] == 1);
2100 BOOST_CHECK(it2[2] == 4);
2101
2102 // Checking move assignment
2103 cb1 = static_cast<CB_CONTAINER<MyInteger>&& >(cb2);
2104 CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 1;
2105
2106 BOOST_CHECK(!cb1.empty());
2107 BOOST_CHECK(cb2.empty());
2108 BOOST_CHECK(it1[0] == 2);
2109 BOOST_CHECK(it1[-1] == 1);
2110 BOOST_CHECK(it1[2] == 4);
2111#endif
2112}
2113
2114
2115struct noncopyable_movable_except_t
2116{
2117private:
2118 BOOST_MOVABLE_BUT_NOT_COPYABLE(noncopyable_movable_except_t)
2119 bool is_moved_;
2120 int value_;
2121public:
2122 static int next_value;
2123
2124 explicit noncopyable_movable_except_t()
2125 : is_moved_(false)
2126 , value_(next_value ++)
2127 {}
2128
2129 noncopyable_movable_except_t(BOOST_RV_REF(noncopyable_movable_except_t) x) {
2130 is_moved_ = x.is_moved_;
2131 value_ = x.value_;
2132 x.is_moved_ = true;
2133 }
2134
2135 noncopyable_movable_except_t& operator=(BOOST_RV_REF(noncopyable_movable_except_t) x) {
2136 is_moved_ = x.is_moved_;
2137 value_ = x.value_;
2138 x.is_moved_ = true;
2139 return *this;
2140 }
2141
2142 bool is_moved() const {
2143 return is_moved_;
2144 }
2145
2146 int value() const {
2147 return value_;
2148 }
2149
2150 void reinit() { is_moved_ = false; value_ = next_value ++; }
2151};
2152
2153struct noncopyable_movable_noexcept_t
2154{
2155private:
2156 BOOST_MOVABLE_BUT_NOT_COPYABLE(noncopyable_movable_noexcept_t)
2157 bool is_moved_;
2158 int value_;
2159public:
2160 static int next_value;
2161
2162 explicit noncopyable_movable_noexcept_t()
2163 : is_moved_(false)
2164 , value_(next_value ++)
2165 {}
2166
2167 noncopyable_movable_noexcept_t(BOOST_RV_REF(noncopyable_movable_noexcept_t) x) BOOST_NOEXCEPT {
2168 is_moved_ = x.is_moved_;
2169 value_ = x.value_;
2170 x.is_moved_ = true;
2171 }
2172
2173 noncopyable_movable_noexcept_t& operator=(BOOST_RV_REF(noncopyable_movable_noexcept_t) x) BOOST_NOEXCEPT {
2174 is_moved_ = x.is_moved_;
2175 value_ = x.value_;
2176 x.is_moved_ = true;
2177 return *this;
2178 }
2179
2180 bool is_moved() const {
2181 return is_moved_;
2182 }
2183
2184 int value() const {
2185 return value_;
2186 }
2187
2188 void reinit() { is_moved_ = false; value_ = next_value ++; }
2189};
2190
2191#ifdef BOOST_NO_CXX11_NOEXCEPT
2192namespace boost {
2193 template <>
2194 struct is_nothrow_move_constructible<noncopyable_movable_noexcept_t>
2195 : boost::true_type
2196 {};
2197}
2198#endif
2199
2200int noncopyable_movable_noexcept_t::next_value = 1;
2201int noncopyable_movable_except_t::next_value = 1;
2202
2203template <class T>
2204void move_container_values_impl() {
2205 typedef T noncopyable_movable_test_t;
2206 noncopyable_movable_test_t::next_value = 1;
2207
2208 CB_CONTAINER<noncopyable_movable_test_t> cb1(40);
2209 noncopyable_movable_test_t var;
2210 cb1.push_back(boost::move(var));
2211 BOOST_CHECK(!cb1.back().is_moved());
2212 BOOST_CHECK(cb1.back().value() == 1);
2213 BOOST_CHECK(var.is_moved());
2214 BOOST_CHECK(cb1.size() == 1);
2215
2216 var.reinit();
2217 cb1.push_front(boost::move(var));
2218 BOOST_CHECK(!cb1.front().is_moved());
2219 BOOST_CHECK(cb1.front().value() == 2);
2220 BOOST_CHECK(var.is_moved());
2221 BOOST_CHECK(cb1.size() == 2);
2222
2223 cb1.push_back();
2224 BOOST_CHECK(!cb1.back().is_moved());
2225 BOOST_CHECK(cb1.back().value() == 3);
2226 BOOST_CHECK(cb1.size() == 3);
2227
2228 cb1.push_front();
2229 BOOST_CHECK(!cb1.front().is_moved());
2230 BOOST_CHECK(cb1.front().value() == 4);
2231 BOOST_CHECK(cb1.size() == 4);
2232
2233 cb1.insert(cb1.begin());
2234 BOOST_CHECK(!cb1.front().is_moved());
2235 BOOST_CHECK(cb1.front().value() == 5);
2236 BOOST_CHECK(cb1.size() == 5);
2237
2238 var.reinit();
2239 cb1.insert(cb1.begin(), boost::move(var));
2240 BOOST_CHECK(!cb1.front().is_moved());
2241 BOOST_CHECK(cb1.front().value() == 6);
2242 BOOST_CHECK(cb1.size() == 6);
2243
2244 cb1.rinsert(cb1.begin());
2245 BOOST_CHECK(!cb1.front().is_moved());
2246 BOOST_CHECK(cb1.front().value() == 7);
2247 BOOST_CHECK(cb1.size() == 7);
2248
2249 var.reinit();
2250 cb1.rinsert(cb1.begin(), boost::move(var));
2251 BOOST_CHECK(!cb1.front().is_moved());
2252 BOOST_CHECK(cb1.front().value() == 8);
2253 BOOST_CHECK(cb1.size() == 8);
2254
2255
2256 BOOST_CHECK(cb1[0].value() == 8);
2257 BOOST_CHECK(cb1[1].value() == 7);
2258 BOOST_CHECK(cb1[2].value() == 6);
2259 BOOST_CHECK(cb1[3].value() == 5);
2260 BOOST_CHECK(cb1[4].value() == 4);
2261 BOOST_CHECK(cb1[5].value() == 2);
2262 BOOST_CHECK(cb1[6].value() == 1);
2263 BOOST_CHECK(cb1[7].value() == 3);
2264 cb1.rotate(cb1.begin() + 2);
2265 BOOST_CHECK(cb1[0].value() == 6);
2266 BOOST_CHECK(cb1[1].value() == 5);
2267 BOOST_CHECK(cb1[2].value() == 4);
2268 BOOST_CHECK(cb1[3].value() == 2);
2269 BOOST_CHECK(cb1[4].value() == 1);
2270 BOOST_CHECK(cb1[5].value() == 3);
2271 BOOST_CHECK(cb1[6].value() == 8);
2272 BOOST_CHECK(cb1[7].value() == 7);
2273
2274 BOOST_CHECK(!cb1[0].is_moved());
2275 BOOST_CHECK(!cb1[1].is_moved());
2276 BOOST_CHECK(!cb1[2].is_moved());
2277 BOOST_CHECK(!cb1[3].is_moved());
2278 BOOST_CHECK(!cb1[4].is_moved());
2279 BOOST_CHECK(!cb1[5].is_moved());
2280 BOOST_CHECK(!cb1[6].is_moved());
2281 BOOST_CHECK(!cb1[7].is_moved());
2282
2283 cb1.linearize();
2284 BOOST_CHECK(!cb1[0].is_moved());
2285 BOOST_CHECK(!cb1[1].is_moved());
2286 BOOST_CHECK(!cb1[2].is_moved());
2287 BOOST_CHECK(!cb1[3].is_moved());
2288 BOOST_CHECK(!cb1[4].is_moved());
2289 BOOST_CHECK(!cb1[5].is_moved());
2290 BOOST_CHECK(!cb1[6].is_moved());
2291 BOOST_CHECK(!cb1[7].is_moved());
2292 BOOST_CHECK(cb1[0].value() == 6);
2293 BOOST_CHECK(cb1[1].value() == 5);
2294 BOOST_CHECK(cb1[2].value() == 4);
2295 BOOST_CHECK(cb1[3].value() == 2);
2296 BOOST_CHECK(cb1[4].value() == 1);
2297 BOOST_CHECK(cb1[5].value() == 3);
2298 BOOST_CHECK(cb1[6].value() == 8);
2299 BOOST_CHECK(cb1[7].value() == 7);
2300
2301 cb1.erase(cb1.begin());
2302 BOOST_CHECK(!cb1[0].is_moved());
2303 BOOST_CHECK(!cb1[1].is_moved());
2304 BOOST_CHECK(!cb1[2].is_moved());
2305 BOOST_CHECK(!cb1[3].is_moved());
2306 BOOST_CHECK(!cb1[4].is_moved());
2307 BOOST_CHECK(!cb1[5].is_moved());
2308 BOOST_CHECK(!cb1[6].is_moved());
2309 BOOST_CHECK(cb1[0].value() == 5);
2310 BOOST_CHECK(cb1[1].value() == 4);
2311 BOOST_CHECK(cb1[2].value() == 2);
2312 BOOST_CHECK(cb1[3].value() == 1);
2313 BOOST_CHECK(cb1[4].value() == 3);
2314 BOOST_CHECK(cb1[5].value() == 8);
2315 BOOST_CHECK(cb1[6].value() == 7);
2316
2317 cb1.rerase(cb1.begin());
2318 BOOST_CHECK(!cb1[0].is_moved());
2319 BOOST_CHECK(!cb1[1].is_moved());
2320 BOOST_CHECK(!cb1[2].is_moved());
2321 BOOST_CHECK(!cb1[3].is_moved());
2322 BOOST_CHECK(!cb1[4].is_moved());
2323 BOOST_CHECK(!cb1[5].is_moved());
2324 BOOST_CHECK(cb1[0].value() == 4);
2325 BOOST_CHECK(cb1[1].value() == 2);
2326 BOOST_CHECK(cb1[2].value() == 1);
2327 BOOST_CHECK(cb1[3].value() == 3);
2328 BOOST_CHECK(cb1[4].value() == 8);
2329 BOOST_CHECK(cb1[5].value() == 7);
2330
2331 cb1.erase(cb1.begin(), cb1.begin() + 1);
2332 BOOST_CHECK(!cb1[0].is_moved());
2333 BOOST_CHECK(!cb1[1].is_moved());
2334 BOOST_CHECK(!cb1[2].is_moved());
2335 BOOST_CHECK(!cb1[3].is_moved());
2336 BOOST_CHECK(!cb1[4].is_moved());
2337 BOOST_CHECK(cb1[0].value() == 2);
2338 BOOST_CHECK(cb1[1].value() == 1);
2339 BOOST_CHECK(cb1[2].value() == 3);
2340 BOOST_CHECK(cb1[3].value() == 8);
2341 BOOST_CHECK(cb1[4].value() == 7);
2342
2343 cb1.rerase(cb1.begin(), cb1.begin() + 1);
2344 BOOST_CHECK(!cb1[0].is_moved());
2345 BOOST_CHECK(!cb1[1].is_moved());
2346 BOOST_CHECK(!cb1[2].is_moved());
2347 BOOST_CHECK(!cb1[3].is_moved());
2348 BOOST_CHECK(cb1[0].value() == 1);
2349 BOOST_CHECK(cb1[1].value() == 3);
2350 BOOST_CHECK(cb1[2].value() == 8);
2351 BOOST_CHECK(cb1[3].value() == 7);
2352}
2353
2354void move_container_values_noexcept() {
2355 move_container_values_impl<noncopyable_movable_noexcept_t>();
2356
2357 typedef noncopyable_movable_noexcept_t noncopyable_movable_test_t;
2358 noncopyable_movable_test_t::next_value = 1;
2359 CB_CONTAINER<noncopyable_movable_test_t> cb1(40);
2360 cb1.push_back();
2361 cb1.push_back();
2362 cb1.push_back();
2363 cb1.push_back();
2364 cb1.push_back();
2365 cb1.push_back();
2366 cb1.push_back();
2367 cb1.push_back();
2368
2369 cb1.set_capacity(100);
2370 BOOST_CHECK(!cb1[0].is_moved());
2371 BOOST_CHECK(!cb1[1].is_moved());
2372 BOOST_CHECK(!cb1[2].is_moved());
2373 BOOST_CHECK(!cb1[3].is_moved());
2374 BOOST_CHECK(!cb1[4].is_moved());
2375 BOOST_CHECK(!cb1[5].is_moved());
2376 BOOST_CHECK(!cb1[6].is_moved());
2377 BOOST_CHECK(!cb1[7].is_moved());
2378 BOOST_CHECK(cb1[0].value() == 1);
2379 BOOST_CHECK(cb1[1].value() == 2);
2380 BOOST_CHECK(cb1[2].value() == 3);
2381 BOOST_CHECK(cb1[3].value() == 4);
2382 BOOST_CHECK(cb1[4].value() == 5);
2383 BOOST_CHECK(cb1[5].value() == 6);
2384 BOOST_CHECK(cb1[6].value() == 7);
2385 BOOST_CHECK(cb1[7].value() == 8);
2386
2387 cb1.rset_capacity(new_capacity: 101);
2388 BOOST_CHECK(!cb1[0].is_moved());
2389 BOOST_CHECK(!cb1[1].is_moved());
2390 BOOST_CHECK(!cb1[2].is_moved());
2391 BOOST_CHECK(!cb1[3].is_moved());
2392 BOOST_CHECK(!cb1[4].is_moved());
2393 BOOST_CHECK(!cb1[5].is_moved());
2394 BOOST_CHECK(!cb1[6].is_moved());
2395 BOOST_CHECK(!cb1[7].is_moved());
2396 BOOST_CHECK(cb1[0].value() == 1);
2397 BOOST_CHECK(cb1[1].value() == 2);
2398 BOOST_CHECK(cb1[2].value() == 3);
2399 BOOST_CHECK(cb1[3].value() == 4);
2400 BOOST_CHECK(cb1[4].value() == 5);
2401 BOOST_CHECK(cb1[5].value() == 6);
2402 BOOST_CHECK(cb1[6].value() == 7);
2403 BOOST_CHECK(cb1[7].value() == 8);
2404
2405 cb1.set_capacity(2);
2406 BOOST_CHECK(!cb1[0].is_moved());
2407 BOOST_CHECK(!cb1[1].is_moved());
2408 BOOST_CHECK(cb1[0].value() == 1);
2409 BOOST_CHECK(cb1[1].value() == 2);
2410
2411 cb1.rset_capacity(new_capacity: 1);
2412 BOOST_CHECK(!cb1[0].is_moved());
2413 BOOST_CHECK(cb1[0].value() == 2);
2414}
2415
2416void check_containers_exception_specifications() {
2417#ifndef BOOST_NO_CXX11_NOEXCEPT
2418#ifndef BOOST_CLANG
2419 // Clang has an error in __has_nothrow_constructor implementation:
2420 // http://llvm.org/bugs/show_bug.cgi?id=16627
2421 BOOST_CHECK(boost::has_nothrow_constructor<CB_CONTAINER<int> >::value);
2422#endif
2423
2424#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
2425 BOOST_CHECK(boost::is_nothrow_move_assignable<CB_CONTAINER<int> >::value);
2426 BOOST_CHECK(boost::is_nothrow_move_constructible<CB_CONTAINER<int> >::value);
2427#endif
2428#endif // BOOST_NO_CXX11_NOEXCEPT
2429}
2430
2431// add common tests into a test suite
2432void add_common_tests(test_suite* tests) {
2433 tests->add(BOOST_TEST_CASE(&basic_test));
2434 tests->add(BOOST_TEST_CASE(&constructor_and_element_access_test));
2435 tests->add(BOOST_TEST_CASE(&size_test));
2436 tests->add(BOOST_TEST_CASE(&allocator_test));
2437 tests->add(BOOST_TEST_CASE(&begin_and_end_test));
2438 tests->add(BOOST_TEST_CASE(&rbegin_and_rend_test));
2439 tests->add(BOOST_TEST_CASE(&element_access_and_insert_test));
2440 tests->add(BOOST_TEST_CASE(&at_test));
2441 tests->add(BOOST_TEST_CASE(&front_and_back_test));
2442 tests->add(BOOST_TEST_CASE(&linearize_test));
2443 tests->add(BOOST_TEST_CASE(&array_range_test));
2444 tests->add(BOOST_TEST_CASE(&capacity_and_reserve_test));
2445 tests->add(BOOST_TEST_CASE(&full_and_empty_test));
2446 tests->add(BOOST_TEST_CASE(&set_capacity_test));
2447 tests->add(BOOST_TEST_CASE(&rset_capacity_test));
2448 tests->add(BOOST_TEST_CASE(&resize_test));
2449 tests->add(BOOST_TEST_CASE(&rresize_test));
2450 tests->add(BOOST_TEST_CASE(&constructor_test));
2451 tests->add(BOOST_TEST_CASE(&assign_test));
2452 tests->add(BOOST_TEST_CASE(&copy_constructor_and_assign_test));
2453 tests->add(BOOST_TEST_CASE(&swap_test));
2454 tests->add(BOOST_TEST_CASE(&push_back_test));
2455 tests->add(BOOST_TEST_CASE(&pop_back_test));
2456 tests->add(BOOST_TEST_CASE(&insert_test));
2457 tests->add(BOOST_TEST_CASE(&insert_n_test));
2458 tests->add(BOOST_TEST_CASE(&insert_range_test));
2459 tests->add(BOOST_TEST_CASE(&push_front_test));
2460 tests->add(BOOST_TEST_CASE(&pop_front_test));
2461 tests->add(BOOST_TEST_CASE(&rinsert_test));
2462 tests->add(BOOST_TEST_CASE(&rinsert_n_test));
2463 tests->add(BOOST_TEST_CASE(&rinsert_range_test));
2464 tests->add(BOOST_TEST_CASE(&erase_test));
2465 tests->add(BOOST_TEST_CASE(&erase_range_test));
2466 tests->add(BOOST_TEST_CASE(&rerase_test));
2467 tests->add(BOOST_TEST_CASE(&rerase_range_test));
2468 tests->add(BOOST_TEST_CASE(&clear_test));
2469 tests->add(BOOST_TEST_CASE(&equality_test));
2470 tests->add(BOOST_TEST_CASE(&lexicographical_comparison_test));
2471 tests->add(BOOST_TEST_CASE(&assign_range_test));
2472 tests->add(BOOST_TEST_CASE(&example_test));
2473 tests->add(BOOST_TEST_CASE(&element_destruction_test));
2474 tests->add(BOOST_TEST_CASE(&const_methods_test));
2475 tests->add(BOOST_TEST_CASE(&rotate_test));
2476 tests->add(BOOST_TEST_CASE(&move_container_on_cpp11));
2477 tests->add(BOOST_TEST_CASE(&move_container_values_noexcept));
2478 tests->add(BOOST_TEST_CASE(&check_containers_exception_specifications));
2479#if !defined(BOOST_NO_CXX11_ALLOCATOR)
2480 tests->add(BOOST_TEST_CASE(&cxx11_allocator_test));
2481#endif
2482}
2483
2484

source code of boost/libs/circular_buffer/test/common.ipp