xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/profile/list (revision c0a68be459da21030695f60d10265c2fc49758f8)
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