Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
deque.cc
Go to the documentation of this file.
1
43
44
45template <class _TypeT, class _Allocator>
46deque<_TypeT, _Allocator>&
47deque<_TypeT, _Allocator>::
48operator= (const deque &__rhs)
49{
50 _RWSTD_ASSERT (_C_is_valid ());
51 _RWSTD_ASSERT (__rhs._C_is_valid ());
52
53 const size_type __size = size ();
54
55 if (__size < __rhs.size ()) {
56 const const_iterator __mid = __rhs.begin () + __size;
57
58 _STD::copy (__mid, __rhs.end (),
59 _STD::inserter (*this, _STD::copy (__rhs.begin (), __mid,
60 begin ())));
61 }
62 else
63 erase (_STD::copy (__rhs.begin (), __rhs.end (), begin ()), end ());
64
65 return *this;
66}
67
68
69template <class _TypeT, class _Allocator>
70typename deque<_TypeT, _Allocator>::iterator
71deque<_TypeT, _Allocator>::
72insert (iterator __it, const_reference __x)
73{
74 _RWSTD_ASSERT_RANGE (begin (), __it);
75 _RWSTD_ASSERT (_C_is_valid ());
76
77 if (__it == begin ()) {
78 push_front (__x);
79 return begin ();
80 }
81
82 if (__it == end ()) {
83 push_back (__x);
84 __it = end () - 1;
85 return __it;
86 }
87
88 const size_type __inx = _DISTANCE (begin (), __it, size_type);
89
90 _RWSTD_ASSERT (__inx < size ());
91
92 if (__inx < size () - __inx) {
93 push_front (front ());
94 _STD::copy (begin () + 2, begin () + (__inx + 1), begin () + 1);
95 }
96 else {
97 push_back (back ());
98
99 _STD::copy_backward (begin () + __inx, end () - 2, end () - 1);
100 }
101
102 __it = begin () + __inx;
103
104 *__it = __x;
105
106 return __it;
107}
108
109
110template <class _TypeT, class _Allocator>
111typename deque<_TypeT, _Allocator>::iterator
112deque<_TypeT, _Allocator>::
113erase (iterator __it)
114{
115 // `it' must be a dereferenceable iterator into `*this'
116
117 _RWSTD_ASSERT_RANGE (begin (), __it);
118 _RWSTD_ASSERT (!(__it == end ()));
119 _RWSTD_ASSERT (_C_is_valid (0 /* valid and non-empty */));
120
121 const iterator __next = ++iterator (__it);
122
123 if (__it - begin () < end () - __it) {
124
125 _STD::copy_backward (begin (), __it, __next);
126
127 pop_front ();
128
129 return empty () ? end () : __next;
130 }
131
132 _STD::copy (__next, end (), __it);
133
134 pop_back ();
135
136 return __it;
137}
138
139
140template <class _TypeT, class _Allocator>
141typename deque<_TypeT, _Allocator>::iterator
142deque<_TypeT, _Allocator>::
143erase (iterator __first, iterator __last)
144{
145 // (`first', `last'] must be a valid range into `*this'
146
147 _RWSTD_ASSERT_RANGE (__first, __last);
148 _RWSTD_ASSERT_RANGE (begin (), __first);
149 _RWSTD_ASSERT (_C_is_valid ());
150
151 size_type __n = _DISTANCE (__first, __last, size_type);
152
153 _RWSTD_ASSERT (__n <= size ());
154
155 if (__first - begin () < end () - __last) {
156
157 _STD::copy_backward (begin (), __first, __last);
158
159 while (__n-- != 0)
160 pop_front ();
161
162 return __last;
163 }
164
165 _STD::copy (__last, end (), __first);
166
167 while (__n-- != 0)
168 pop_back ();
169
170 return __first;
171}
172
173
174template <class _TypeT, class _Allocator>
175void deque<_TypeT, _Allocator>::
176swap (deque<_TypeT, _Allocator> &__rhs)
177{
178 _RWSTD_ASSERT (_C_is_valid ());
179 _RWSTD_ASSERT (__rhs._C_is_valid ());
180
181 if (get_allocator () == __rhs.get_allocator ()) {
182
183 _STD::swap (_C_beg, __rhs._C_beg);
184 _STD::swap (_C_end, __rhs._C_end);
185 _STD::swap (_C_nodes, __rhs._C_nodes);
186 _STD::swap (_C_node_size, __rhs._C_node_size);
187
188 if (pointer() == _C_beg._C_cur) {
189 _RWSTD_ASSERT (pointer() == _C_end._C_cur);
190 _RWSTD_ASSERT ( _C_beg._C_node == &__rhs._C_end._C_cur
191 && _C_end._C_node == &__rhs._C_end._C_cur);
192
193 _C_beg._C_node =
194 _C_end._C_node = &_C_end._C_cur;
195 }
196 else {
197 _RWSTD_ASSERT (pointer() != _C_end._C_cur);
198 }
199
200 if (pointer() == __rhs._C_beg._C_cur) {
201 _RWSTD_ASSERT (pointer() == __rhs._C_end._C_cur);
202 _RWSTD_ASSERT ( __rhs._C_beg._C_node == &_C_end._C_cur
203 && __rhs._C_end._C_node == &_C_end._C_cur);
204
205 __rhs._C_beg._C_node =
206 __rhs._C_end._C_node = &__rhs._C_end._C_cur;
207 }
208 else {
209 _RWSTD_ASSERT (pointer() != __rhs._C_end._C_cur);
210 }
211 }
212 else {
213 deque __tmp (*this);
214 *this = __rhs;
215 __rhs = __tmp;
216 }
217}
218
219
220template <class _TypeT, class _Allocator>
221void deque<_TypeT, _Allocator>::
222_C_push (bool __at_back, const_reference __x)
223{
224 _RWSTD_ASSERT (_C_is_valid ());
225
226 const size_type __bufsize = _C_bufsize ();
227
228 _C_value_alloc_type __alloc (*this);
229
230 // allocate a new buffer to store elements in
231 const pointer __buf = __alloc.allocate (__bufsize, pointer ());
232
233 const bool __empty = empty ();
234
235 if ( __empty
236 || (__at_back && _C_end._C_node == _C_nodes + _C_node_size - 1)
237 || (!__at_back && _C_beg._C_node == _C_nodes)) {
238
239 _C_node_alloc_type __node_alloc (*this);
240
241 _RWSTD_ASSERT (_C_beg._C_node <= _C_end._C_node);
242
243 // compute the current number of used nodes
244 // and the new number of nodes
245
246 const _C_node_pointer __end = _C_end._C_node + !__empty;
247
248 const size_type __nodes = size_type (__end - _C_beg._C_node);
249
250 // obtain the next greater number of nodes for the new vector
251 const size_type __nvecsize = _C_vecsize (__nodes);
252
253 _RWSTD_ASSERT (__nvecsize > __nodes);
254
255 // compute the beginning of the old (current) vector
256 const _C_node_pointer __ovec = _C_nodes - !__empty;
257 _C_node_pointer __nvec;
258
259 _TRY {
260 // allocate enough for two extra unused nodes
261 __nvec = __node_alloc.allocate (__nvecsize + 2, __ovec);
262
263 _RWSTD_ASSERT (!(_C_node_pointer () == __nvec));
264
265 const pointer __where = __buf
266 + ( __empty ? __bufsize / 2 - !__at_back
267 : __at_back ? 0 : __bufsize - 1);
268
269 _TRY {
270 __alloc.construct (__where, __x);
271 }
272 _CATCH (...) {
273 __node_alloc.deallocate (__nvec, __nvecsize + 2);
274 _RETHROW;
275 }
276
277 // reserve the first and last nodes (must always be 0)
278 ++__nvec;
279 }
280 _CATCH (...) {
281 // deallocate buffer and rethrow
282 __alloc.deallocate (__buf, __bufsize);
283 _RETHROW;
284 }
285
286 // compute the new indices into the newly allocated vector
287 // of the first and last occuppied node, respectively
288 const size_type __beg_inx = __nvecsize / (__empty ? 2 : 4);
289 const size_type __end_inx = __beg_inx + __nodes;
290
291 // copy existing nodes into the new buffer
292 _STD::copy (_C_beg._C_node, __end, __nvec + (__beg_inx + !__at_back));
293
294 // deallocate the current buffer only when non-0 to satisfy
295 // the requirement that deallocate() argument be non-zero
296 if (!(__ovec == _C_node_pointer ()))
297 __node_alloc.deallocate (__ovec, _C_node_size + 2);
298
299 // set the pointer and size
300 _C_nodes = __nvec;
301 _C_node_size = __nvecsize;
302
303 // insert the fixed-size array into the vector of nodes...
304 if (__at_back) {
305
306 // ...at the end
307 _C_nodes [__end_inx] = __buf;
308
309 _C_beg._C_node = _C_nodes + __beg_inx;
310 _C_end = _C_deque_iter (__buf, _C_nodes + __end_inx);
311
312 }
313 else {
314 // ...at the beginning
315 _C_nodes [__beg_inx] = __buf;
316
317 _C_beg = _C_deque_iter (__buf + __bufsize, _C_nodes + __beg_inx);
318 _C_end._C_node = _C_nodes + __end_inx;
319 }
320
321 if (__empty) {
322 // set the beginning and end pointers both
323 // to point at the same (future) element
324 _C_beg._C_cur =
325 _C_end._C_cur = __buf + __bufsize / 2;
326 }
327 }
328 else {
329 _RWSTD_ASSERT (_C_is_valid (0 /* valid and non-empty */));
330
331 _TRY {
332
333 if (__at_back) {
334 __alloc.construct (__buf, __x);
335
336 // append the newly allocated buffer to the end of the vector
337 // of pointers and increment `end' to point at the first
338 // element in it; zero out the following node
339 *++_C_end._C_node = __buf;
340 _C_end._C_cur = __buf;
341 }
342 else {
343 __alloc.construct (__buf + (__bufsize - 1), __x);
344
345 // prepend the newly allocated buffer to the beginning of
346 // the vector of pointers and decrement `begin' to point
347 // at the last element in it; zero out the preceding node
348 *--_C_beg._C_node = __buf;
349 _C_beg._C_cur = __buf + __bufsize;
350 }
351 }
352 _CATCH (...) {
353 __alloc.deallocate (__buf, __bufsize);
354
355 _RETHROW;
356 }
357 }
358
359 _C_end._C_node [+1] = pointer ();
360 _C_beg._C_node [-1] = pointer ();
361}
362
363
364template <class _TypeT, class _Allocator>
365void deque<_TypeT, _Allocator>::
366_C_free_at_begin ()
367{
368 const size_type __bufsize = _C_bufsize ();
369
370 _RWSTD_VALUE_ALLOC (_C_value_alloc_type, *this,
371 deallocate (*_C_beg._C_node, __bufsize));
372 if (empty ()) {
373 _C_node_alloc_type (*this).
374 deallocate (_C_nodes - 1, _C_node_size + 2);
375 _C_init ();
376 }
377 else {
378 *_C_beg._C_node++ = pointer ();
379 _C_beg = _C_deque_iter (*_C_beg._C_node, _C_beg._C_node);
380 }
381}
382
383
384template <class _TypeT, class _Allocator>
385void deque<_TypeT, _Allocator>::
386_C_free_at_end ()
387{
388 const size_type __bufsize = _C_bufsize ();
389
390 _RWSTD_VALUE_ALLOC (_C_value_alloc_type, *this,
391 deallocate (*_C_end._C_node, __bufsize));
392 if (empty ()) {
393 _C_node_alloc_type (*this).
394 deallocate (_C_nodes - 1, _C_node_size + 2);
395 _C_init ();
396 }
397 else {
398 *_C_end._C_node-- = pointer ();
399 _C_end = _C_deque_iter (*_C_end._C_node + __bufsize, _C_end._C_node);
400 }
401}
402
403
404template <class _TypeT, class _Allocator>
405void deque<_TypeT, _Allocator>::
406_C_assign_n (size_type __n, const_reference __x)
407{
408 _RWSTD_ASSERT (_C_is_valid ());
409
410#ifndef _RWSTD_NO_EXT_DEQUE_ASSIGN_IN_PLACE
411
412 // assign over existing elements for better efficiency
413 // and exception safety
414
415 // complexity: linear in n
416 // exception safety:
417 // -- nothrow if size() >= n, and value_type's assignment operator
418 // and iterator operations do not throw
419 // -- basic otherwise
420
421 const iterator __end = end ();
422
423 // avoid using the name __i or __it below so as not to trigger
424 // a (bogus) gcc 2.95.2 -Wshadow warning: declaration of `__i'
425 // shadows previous local
426 for (iterator __ix = begin (); !(__ix == __end); ++__ix, --__n) {
427 if (size_type () == __n) {
428 erase (__ix, __end);
429 return;
430 }
431 *__ix = __x;
432 }
433
434 insert (__end, __n, __x);
435
436#else // if defined (_RWSTD_NO_EXT_DEQUE_ASSIGN_IN_PLACE)
437
438 // follow the inefficient requirement in 23.2.1.1, p8
439
440 // complexity: linear in n
441 // exception safety: basic
442
443 clear ();
444 insert (begin (), __n, __x);
445
446#endif // _RWSTD_NO_EXT_DEQUE_ASSIGN_IN_PLACE
447
448}
449
450
451template <class _TypeT, class _Allocator>
452void deque<_TypeT, _Allocator>::
453_C_insert_n (const iterator &__it, size_type __n, const_reference __x)
454{
455 _RWSTD_ASSERT_RANGE (begin (), __it);
456 _RWSTD_ASSERT (_C_is_valid ());
457
458 const size_type __inx = _DISTANCE (begin (), __it, size_type);
459 const size_type __rem = size () - __inx;
460
461 _RWSTD_ASSERT (__inx <= size ());
462
463 if (__inx < __rem) {
464
465 // inserting `x' into the first half of the container
466
467 if (__inx < __n) {
468
469 for (size_type __i = __n - __inx; __i; --__i)
470 push_front (__x);
471
472 for (size_type __j = __inx; __j; --__j)
473 push_front (*(begin () + (__n - 1)));
474
475 _STD::fill (begin () + __n, begin () + (__n + __inx), __x);
476 }
477 else if (__n) {
478
479 for (size_type __i = __n; __i; --__i)
480 push_front (*(begin () + __n - 1));
481
482 const iterator __tmp = begin () + __n;
483
484 _STD::copy (__tmp + __n, __tmp + __inx, __tmp);
485
486 _STD::fill (begin () + __inx, __tmp + __inx, __x);
487 }
488 }
489 else {
490
491 // inserting `x' into the second half of the container
492
493 const size_type __size0 = size ();
494
495 if (__rem < __n) {
496
497 for (size_type __i = __n - __rem; __i; --__i)
498 push_back (__x);
499
500 for (size_type __j = 0; __j != __rem; ++__j)
501 push_back (*(begin () + (__inx + __j)));
502
503 _STD::fill (begin () + __inx, begin () + __size0, __x);
504 }
505 else if (__n) {
506
507 for (size_type __i = 0;__i != __n; ++__i)
508 push_back (*(begin () + __size0 - __n + __i));
509
510 const iterator __tmp = begin () + __inx;
511
512 _STD::copy_backward (__tmp, begin () + __size0 - __n,
513 begin () + __size0);
514
515 _STD::fill (__tmp, __tmp + __n, __x);
516 }
517 }
518}
519
520
521template <class _TypeT, class _Allocator>
522template <class _InputIter>
523void deque<_TypeT, _Allocator>::
524_C_assign_range (_InputIter __first, _InputIter __last, input_iterator_tag)
525{
526 typedef deque _Deque;
527
528 _RWSTD_ASSERT_RANGE (__first, __last);
529 _RWSTD_ASSERT (this->_C_is_valid ());
530
531#ifndef _RWSTD_NO_EXT_DEQUE_ASSIGN_IN_PLACE
532
533 // assign over existing elements for better efficiency
534 // and exception safety
535
536 // complexity: linear in distance(first, last)
537 // exception safety:
538 // -- nothrow if size() >= distance(first, last), and value_type's
539 // assignment operator and iterator operations do not throw
540 // -- basic otherwise
541
542 const iterator __end = this->end ();
543
544 // avoid using the name __i or __it below so as not to trigger
545 // a (bogus) gcc 2.95.2 -Wshadow warning: declaration of `__i'
546 // shadows previous local
547 for (iterator __ix = this->begin (); !(__ix == __end);
548 ++__ix, ++__first) {
549 if (__first == __last) {
550 this->erase (__ix, __end);
551 return;
552 }
553 *__ix = *__first;
554 }
555
556 this->insert (__end, __first, __last);
557
558#else // if defined (_RWSTD_NO_EXT_DEQUE_ASSIGN_IN_PLACE)
559
560 // follow the inefficient requirement in 23.2.1.1, p7
561
562 // complexity: linear in distance(first, last)
563 // exception safety: basic
564
565 this->clear ();
566 this->insert (this->begin (), __first, __last);
567
568#endif // _RWSTD_NO_EXT_DEQUE_ASSIGN_IN_PLACE
569
570}
571
572
573template<class _TypeT, class _Allocator>
574template <class _InputIter>
575void deque<_TypeT, _Allocator>::
576_C_insert_range (iterator __it,
577 _InputIter __first, _InputIter __last,
578 input_iterator_tag)
579{
580 typedef deque _Deque;
581
582 _RWSTD_ASSERT_RANGE (__it, this->end ());
583 _RWSTD_ASSERT_RANGE (__first, __last);
584
585#ifndef _RWSTD_NO_EXT_DEQUE_INSERT_IN_PLACE
586
587 // insert one element at a time to prevent a loss of data
588 // from the input sequence in the case of an exception
589
590 for ( ; !(__first == __last); ++__it, ++__first)
591 __it = this->insert (__it, *__first);
592
593#else // if defined (_RWSTD_NO_EXT_DEQUE_INSERT_IN_PLACE)
594
595 // 23.2.1.3, p2: if an exception is thrown other than by the copy
596 // constructor or assignment operator of T there are no effects.
597
598 _Deque __tmp (this->begin (), __it, this->get_allocator ());
599
600 for (; !(__first == __last); ++__first)
601 __tmp.push_back (*__first);
602
603 __tmp.insert (__tmp.end (), __it, this->end ());
604
605 this->swap (__tmp);
606
607#endif // _RWSTD_NO_EXT_DEQUE_INSERT_IN_PLACE
608
609}
610
611
612// template<class _TypeT, class _Allocator>
613// template <class _FwdIter>
614// void deque<_TypeT, _Allocator>::
615// _C_insert_range (iterator __it,
616// _FwdIter __first, _FwdIter __last,
617// forward_iterator_tag)
618// {
619// typedef deque _Deque;
620
621// // implemented in terms of the Input Iterator overload
622// _RWSTD_INSERT_RANGE (__it, __first, __last, input_iterator_tag ());
623// }
624
625
626template <class _TypeT, class _Allocator>
627template <class _BidirIter>
628void deque<_TypeT, _Allocator>::
629_C_insert_range (iterator __it,
630 _BidirIter __first, _BidirIter __last,
631 bidirectional_iterator_tag)
632{
633 typedef deque _Deque;
634
635 _RWSTD_ASSERT_RANGE (this->begin (), __it);
636 _RWSTD_ASSERT_RANGE (__first, __last);
637 _RWSTD_ASSERT (this->_C_is_valid ());
638
639 // compute the distance of `it' from the beginning of the container,
640 // the distance of `it' to the end of the container, and the number
641 // of elements to be inserted
642 const size_type __sz0 = this->size ();
643 const size_type __inx = _DISTANCE (this->begin (), __it, size_type);
644 const size_type __rem = __sz0 - __inx;
645 const size_type __n = _DISTANCE (__first, __last, size_type);
646
647 _RWSTD_ASSERT (__inx <= __sz0);
648
649 if (__inx < __rem) {
650
651 // inserting into the first half of the container
652
653 if (__inx < __n) {
654
655 // the number of elements in the range controlled by *this,
656 // [begin, it), is less than the number of elements in the
657 // range [first, last)
658
659 _BidirIter __from (__last);
660
661 _STD::advance (__from, -difference_type (__inx));
662
663 const _BidirIter __mid (__from);
664
665 while (!(__from == __first))
666 this->push_front (*--__from);
667
668 for (size_type __i = __inx; __i; --__i)
669 this->push_front (*(this->begin () + (__n - 1)));
670
671 _STD::copy (__mid, __last, this->begin () + __n);
672 }
673 else {
674
675 // the number of elements in the range to be inserted,
676 // [first, last), is less than or equal to the number
677 // of elements in the range [begin, it)
678
679 for (size_type __i = __n; __i; --__i)
680 this->push_front (*(this->begin () + (__n - 1)));
681
682 const iterator __to = this->begin () + __n;
683
684 _STD::copy (__to + __n, __to + __inx, __to);
685 _STD::copy (__first, __last, this->begin () + __inx);
686 }
687 }
688 else {
689 // inserting into the second half of the container
690
691 if (__rem < __n) {
692
693 _BidirIter __from (__first);
694
695 _STD::advance (__from, __rem);
696
697 const _BidirIter __to (__from);
698
699 for ( ; !(__from == __last); ++__from)
700 this->push_back (*__from);
701
702 for (size_type __i = 0; __i != __rem; ++__i)
703 this->push_back (*(this->begin () + (__inx + __i)));
704
705 _STD::copy (__first, __to, this->begin () + __inx);
706 }
707 else {
708 for (size_type __i = 0; __i != __n; ++__i)
709 this->push_back (*(this->begin () + (__sz0 - __n + __i)));
710
711 const iterator __to = this->begin () + __sz0;
712 const iterator __from = this->begin () + __inx;
713 const iterator __from_end = this->begin () + (__sz0 - __n);
714
715 _STD::copy_backward (__from, __from_end, __to);
716 _STD::copy (__first, __last, __from);
717 }
718 }
719}
720
721
722template<class _TypeT, class _Allocator>
723bool deque<_TypeT, _Allocator>::
724_C_is_valid (int __emptyfl) const
725{
726#ifdef _RWSTDDEBUG
727
728 if (__emptyfl < 0 /* don't care */)
729 return _C_is_valid (0 + empty ());
730
731 // the nodes just prior the first valid node and
732 // just past the last valid node must always be 0
733 if (_C_node_pointer () != _C_nodes) {
734 _RWSTD_ASSERT (pointer () == _C_beg._C_node [-1]);
735 _RWSTD_ASSERT (pointer () == _C_end._C_node [+1]);
736 }
737
738 if (__emptyfl) {
739 // container must be empty
740 _RWSTD_ASSERT (empty ());
741
742 // both `current' pointers must be 0
743 _RWSTD_ASSERT (pointer () == _C_beg._C_cur);
744 _RWSTD_ASSERT (pointer () == _C_end._C_cur);
745
746 // node pointers must be dereferenceable...
747 _RWSTD_ASSERT (_C_node_pointer () != _C_beg._C_node);
748 _RWSTD_ASSERT (_C_node_pointer () != _C_end._C_node);
749
750 // ...and both must dereference the same pointer
751 _RWSTD_ASSERT (*_C_beg._C_node == *_C_end._C_node);
752
753 return true;
754 }
755
756 const size_type __bufsize = _C_bufsize ();
757
758 // container must be non-empty
759 _RWSTD_ASSERT (!empty ());
760
761 // current pointers must be non-0
762 _RWSTD_ASSERT (pointer () != _C_beg._C_cur);
763 _RWSTD_ASSERT (pointer () != _C_end._C_cur);
764
765 // `begin' must be less than `end'
766 _RWSTD_ASSERT (_C_beg._C_node <= _C_end._C_node);
767
768 // `begin' must point into the vector of nodes
769 _RWSTD_ASSERT (_C_nodes <= _C_beg._C_node);
770 _RWSTD_ASSERT (_C_beg._C_node <= _C_nodes + _C_node_size);
771
772 // `begin' must point to a non-empty array of elements
773 _RWSTD_ASSERT (pointer () != *_C_beg._C_node);
774
775 // `begin' must point into an array of `bufsize' elements
776 _RWSTD_ASSERT (_C_beg._C_cur >= *_C_beg._C_node);
777 _RWSTD_ASSERT (_C_beg._C_cur <= *_C_beg._C_node + __bufsize);
778
779 // `end' must point into the vector of nodes
780 _RWSTD_ASSERT (_C_nodes <= _C_end._C_node);
781 _RWSTD_ASSERT (_C_end._C_node <= _C_nodes + _C_node_size);
782
783 // `end' must point to a non-empty array of elements
784 _RWSTD_ASSERT (pointer () != *_C_end._C_node);
785
786 // `end' must point into an array of `bufsize' elements
787 _RWSTD_ASSERT (_C_end._C_cur >= *_C_end._C_node);
788 _RWSTD_ASSERT (_C_end._C_cur <= *_C_end._C_node + __bufsize);
789
790#else // if !defined (_RWSTDDEBUG)
791
792 _RWSTD_UNUSED (__emptyfl);
793
794#endif // _RWSTDDEBUG
795
796 return true;
797}
798
799
800} // namespace std
const int end
#define _RWSTD_VALUE_ALLOC(ignore, object, call)
Definition _defs.h:893
#define _RETHROW
Definition _defs.h:853
#define _RWSTD_UNUSED(arg)
Definition _defs.h:972
#define _TRY
Definition _defs.h:850
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
#define _RWSTD_ASSERT(ignore)
Definition _defs.h:1108
#define _DISTANCE(first, last, ignore)
Definition _defs.h:1225
#define _CATCH(ex)
Definition _defs.h:851
#define _RWSTD_ASSERT_RANGE(ign1, ign2)
Definition _defs.h:1247
Definition json.h:5363