136ac495dSmrg// Profiling list implementation -*- C++ -*- 236ac495dSmrg 3*c0a68be4Smrg// Copyright (C) 2009-2019 Free Software Foundation, Inc. 436ac495dSmrg// 536ac495dSmrg// This file is part of the GNU ISO C++ Library. This library is free 636ac495dSmrg// software; you can redistribute it and/or modify it under the 736ac495dSmrg// terms of the GNU General Public License as published by the 836ac495dSmrg// Free Software Foundation; either version 3, or (at your option) 936ac495dSmrg// any later version. 1036ac495dSmrg 1136ac495dSmrg// This library is distributed in the hope that it will be useful, 1236ac495dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 1336ac495dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1436ac495dSmrg// GNU General Public License for more details. 1536ac495dSmrg 1636ac495dSmrg// Under Section 7 of GPL version 3, you are granted additional 1736ac495dSmrg// permissions described in the GCC Runtime Library Exception, version 1836ac495dSmrg// 3.1, as published by the Free Software Foundation. 1936ac495dSmrg 2036ac495dSmrg// You should have received a copy of the GNU General Public License and 2136ac495dSmrg// a copy of the GCC Runtime Library Exception along with this program; 2236ac495dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2336ac495dSmrg// <http://www.gnu.org/licenses/>. 2436ac495dSmrg 2536ac495dSmrg/** @file profile/list 2636ac495dSmrg * This file is a GNU profile extension to the Standard C++ Library. 2736ac495dSmrg */ 2836ac495dSmrg 2936ac495dSmrg#ifndef _GLIBCXX_PROFILE_LIST 3036ac495dSmrg#define _GLIBCXX_PROFILE_LIST 1 3136ac495dSmrg 3236ac495dSmrg#include <list> 3336ac495dSmrg#include <profile/base.h> 3436ac495dSmrg#include <profile/iterator_tracker.h> 3536ac495dSmrg 3636ac495dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 3736ac495dSmrg{ 3836ac495dSmrgnamespace __profile 3936ac495dSmrg{ 4036ac495dSmrg template<typename _List> 4136ac495dSmrg class _List_profile 4236ac495dSmrg { 4336ac495dSmrg _List& 4436ac495dSmrg _M_conjure() 4536ac495dSmrg { return *static_cast<_List*>(this); } 4636ac495dSmrg 4736ac495dSmrg public: 4836ac495dSmrg __gnu_profile::__list2slist_info* _M_list2slist_info; 4936ac495dSmrg __gnu_profile::__list2vector_info* _M_list2vector_info; 5036ac495dSmrg 5136ac495dSmrg _List_profile() _GLIBCXX_NOEXCEPT 5236ac495dSmrg { _M_profile_construct(); } 5336ac495dSmrg 5436ac495dSmrg void 5536ac495dSmrg _M_profile_construct() _GLIBCXX_NOEXCEPT 5636ac495dSmrg { 5736ac495dSmrg _M_list2slist_info = __profcxx_list2slist_construct(); 5836ac495dSmrg _M_list2vector_info = __profcxx_list2vector_construct(); 5936ac495dSmrg } 6036ac495dSmrg 6136ac495dSmrg void 6236ac495dSmrg _M_profile_destruct() _GLIBCXX_NOEXCEPT 6336ac495dSmrg { 6436ac495dSmrg __profcxx_list2vector_destruct(_M_list2vector_info); 6536ac495dSmrg _M_list2vector_info = 0; 6636ac495dSmrg __profcxx_list2slist_destruct(_M_list2slist_info); 6736ac495dSmrg _M_list2slist_info = 0; 6836ac495dSmrg } 6936ac495dSmrg 7036ac495dSmrg void 7136ac495dSmrg _M_swap(_List_profile& __other) 7236ac495dSmrg { 7336ac495dSmrg std::swap(_M_list2slist_info, __other._M_list2slist_info); 7436ac495dSmrg std::swap(_M_list2vector_info, __other._M_list2vector_info); 7536ac495dSmrg } 7636ac495dSmrg 7736ac495dSmrg#if __cplusplus >= 201103L 7836ac495dSmrg _List_profile(const _List_profile&) noexcept 7936ac495dSmrg : _List_profile() { } 8036ac495dSmrg _List_profile(_List_profile&& __other) noexcept 8136ac495dSmrg : _List_profile() 8236ac495dSmrg { _M_swap(__other); } 8336ac495dSmrg 8436ac495dSmrg _List_profile& 8536ac495dSmrg operator=(const _List_profile&) noexcept 8636ac495dSmrg { 8736ac495dSmrg _M_profile_destruct(); 8836ac495dSmrg _M_profile_construct(); 8936ac495dSmrg } 9036ac495dSmrg 9136ac495dSmrg _List_profile& 9236ac495dSmrg operator=(_List_profile&& __other) noexcept 9336ac495dSmrg { 9436ac495dSmrg _M_swap(__other); 9536ac495dSmrg __other._M_profile_destruct(); 9636ac495dSmrg __other._M_profile_construct(); 9736ac495dSmrg } 9836ac495dSmrg#endif 9936ac495dSmrg 10036ac495dSmrg ~_List_profile() 10136ac495dSmrg { _M_profile_destruct(); } 10236ac495dSmrg }; 10336ac495dSmrg 10436ac495dSmrg /** @brief List wrapper with performance instrumentation. */ 10536ac495dSmrg template<typename _Tp, typename _Allocator = std::allocator<_Tp> > 10636ac495dSmrg class list 10736ac495dSmrg : public _GLIBCXX_STD_C::list<_Tp, _Allocator>, 10836ac495dSmrg public _List_profile<list<_Tp, _Allocator> > 10936ac495dSmrg { 11036ac495dSmrg typedef _GLIBCXX_STD_C::list<_Tp, _Allocator> _Base; 11136ac495dSmrg 11236ac495dSmrg public: 11336ac495dSmrg typedef typename _Base::reference reference; 11436ac495dSmrg typedef typename _Base::const_reference const_reference; 11536ac495dSmrg 11636ac495dSmrg typedef __iterator_tracker<typename _Base::iterator, list> 11736ac495dSmrg iterator; 11836ac495dSmrg typedef __iterator_tracker<typename _Base::const_iterator, list> 11936ac495dSmrg const_iterator; 12036ac495dSmrg 12136ac495dSmrg typedef typename _Base::size_type size_type; 12236ac495dSmrg typedef typename _Base::difference_type difference_type; 12336ac495dSmrg 12436ac495dSmrg typedef _Tp value_type; 12536ac495dSmrg typedef _Allocator allocator_type; 12636ac495dSmrg typedef typename _Base::pointer pointer; 12736ac495dSmrg typedef typename _Base::const_pointer const_pointer; 12836ac495dSmrg typedef std::reverse_iterator<iterator> reverse_iterator; 12936ac495dSmrg typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 13036ac495dSmrg 13136ac495dSmrg // 23.2.2.1 construct/copy/destroy: 13236ac495dSmrg 13336ac495dSmrg#if __cplusplus < 201103L 13436ac495dSmrg list() { } 13536ac495dSmrg list(const list& __x) 13636ac495dSmrg : _Base(__x) { } 13736ac495dSmrg 13836ac495dSmrg ~list() { } 13936ac495dSmrg#else 14036ac495dSmrg list() = default; 14136ac495dSmrg list(const list&) = default; 14236ac495dSmrg list(list&&) = default; 14336ac495dSmrg ~list() = default; 14436ac495dSmrg 14536ac495dSmrg list(initializer_list<value_type> __l, 14636ac495dSmrg const allocator_type& __a = allocator_type()) 14736ac495dSmrg : _Base(__l, __a) { } 14836ac495dSmrg 14936ac495dSmrg list(const list& __x, const allocator_type& __a) 15036ac495dSmrg : _Base(__x, __a) { } 15136ac495dSmrg 15236ac495dSmrg list(list&& __x, const allocator_type& __a) 15336ac495dSmrg : _Base(std::move(__x), __a) { } 15436ac495dSmrg#endif 15536ac495dSmrg 15636ac495dSmrg explicit 15736ac495dSmrg list(const _Allocator& __a) _GLIBCXX_NOEXCEPT 15836ac495dSmrg : _Base(__a) { } 15936ac495dSmrg 16036ac495dSmrg#if __cplusplus >= 201103L 16136ac495dSmrg explicit 16236ac495dSmrg list(size_type __n, const allocator_type& __a = allocator_type()) 16336ac495dSmrg : _Base(__n, __a) { } 16436ac495dSmrg 16536ac495dSmrg list(size_type __n, const _Tp& __value, 16636ac495dSmrg const _Allocator& __a = _Allocator()) 16736ac495dSmrg : _Base(__n, __value, __a) { } 16836ac495dSmrg#else 16936ac495dSmrg explicit 17036ac495dSmrg list(size_type __n, const _Tp& __value = _Tp(), 17136ac495dSmrg const _Allocator& __a = _Allocator()) 17236ac495dSmrg : _Base(__n, __value, __a) { } 17336ac495dSmrg#endif 17436ac495dSmrg 17536ac495dSmrg#if __cplusplus >= 201103L 17636ac495dSmrg template<typename _InputIterator, 17736ac495dSmrg typename = std::_RequireInputIter<_InputIterator>> 17836ac495dSmrg#else 17936ac495dSmrg template<class _InputIterator> 18036ac495dSmrg#endif 18136ac495dSmrg list(_InputIterator __first, _InputIterator __last, 18236ac495dSmrg const _Allocator& __a = _Allocator()) 18336ac495dSmrg : _Base(__first, __last, __a) { } 18436ac495dSmrg 18536ac495dSmrg list(const _Base& __x) 18636ac495dSmrg : _Base(__x) { } 18736ac495dSmrg 18836ac495dSmrg#if __cplusplus < 201103L 18936ac495dSmrg list& 19036ac495dSmrg operator=(const list& __x) 19136ac495dSmrg { 19236ac495dSmrg this->_M_profile_destruct(); 19336ac495dSmrg _M_base() = __x; 19436ac495dSmrg this->_M_profile_construct(); 19536ac495dSmrg return *this; 19636ac495dSmrg } 19736ac495dSmrg#else 19836ac495dSmrg list& 19936ac495dSmrg operator=(const list&) = default; 20036ac495dSmrg 20136ac495dSmrg list& 20236ac495dSmrg operator=(list&&) = default; 20336ac495dSmrg 20436ac495dSmrg list& 20536ac495dSmrg operator=(initializer_list<value_type> __l) 20636ac495dSmrg { 20736ac495dSmrg this->_M_profile_destruct(); 20836ac495dSmrg _M_base() = __l; 20936ac495dSmrg this->_M_profile_construct(); 21036ac495dSmrg return *this; 21136ac495dSmrg } 21236ac495dSmrg#endif 21336ac495dSmrg 21436ac495dSmrg // iterators: 21536ac495dSmrg iterator 21636ac495dSmrg begin() _GLIBCXX_NOEXCEPT 21736ac495dSmrg { return iterator(_Base::begin(), this); } 21836ac495dSmrg 21936ac495dSmrg const_iterator 22036ac495dSmrg begin() const _GLIBCXX_NOEXCEPT 22136ac495dSmrg { return const_iterator(_Base::begin(), this); } 22236ac495dSmrg 22336ac495dSmrg iterator 22436ac495dSmrg end() _GLIBCXX_NOEXCEPT 22536ac495dSmrg { 22636ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 22736ac495dSmrg return iterator(_Base::end(), this); 22836ac495dSmrg } 22936ac495dSmrg 23036ac495dSmrg const_iterator 23136ac495dSmrg end() const _GLIBCXX_NOEXCEPT 23236ac495dSmrg { 23336ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 23436ac495dSmrg return const_iterator(_Base::end(), this); 23536ac495dSmrg } 23636ac495dSmrg 23736ac495dSmrg reverse_iterator 23836ac495dSmrg rbegin() _GLIBCXX_NOEXCEPT 23936ac495dSmrg { 24036ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 24136ac495dSmrg return reverse_iterator(end()); 24236ac495dSmrg } 24336ac495dSmrg 24436ac495dSmrg const_reverse_iterator 24536ac495dSmrg rbegin() const _GLIBCXX_NOEXCEPT 24636ac495dSmrg { 24736ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 24836ac495dSmrg return const_reverse_iterator(end()); 24936ac495dSmrg } 25036ac495dSmrg 25136ac495dSmrg reverse_iterator 25236ac495dSmrg rend() _GLIBCXX_NOEXCEPT 25336ac495dSmrg { return reverse_iterator(begin()); } 25436ac495dSmrg 25536ac495dSmrg const_reverse_iterator 25636ac495dSmrg rend() const _GLIBCXX_NOEXCEPT 25736ac495dSmrg { return const_reverse_iterator(begin()); } 25836ac495dSmrg 25936ac495dSmrg#if __cplusplus >= 201103L 26036ac495dSmrg const_iterator 26136ac495dSmrg cbegin() const noexcept 26236ac495dSmrg { return const_iterator(_Base::cbegin(), this); } 26336ac495dSmrg 26436ac495dSmrg const_iterator 26536ac495dSmrg cend() const noexcept 26636ac495dSmrg { return const_iterator(_Base::cend(), this); } 26736ac495dSmrg 26836ac495dSmrg const_reverse_iterator 26936ac495dSmrg crbegin() const noexcept 27036ac495dSmrg { return const_reverse_iterator(end()); } 27136ac495dSmrg 27236ac495dSmrg const_reverse_iterator 27336ac495dSmrg crend() const noexcept 27436ac495dSmrg { return const_reverse_iterator(begin()); } 27536ac495dSmrg#endif 27636ac495dSmrg 27736ac495dSmrg // 23.2.2.2 capacity: 27836ac495dSmrg reference 27936ac495dSmrg back() _GLIBCXX_NOEXCEPT 28036ac495dSmrg { 28136ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 28236ac495dSmrg return _Base::back(); 28336ac495dSmrg } 28436ac495dSmrg 28536ac495dSmrg const_reference 28636ac495dSmrg back() const _GLIBCXX_NOEXCEPT 28736ac495dSmrg { 28836ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 28936ac495dSmrg return _Base::back(); 29036ac495dSmrg } 29136ac495dSmrg 29236ac495dSmrg // 23.2.2.3 modifiers: 29336ac495dSmrg void 29436ac495dSmrg push_front(const value_type& __x) 29536ac495dSmrg { 29636ac495dSmrg __profcxx_list2vector_invalid_operator(this->_M_list2vector_info); 29736ac495dSmrg __profcxx_list2slist_operation(this->_M_list2slist_info); 29836ac495dSmrg _Base::push_front(__x); 29936ac495dSmrg } 30036ac495dSmrg 30136ac495dSmrg void 30236ac495dSmrg pop_front() _GLIBCXX_NOEXCEPT 30336ac495dSmrg { 30436ac495dSmrg __profcxx_list2slist_operation(this->_M_list2slist_info); 30536ac495dSmrg _Base::pop_front(); 30636ac495dSmrg } 30736ac495dSmrg 30836ac495dSmrg void 30936ac495dSmrg pop_back() _GLIBCXX_NOEXCEPT 31036ac495dSmrg { 31136ac495dSmrg _Base::pop_back(); 31236ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 31336ac495dSmrg } 31436ac495dSmrg 31536ac495dSmrg#if __cplusplus >= 201103L 31636ac495dSmrg template<typename... _Args> 31736ac495dSmrg iterator 31836ac495dSmrg emplace(const_iterator __position, _Args&&... __args) 31936ac495dSmrg { 32036ac495dSmrg return iterator(_Base::emplace(__position.base(), 32136ac495dSmrg std::forward<_Args>(__args)...), 32236ac495dSmrg this); 32336ac495dSmrg } 32436ac495dSmrg#endif 32536ac495dSmrg 32636ac495dSmrg iterator 32736ac495dSmrg#if __cplusplus >= 201103L 32836ac495dSmrg insert(const_iterator __pos, const _Tp& __x) 32936ac495dSmrg#else 33036ac495dSmrg insert(iterator __pos, const _Tp& __x) 33136ac495dSmrg#endif 33236ac495dSmrg { 33336ac495dSmrg _M_profile_insert(__pos, this->size()); 33436ac495dSmrg return iterator(_Base::insert(__pos.base(), __x), this); 33536ac495dSmrg } 33636ac495dSmrg 33736ac495dSmrg#if __cplusplus >= 201103L 33836ac495dSmrg iterator 33936ac495dSmrg insert(const_iterator __pos, _Tp&& __x) 34036ac495dSmrg { 34136ac495dSmrg _M_profile_insert(__pos, this->size()); 34236ac495dSmrg return iterator(_Base::emplace(__pos.base(), std::move(__x)), 34336ac495dSmrg this); 34436ac495dSmrg } 34536ac495dSmrg 34636ac495dSmrg iterator 34736ac495dSmrg insert(const_iterator __pos, initializer_list<value_type> __l) 34836ac495dSmrg { 34936ac495dSmrg _M_profile_insert(__pos, this->size()); 35036ac495dSmrg return iterator(_Base::insert(__pos.base(), __l), this); 35136ac495dSmrg } 35236ac495dSmrg#endif 35336ac495dSmrg 35436ac495dSmrg#if __cplusplus >= 201103L 35536ac495dSmrg iterator 35636ac495dSmrg insert(const_iterator __pos, size_type __n, const _Tp& __x) 35736ac495dSmrg { 35836ac495dSmrg _M_profile_insert(__pos, this->size()); 35936ac495dSmrg return iterator(_Base::insert(__pos.base(), __n, __x), this); 36036ac495dSmrg } 36136ac495dSmrg#else 36236ac495dSmrg void 36336ac495dSmrg insert(iterator __pos, size_type __n, const _Tp& __x) 36436ac495dSmrg { 36536ac495dSmrg _M_profile_insert(__pos, this->size()); 36636ac495dSmrg _Base::insert(__pos.base(), __n, __x); 36736ac495dSmrg } 36836ac495dSmrg#endif 36936ac495dSmrg 37036ac495dSmrg#if __cplusplus >= 201103L 37136ac495dSmrg template<typename _InputIterator, 37236ac495dSmrg typename = std::_RequireInputIter<_InputIterator>> 37336ac495dSmrg iterator 37436ac495dSmrg insert(const_iterator __pos, _InputIterator __first, 37536ac495dSmrg _InputIterator __last) 37636ac495dSmrg { 37736ac495dSmrg _M_profile_insert(__pos, this->size()); 37836ac495dSmrg return iterator(_Base::insert(__pos.base(), __first, __last), 37936ac495dSmrg this); 38036ac495dSmrg } 38136ac495dSmrg#else 38236ac495dSmrg template<class _InputIterator> 38336ac495dSmrg void 38436ac495dSmrg insert(iterator __pos, _InputIterator __first, 38536ac495dSmrg _InputIterator __last) 38636ac495dSmrg { 38736ac495dSmrg _M_profile_insert(__pos, this->size()); 38836ac495dSmrg _Base::insert(__pos.base(), __first, __last); 38936ac495dSmrg } 39036ac495dSmrg#endif 39136ac495dSmrg 39236ac495dSmrg iterator 39336ac495dSmrg#if __cplusplus >= 201103L 39436ac495dSmrg erase(const_iterator __pos) noexcept 39536ac495dSmrg#else 39636ac495dSmrg erase(iterator __pos) 39736ac495dSmrg#endif 39836ac495dSmrg { return iterator(_Base::erase(__pos.base()), this); } 39936ac495dSmrg 40036ac495dSmrg iterator 40136ac495dSmrg#if __cplusplus >= 201103L 40236ac495dSmrg erase(const_iterator __pos, const_iterator __last) noexcept 40336ac495dSmrg#else 40436ac495dSmrg erase(iterator __pos, iterator __last) 40536ac495dSmrg#endif 40636ac495dSmrg { 40736ac495dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 40836ac495dSmrg // 151. can't currently clear() empty container 40936ac495dSmrg return iterator(_Base::erase(__pos.base(), __last.base()), this); 41036ac495dSmrg } 41136ac495dSmrg 41236ac495dSmrg void 41336ac495dSmrg swap(list& __x) 41436ac495dSmrg _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) ) 41536ac495dSmrg { 41636ac495dSmrg _Base::swap(__x); 41736ac495dSmrg this->_M_swap(__x); 41836ac495dSmrg } 41936ac495dSmrg 42036ac495dSmrg void 42136ac495dSmrg clear() _GLIBCXX_NOEXCEPT 42236ac495dSmrg { 42336ac495dSmrg this->_M_profile_destruct(); 42436ac495dSmrg _Base::clear(); 42536ac495dSmrg this->_M_profile_construct(); 42636ac495dSmrg } 42736ac495dSmrg 42836ac495dSmrg // 23.2.2.4 list operations: 42936ac495dSmrg void 43036ac495dSmrg#if __cplusplus >= 201103L 43136ac495dSmrg splice(const_iterator __pos, list&& __x) noexcept 43236ac495dSmrg#else 43336ac495dSmrg splice(iterator __pos, list& __x) 43436ac495dSmrg#endif 43536ac495dSmrg { this->splice(__pos, _GLIBCXX_MOVE(__x), __x.begin(), __x.end()); } 43636ac495dSmrg 43736ac495dSmrg#if __cplusplus >= 201103L 43836ac495dSmrg void 43936ac495dSmrg splice(const_iterator __pos, list& __x) noexcept 44036ac495dSmrg { this->splice(__pos, std::move(__x)); } 44136ac495dSmrg 44236ac495dSmrg void 44336ac495dSmrg splice(const_iterator __pos, list& __x, const_iterator __i) 44436ac495dSmrg { this->splice(__pos, std::move(__x), __i); } 44536ac495dSmrg#endif 44636ac495dSmrg 44736ac495dSmrg void 44836ac495dSmrg#if __cplusplus >= 201103L 44936ac495dSmrg splice(const_iterator __pos, list&& __x, const_iterator __i) noexcept 45036ac495dSmrg#else 45136ac495dSmrg splice(iterator __pos, list& __x, iterator __i) 45236ac495dSmrg#endif 45336ac495dSmrg { 45436ac495dSmrg // We used to perform the splice_alloc check: not anymore, redundant 45536ac495dSmrg // after implementing the relevant bits of N1599. 45636ac495dSmrg 45736ac495dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 45836ac495dSmrg _Base::splice(__pos.base(), _GLIBCXX_MOVE(__x._M_base()), 45936ac495dSmrg __i.base()); 46036ac495dSmrg } 46136ac495dSmrg 46236ac495dSmrg void 46336ac495dSmrg#if __cplusplus >= 201103L 46436ac495dSmrg splice(const_iterator __pos, list&& __x, const_iterator __first, 46536ac495dSmrg const_iterator __last) noexcept 46636ac495dSmrg#else 46736ac495dSmrg splice(iterator __pos, list& __x, iterator __first, 46836ac495dSmrg iterator __last) 46936ac495dSmrg#endif 47036ac495dSmrg { 47136ac495dSmrg _Base::splice(__pos.base(), _GLIBCXX_MOVE(__x._M_base()), 47236ac495dSmrg __first.base(), __last.base()); 47336ac495dSmrg } 47436ac495dSmrg 47536ac495dSmrg#if __cplusplus >= 201103L 47636ac495dSmrg void 47736ac495dSmrg splice(const_iterator __pos, list& __x, 47836ac495dSmrg const_iterator __first, const_iterator __last) noexcept 47936ac495dSmrg { this->splice(__pos, std::move(__x), __first, __last); } 48036ac495dSmrg#endif 48136ac495dSmrg 48236ac495dSmrg void 48336ac495dSmrg remove(const _Tp& __value) 48436ac495dSmrg { 48536ac495dSmrg for (iterator __x = begin(); __x != end(); ) 48636ac495dSmrg { 48736ac495dSmrg if (*__x == __value) 48836ac495dSmrg __x = erase(__x); 48936ac495dSmrg else 49036ac495dSmrg ++__x; 49136ac495dSmrg } 49236ac495dSmrg } 49336ac495dSmrg 49436ac495dSmrg template<class _Predicate> 49536ac495dSmrg void 49636ac495dSmrg remove_if(_Predicate __pred) 49736ac495dSmrg { 49836ac495dSmrg for (iterator __x = begin(); __x != end(); ) 49936ac495dSmrg { 50036ac495dSmrg __profcxx_list2slist_operation(this->_M_list2slist_info); 50136ac495dSmrg if (__pred(*__x)) 50236ac495dSmrg __x = erase(__x); 50336ac495dSmrg else 50436ac495dSmrg ++__x; 50536ac495dSmrg } 50636ac495dSmrg } 50736ac495dSmrg 50836ac495dSmrg void 50936ac495dSmrg unique() 51036ac495dSmrg { 51136ac495dSmrg iterator __first = begin(); 51236ac495dSmrg iterator __last = end(); 51336ac495dSmrg if (__first == __last) 51436ac495dSmrg return; 51536ac495dSmrg iterator __next = __first; 51636ac495dSmrg while (++__next != __last) 51736ac495dSmrg { 51836ac495dSmrg __profcxx_list2slist_operation(this->_M_list2slist_info); 51936ac495dSmrg if (*__first == *__next) 52036ac495dSmrg erase(__next); 52136ac495dSmrg else 52236ac495dSmrg __first = __next; 52336ac495dSmrg __next = __first; 52436ac495dSmrg } 52536ac495dSmrg } 52636ac495dSmrg 52736ac495dSmrg template<class _BinaryPredicate> 52836ac495dSmrg void 52936ac495dSmrg unique(_BinaryPredicate __binary_pred) 53036ac495dSmrg { 53136ac495dSmrg iterator __first = begin(); 53236ac495dSmrg iterator __last = end(); 53336ac495dSmrg if (__first == __last) 53436ac495dSmrg return; 53536ac495dSmrg iterator __next = __first; 53636ac495dSmrg while (++__next != __last) 53736ac495dSmrg { 53836ac495dSmrg __profcxx_list2slist_operation(this->_M_list2slist_info); 53936ac495dSmrg if (__binary_pred(*__first, *__next)) 54036ac495dSmrg erase(__next); 54136ac495dSmrg else 54236ac495dSmrg __first = __next; 54336ac495dSmrg __next = __first; 54436ac495dSmrg } 54536ac495dSmrg } 54636ac495dSmrg 54736ac495dSmrg void 54836ac495dSmrg#if __cplusplus >= 201103L 54936ac495dSmrg merge(list&& __x) 55036ac495dSmrg#else 55136ac495dSmrg merge(list& __x) 55236ac495dSmrg#endif 55336ac495dSmrg { _Base::merge(_GLIBCXX_MOVE(__x._M_base())); } 55436ac495dSmrg 55536ac495dSmrg#if __cplusplus >= 201103L 55636ac495dSmrg void 55736ac495dSmrg merge(list& __x) 55836ac495dSmrg { this->merge(std::move(__x)); } 55936ac495dSmrg#endif 56036ac495dSmrg 56136ac495dSmrg template<class _Compare> 56236ac495dSmrg void 56336ac495dSmrg#if __cplusplus >= 201103L 56436ac495dSmrg merge(list&& __x, _Compare __comp) 56536ac495dSmrg#else 56636ac495dSmrg merge(list& __x, _Compare __comp) 56736ac495dSmrg#endif 56836ac495dSmrg { _Base::merge(_GLIBCXX_MOVE(__x._M_base()), __comp); } 56936ac495dSmrg 57036ac495dSmrg#if __cplusplus >= 201103L 57136ac495dSmrg template<typename _Compare> 57236ac495dSmrg void 57336ac495dSmrg merge(list& __x, _Compare __comp) 57436ac495dSmrg { this->merge(std::move(__x), __comp); } 57536ac495dSmrg#endif 57636ac495dSmrg 57736ac495dSmrg _Base& 57836ac495dSmrg _M_base() _GLIBCXX_NOEXCEPT { return *this; } 57936ac495dSmrg 58036ac495dSmrg const _Base& 58136ac495dSmrg _M_base() const _GLIBCXX_NOEXCEPT { return *this; } 58236ac495dSmrg 58336ac495dSmrg void _M_profile_iterate(int __rewind = 0) const 58436ac495dSmrg { 58536ac495dSmrg __profcxx_list2slist_operation(this->_M_list2slist_info); 58636ac495dSmrg __profcxx_list2vector_iterate(this->_M_list2vector_info, __rewind); 58736ac495dSmrg if (__rewind) 58836ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 58936ac495dSmrg } 59036ac495dSmrg 59136ac495dSmrg private: 59236ac495dSmrg size_type 59336ac495dSmrg _M_profile_insert(const_iterator __pos, size_type __size) 59436ac495dSmrg { 59536ac495dSmrg size_type __shift = 0; 59636ac495dSmrg typename _Base::const_iterator __it = __pos.base(); 59736ac495dSmrg for (; __it != _Base::end(); ++__it) 59836ac495dSmrg __shift++; 59936ac495dSmrg __profcxx_list2slist_rewind(this->_M_list2slist_info); 60036ac495dSmrg __profcxx_list2slist_operation(this->_M_list2slist_info); 60136ac495dSmrg __profcxx_list2vector_insert(this->_M_list2vector_info, __shift, __size); 60236ac495dSmrg } 60336ac495dSmrg }; 60436ac495dSmrg 60536ac495dSmrg template<typename _Tp, typename _Alloc> 60636ac495dSmrg inline bool 60736ac495dSmrg operator==(const list<_Tp, _Alloc>& __lhs, 60836ac495dSmrg const list<_Tp, _Alloc>& __rhs) 60936ac495dSmrg { return __lhs._M_base() == __rhs._M_base(); } 61036ac495dSmrg 61136ac495dSmrg template<typename _Tp, typename _Alloc> 61236ac495dSmrg inline bool 61336ac495dSmrg operator!=(const list<_Tp, _Alloc>& __lhs, 61436ac495dSmrg const list<_Tp, _Alloc>& __rhs) 61536ac495dSmrg { return __lhs._M_base() != __rhs._M_base(); } 61636ac495dSmrg 61736ac495dSmrg template<typename _Tp, typename _Alloc> 61836ac495dSmrg inline bool 61936ac495dSmrg operator<(const list<_Tp, _Alloc>& __lhs, 62036ac495dSmrg const list<_Tp, _Alloc>& __rhs) 62136ac495dSmrg { return __lhs._M_base() < __rhs._M_base(); } 62236ac495dSmrg 62336ac495dSmrg template<typename _Tp, typename _Alloc> 62436ac495dSmrg inline bool 62536ac495dSmrg operator<=(const list<_Tp, _Alloc>& __lhs, 62636ac495dSmrg const list<_Tp, _Alloc>& __rhs) 62736ac495dSmrg { return __lhs._M_base() <= __rhs._M_base(); } 62836ac495dSmrg 62936ac495dSmrg template<typename _Tp, typename _Alloc> 63036ac495dSmrg inline bool 63136ac495dSmrg operator>=(const list<_Tp, _Alloc>& __lhs, 63236ac495dSmrg const list<_Tp, _Alloc>& __rhs) 63336ac495dSmrg { return __lhs._M_base() >= __rhs._M_base(); } 63436ac495dSmrg 63536ac495dSmrg template<typename _Tp, typename _Alloc> 63636ac495dSmrg inline bool 63736ac495dSmrg operator>(const list<_Tp, _Alloc>& __lhs, 63836ac495dSmrg const list<_Tp, _Alloc>& __rhs) 63936ac495dSmrg { return __lhs._M_base() > __rhs._M_base(); } 64036ac495dSmrg 64136ac495dSmrg template<typename _Tp, typename _Alloc> 64236ac495dSmrg inline void 64336ac495dSmrg swap(list<_Tp, _Alloc>& __lhs, list<_Tp, _Alloc>& __rhs) 64436ac495dSmrg _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs))) 64536ac495dSmrg { __lhs.swap(__rhs); } 64636ac495dSmrg 64736ac495dSmrg} // namespace __profile 64836ac495dSmrg} // namespace std 64936ac495dSmrg 65036ac495dSmrg#endif 651