8#ifndef INCLUDED_BSLSTP_SLIST
9#define INCLUDED_BSLSTP_SLIST
100#ifdef BDE_OPENSOURCE_PUBLICATION
101#error "bslstp_slist is not for publication"
168template <
class _Tp,
class _Traits>
207template <
class _Tp,
class _Alloc>
227 BloombergLP::bslma::DestructionUtil::destroy(
229 _M_head.allocatorRef().deallocate(__next,1);
237 return _M_head.get_allocator();
242template <
class _Tp,
class _Alloc = bsl::allocator<_Tp> >
264 typedef BloombergLP::bslalg::ScalarPrimitives primitive;
290 _Node* _M_create_node(
const value_type& __x = _Tp()) {
291 _Node* __node = this->
_M_head.allocatorRef().allocate(1);
293 typedef BloombergLP::bslma::ConstructionUtil Util;
295 this->get_allocator(),
300 this->
_M_head.allocatorRef().deallocate(__node, 1);
314 { _M_insert_after_fill(&this->
_M_head._M_data, __n, __x); }
319 template <
class _InputIterator>
320 slist(_InputIterator __first, _InputIterator __last,
323 { _M_insert_after_range(&this->
_M_head._M_data, __first, __last); }
358 template <
class _InputIterator>
359 void assign(_InputIterator __first, _InputIterator __last) {
365 template <
class _Integer>
369 template <
class _InputIter>
374 while (__node != 0 && __first != __last) {
375 __node->_M_data = *__first;
377 __node = (_Node*) __node->
_M_next;
380 if (__first != __last)
381 _M_insert_after_range(__prev, __first, __last);
413 BloombergLP::bslstp::Util::swapContainers(*
this, __x,
QuickSwap());
419 {
return ((_Node*) this->
_M_head._M_data._M_next)->_M_data; }
425 _Node* __node = (_Node*) this->
_M_head._M_data._M_next;
426 this->
_M_head._M_data._M_next = __node->_M_next;
427 BloombergLP::bslma::DestructionUtil::destroy(
429 this->
_M_head.allocatorRef().deallocate(__node, 1);
433 return iterator((_Node*) _Sl_global_inst::__previous(&this->
_M_head._M_data, __pos._M_node));
440 _Node* _M_insert_after(_Node_base* __pos,
const value_type& __x = _Tp()) {
445 void _M_insert_after_fill(_Node_base *__pos,
447 for (
size_type __i = 0; __i < __n; ++__i)
452 template <
class _InIter>
453 void _M_insert_after_range(_Node_base *__pos,
454 _InIter __first, _InIter __last) {
459 template <
class _Integer>
460 void _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x,
462 _M_insert_after_fill(__pos, __n, __x);
465 template <
class _InIter>
466 void _M_insert_after_range(_Node_base *__pos,
467 _InIter __first, _InIter __last,
469 while (__first != __last) {
479 return iterator(_M_insert_after(__pos._M_node, __x));
484 _M_insert_after_fill(__pos._M_node, __n, __x);
489 template <
class _InIter>
491 _M_insert_after_range(__pos._M_node, __first, __last);
497 _Sl_global_inst::__previous(&this->
_M_head._M_data, __pos._M_node),
503 _M_insert_after_fill(_Sl_global_inst::__previous(&this->
_M_head._M_data, __pos._M_node), __n, __x);
508 template <
class _InIter>
510 _M_insert_after_range(
511 _Sl_global_inst::__previous(&this->
_M_head._M_data, __pos._M_node),
533 _Sl_global_inst::__previous(&this->
_M_head._M_data, __first._M_node), __last._M_node));
548 if (__before_first != __before_last) {
549 _Sl_global_inst::__splice_after(__pos._M_node, __before_first._M_node,
550 __before_last._M_node);
558 _Sl_global_inst::__splice_after(__pos._M_node,
559 __prev._M_node, __prev._M_node->_M_next);
567 _Sl_global_inst::__splice_after(__pos._M_node, &__x.
_M_head._M_data);
572 if (__x.
_M_head._M_data._M_next)
573 _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->
_M_head._M_data, __pos._M_node),
574 &__x.
_M_head._M_data, _Sl_global_inst::__previous(&__x.
_M_head._M_data, 0));
579 _Sl_global_inst::__splice_after(
580 _Sl_global_inst::__previous(&this->
_M_head._M_data, __pos._M_node),
581 _Sl_global_inst::__previous(&__x.
_M_head._M_data, __i._M_node),
589 if (__first != __last)
590 _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->
_M_head._M_data, __pos._M_node),
591 _Sl_global_inst::__previous(&__x.
_M_head._M_data, __first._M_node),
592 _Sl_global_inst::__previous(__first._M_node, __last._M_node));
597 if (this->
_M_head._M_data._M_next)
598 this->
_M_head._M_data._M_next = _Sl_global_inst::__reverse(this->
_M_head._M_data._M_next);
601 void remove(
const _Tp& __val);
603 void merge(_Self& __x);
606 template <
class _Predicate>
610 if (__pred(((_Node*) __cur->
_M_next)->_M_data))
617 template <
class _BinaryPredicate>
619 _Node* __cur = (_Node*) this->
_M_head._M_data._M_next;
621 while (__cur->_M_next) {
622 if (__pred(((_Node*)__cur)->_M_data,
623 ((_Node*)(__cur->_M_next))->_M_data))
626 __cur = (_Node*) __cur->_M_next;
631 template <
class _StrictWeakOrdering>
633 _StrictWeakOrdering __comp) {
636 if (__comp(((_Node*) __x.
_M_head._M_data._M_next)->_M_data,
637 ((_Node*) __n1->
_M_next)->_M_data))
638 _Sl_global_inst::__splice_after(__n1, &__x.
_M_head._M_data, __x.
_M_head._M_data._M_next);
641 if (__x.
_M_head._M_data._M_next) {
643 __x.
_M_head._M_data._M_next = 0;
647 template <
class _StrictWeakOrdering>
648 void sort(_StrictWeakOrdering __comp) {
649 if (this->
_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {
658 BloombergLP::bsls::ObjectBuffer<_Self> __counterBuffers[64];
659 _Self* __counter = &__counterBuffers[0].object();
660 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
661 __counter, 64, __carry,
663 BloombergLP::bslma::AutoDestructor<_Self> __counterGuard(__counter, 64);
667 _Sl_global_inst::__splice_after(&__carry.
_M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next);
669 while (__i < __fill && !__counter[__i].
empty()) {
670 __counter[__i].
merge(__carry, __comp);
671 __carry.
swap(__counter[__i]);
674 __carry.
swap(__counter[__i]);
679 for (
int __i = 1; __i < __fill; ++__i)
680 __counter[__i].
merge(__counter[__i-1], __comp);
681 this->
swap(__counter[__fill-1]);
687template <
class _Tp,
class _Alloc>
692 const_iterator __end1 = _SL1.
end();
693 const_iterator __end2 = _SL2.
end();
695 const_iterator __i1 = _SL1.
begin();
696 const_iterator __i2 = _SL2.
begin();
697 while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
701 return __i1 == __end1 && __i2 == __end2;
704template <
class _Tp,
class _Alloc>
708 return std::lexicographical_compare(__x.
begin(), __x.
end(),
712template <
class _Tp,
class _Alloc>
717template <
class _Tp,
class _Alloc>
722template <
class _Tp,
class _Alloc>
727template <
class _Tp,
class _Alloc>
778template <
class _Tp,
class _Alloc>
783 while (__cur != __last_node) {
786 BloombergLP::bslma::DestructionUtil::destroy(
788 _M_head.allocatorRef().deallocate(__tmp,1);
790 __before_first->
_M_next = __last_node;
794template <
class _Tp,
class _Alloc>
799 _Node* __n1 = (_Node*) this->_M_head._M_data.
_M_next;
800 const _Node* __n2 = (
const _Node*) __x.
_M_head._M_data._M_next;
801 while (__n1 && __n2) {
802 __n1->_M_data = __n2->_M_data;
805 __n2 = (
const _Node*) __n2->_M_next;
808 this->_M_erase_after(__p1, 0);
810 _M_insert_after_range(__p1,
const_iterator(
const_cast<_Node*
>(__n2)),
816template <
class _Tp,
class _Alloc>
819 _Node* __node = (_Node*) this->_M_head._M_data.
_M_next;
820 for ( ; __node != 0 && __n > 0 ; --__n) {
821 __node->_M_data = __val;
823 __node = (_Node*) __node->
_M_next;
826 _M_insert_after_fill(__prev, __n, __val);
828 this->_M_erase_after(__prev, 0);
832template <
class _Tp,
class _Alloc>
836 while (__cur->
_M_next != 0 && __len > 0) {
841 this->_M_erase_after(__cur, 0);
843 _M_insert_after_fill(__cur, __len, __x);
846template <
class _Tp,
class _Alloc>
850 while (__cur && __cur->
_M_next) {
851 if (((_Node*) __cur->
_M_next)->_M_data == __val)
852 this->_M_erase_after(__cur);
858template <
class _Tp,
class _Alloc>
864 if (((_Node*)__cur)->_M_data ==
865 ((_Node*)(__cur->_M_next))->_M_data)
866 this->_M_erase_after(__cur);
868 __cur = __cur->_M_next;
873template <
class _Tp,
class _Alloc>
878 if (((_Node*) __x.
_M_head._M_data._M_next)->_M_data <
879 ((_Node*) __n1->
_M_next)->_M_data)
880 _Sl_global_inst::__splice_after(__n1, &__x.
_M_head._M_data, __x.
_M_head._M_data._M_next);
883 if (__x.
_M_head._M_data._M_next) {
885 __x.
_M_head._M_data._M_next = 0;
889template <
class _Tp,
class _Alloc>
892 if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {
893 _Self __carry(this->get_allocator());
901 BloombergLP::bsls::ObjectBuffer<_Self> __counterBuffers[64];
902 _Self* __counter = &__counterBuffers[0].object();
904 this->get_allocator());
905 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
906 __counter, 64, __carry,
908 BloombergLP::bslma::AutoDestructor<_Self> __counterGuard(__counter, 64);
912 _Sl_global_inst::__splice_after(&__carry.
_M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next);
914 while (__i < __fill && !__counter[__i].
empty()) {
915 __counter[__i].
merge(__carry);
916 __carry.
swap(__counter[__i]);
919 __carry.
swap(__counter[__i]);
924 for (
int __i = 1; __i < __fill; ++__i)
925 __counter[__i].merge(__counter[__i-1]);
926 this->swap(__counter[__fill-1]);
953template <
class _Tp,
class _Alloc>
954class insert_iterator<
bsl::slist<_Tp, _Alloc> > {
958 typename _Container::iterator
iter;
969 if (__i == __x.begin())
970 iter = __x.before_begin();
972 iter = __x.previous(__i);
975 insert_iterator<_Container>&
976 operator=(
const typename _Container::value_type& __val) {
977 iter = container->insert_after(iter, __val);
980 insert_iterator<_Container>&
operator*() {
return *
this; }
982 insert_iterator<_Container>&
operator++(
int) {
return *
this; }
Definition bslstp_alloc.h:105
Definition bslstp_slist.h:244
void splice(iterator __pos, _Self &__x, iterator __first, iterator __last)
Definition bslstp_slist.h:587
const_reference front() const
Definition bslstp_slist.h:418
void swap(_Self &__x)
Definition bslstp_slist.h:412
value_type & reference
Definition bslstp_slist.h:273
void merge(_Self &__x)
Definition bslstp_slist.h:874
_Tp value_type
Definition bslstp_slist.h:270
void unique()
Definition bslstp_slist.h:859
std::ptrdiff_t difference_type
Definition bslstp_slist.h:276
iterator end()
Definition bslstp_slist.h:403
iterator erase_after(iterator __before_first, iterator __last)
Definition bslstp_slist.h:521
iterator before_begin()
Definition bslstp_slist.h:395
void insert(iterator __pos, size_type __n, const value_type &__x)
Definition bslstp_slist.h:502
void reverse()
Definition bslstp_slist.h:596
void splice_after(iterator __pos, iterator __before_first, iterator __before_last)
Definition bslstp_slist.h:545
void remove_if(_Predicate __pred)
Definition bslstp_slist.h:607
_Self & operator=(const _Self &__x)
Definition bslstp_slist.h:795
const value_type * const_pointer
Definition bslstp_slist.h:272
reference front()
Definition bslstp_slist.h:417
bool empty() const
Definition bslstp_slist.h:410
size_type size() const
Definition bslstp_slist.h:406
iterator begin()
Definition bslstp_slist.h:399
iterator insert(iterator __pos, const value_type &__x=_Tp())
Definition bslstp_slist.h:495
void sort(_StrictWeakOrdering __comp)
Definition bslstp_slist.h:648
void insert_after(iterator __pos, _InIter __first, _InIter __last)
Definition bslstp_slist.h:490
iterator insert_after(iterator __pos, const value_type &__x=_Tp())
Definition bslstp_slist.h:478
slist(const _Self &__x)
Definition bslstp_slist.h:325
const_iterator end() const
Definition bslstp_slist.h:404
void splice_after(iterator __pos, _Self &__x)
Definition bslstp_slist.h:565
iterator erase(iterator __pos)
Definition bslstp_slist.h:526
void _M_fill_assign(size_type __n, const _Tp &__val)
Definition bslstp_slist.h:817
void insert_after(iterator __pos, size_type __n, const value_type &__x)
Definition bslstp_slist.h:483
slist(const allocator_type &__a=allocator_type())
Definition bslstp_slist.h:309
void unique(_BinaryPredicate __pred)
Definition bslstp_slist.h:618
iterator erase(iterator __first, iterator __last)
Definition bslstp_slist.h:531
_Base::allocator_type allocator_type
Definition bslstp_slist.h:282
allocator_type get_allocator() const
Definition bslstp_slist.h:307
slist(size_type __n, const value_type &__x=_Tp(), const allocator_type &__a=allocator_type())
Definition bslstp_slist.h:311
void merge(slist< _Tp, _Alloc > &__x, _StrictWeakOrdering __comp)
Definition bslstp_slist.h:632
const_iterator before_begin() const
Definition bslstp_slist.h:396
iterator previous(const_iterator __pos)
Definition bslstp_slist.h:432
void push_front(const value_type &__x=_Tp())
Definition bslstp_slist.h:420
void splice_after(iterator __pos, iterator __prev)
Definition bslstp_slist.h:556
_Slist_iterator< _Tp, _Nonconst_traits< _Tp > > iterator
Definition bslstp_slist.h:279
void splice(iterator __pos, _Self &__x, iterator __i)
Definition bslstp_slist.h:578
void splice(iterator __pos, _Self &__x)
Definition bslstp_slist.h:571
slist(const _Self &__x, const allocator_type &__a)
Definition bslstp_slist.h:330
void sort()
Definition bslstp_slist.h:890
void insert(iterator __pos, _InIter __first, _InIter __last)
Definition bslstp_slist.h:509
std::forward_iterator_tag _Iterator_category
Definition bslstp_slist.h:277
void _M_assign_dispatch(_InputIter __first, _InputIter __last, bsl::false_type *)
Definition bslstp_slist.h:371
const_iterator begin() const
Definition bslstp_slist.h:400
_Slist_iterator< _Tp, _Const_traits< _Tp > > const_iterator
Definition bslstp_slist.h:280
size_type max_size() const
Definition bslstp_slist.h:408
value_type * pointer
Definition bslstp_slist.h:271
const_iterator previous(const_iterator __pos) const
Definition bslstp_slist.h:435
void resize(size_type new_size, const value_type &__x=_Tp())
Definition bslstp_slist.h:833
void assign(_InputIterator __first, _InputIterator __last)
Definition bslstp_slist.h:359
slist(_InputIterator __first, _InputIterator __last, const allocator_type &__a=allocator_type())
Definition bslstp_slist.h:320
friend struct QuickSwap
Definition bslstp_slist.h:250
~slist()
Definition bslstp_slist.h:345
void assign(size_type __n, const _Tp &__val)
Definition bslstp_slist.h:353
const value_type & const_reference
Definition bslstp_slist.h:274
void remove(const _Tp &__val)
Definition bslstp_slist.h:847
void pop_front()
Definition bslstp_slist.h:424
std::size_t size_type
Definition bslstp_slist.h:275
void _M_assign_dispatch(_Integer __n, _Integer __val, bsl::true_type *)
Definition bslstp_slist.h:366
iterator erase_after(iterator __pos)
Definition bslstp_slist.h:518
void clear()
Definition bslstp_slist.h:538
_Container::iterator iter
Definition bslstp_slist.h:958
output_iterator_tag iterator_category
Definition bslstp_slist.h:961
insert_iterator< _Container > & operator++()
Definition bslstp_slist.h:981
void difference_type
Definition bslstp_slist.h:963
_Container * container
Definition bslstp_slist.h:957
bsl::slist< _Tp, _Alloc > _Container
Definition bslstp_slist.h:956
void reference
Definition bslstp_slist.h:965
insert_iterator< _Container > & operator++(int)
Definition bslstp_slist.h:982
_Container container_type
Definition bslstp_slist.h:960
insert_iterator< _Container > & operator=(const typename _Container::value_type &__val)
Definition bslstp_slist.h:976
insert_iterator< _Container > & operator*()
Definition bslstp_slist.h:980
void pointer
Definition bslstp_slist.h:964
insert_iterator(_Container &__x, typename _Container::iterator __i)
Definition bslstp_slist.h:967
void value_type
Definition bslstp_slist.h:962
#define BSLS_CATCH(X)
Definition bsls_exceptionutil.h:372
#define BSLS_TRY
Definition bsls_exceptionutil.h:370
#define BSLS_RETHROW
Definition bsls_exceptionutil.h:378
#define BSLS_UTIL_ADDRESSOF(OBJ)
Definition bsls_util.h:296
Definition bdlat_valuetypefunctions.h:939
_Slist_node_base * __slist_make_link(_Slist_node_base *__prev_node, _Slist_node_base *__new_node)
Definition bslstp_slistbase.h:95
BSLS_KEYWORD_CONSTEXPR bool empty(const CONTAINER &container)
Definition bslstl_iterator.h:1377
Definition bslstp_exfunctional.h:325
Definition bdldfp_decimal.h:5549
_Rebind_type::other allocator_type
Definition bslstp_alloc.h:98
Definition bslstp_slist.h:208
_Slist_node_base * _M_erase_after(_Slist_node_base *, _Slist_node_base *)
Definition bslstp_slist.h:780
_STLP_alloc_proxy< _Slist_node_base, _Node, _M_node_allocator_type > _M_head
Definition bslstp_slist.h:239
_Slist_node_base * _M_erase_after(_Slist_node_base *__pos)
Definition bslstp_slist.h:222
_Alloc_traits< _Tp, _Alloc >::allocator_type allocator_type
Definition bslstp_slist.h:210
~_Slist_base()
Definition bslstp_slist.h:217
_Slist_node< _Tp > _Node
Definition bslstp_slist.h:211
_Alloc_traits< _Node, _Alloc >::allocator_type _M_node_allocator_type
Definition bslstp_slist.h:220
allocator_type get_allocator() const
Definition bslstp_slist.h:235
_Slist_base(const allocator_type &__a)
Definition bslstp_slist.h:213
Definition bslstp_slist.h:145
std::ptrdiff_t difference_type
Definition bslstp_slist.h:148
bool operator!=(const _Slist_iterator_base &__y) const
Definition bslstp_slist.h:162
_Slist_node_base * _M_node
Definition bslstp_slist.h:151
std::forward_iterator_tag iterator_category
Definition bslstp_slist.h:149
std::size_t size_type
Definition bslstp_slist.h:147
void _M_incr()
Definition bslstp_slist.h:155
_Slist_iterator_base(_Slist_node_base *__x)
Definition bslstp_slist.h:153
bool operator==(const _Slist_iterator_base &__y) const
Definition bslstp_slist.h:159
Definition bslstp_slist.h:170
_Traits::pointer pointer
Definition bslstp_slist.h:172
_Slist_node< value_type > _Node
Definition bslstp_slist.h:182
_Slist_iterator< _Tp, _Const_traits< _Tp > > const_iterator
Definition bslstp_slist.h:179
_Slist_iterator(const iterator &__x)
Definition bslstp_slist.h:186
_Slist_iterator< _Tp, _Nonconst_traits< _Tp > > iterator
Definition bslstp_slist.h:178
ptrdiff_t difference_type
Definition bslstp_slist.h:176
_Tp value_type
Definition bslstp_slist.h:171
std::forward_iterator_tag iterator_category
Definition bslstp_slist.h:174
pointer operator->() const
Definition bslstp_slist.h:190
reference operator*() const
Definition bslstp_slist.h:188
_Self operator++(int)
Definition bslstp_slist.h:197
std::size_t size_type
Definition bslstp_slist.h:175
_Slist_iterator(_Node *__x)
Definition bslstp_slist.h:184
_Slist_iterator< _Tp, _Traits > _Self
Definition bslstp_slist.h:180
_Traits::reference reference
Definition bslstp_slist.h:173
_Slist_iterator()
Definition bslstp_slist.h:185
_Self & operator++()
Definition bslstp_slist.h:192
Definition bslstp_slistbase.h:90
_Slist_node_base * _M_next
Definition bslstp_slistbase.h:91
Definition bslstp_slist.h:141
_Tp _M_data
Definition bslstp_slist.h:142
Definition bslmf_isfundamental.h:330