xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/profile/list (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino// Profiling list implementation -*- C++ -*-
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
4*e4b17023SJohn Marino//
5*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library.  This library is free
6*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the
7*e4b17023SJohn Marino// terms of the GNU General Public License as published by the
8*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option)
9*e4b17023SJohn Marino// any later version.
10*e4b17023SJohn Marino
11*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful,
12*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of
13*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*e4b17023SJohn Marino// GNU General Public License for more details.
15*e4b17023SJohn Marino
16*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional
17*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version
18*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation.
19*e4b17023SJohn Marino
20*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and
21*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program;
22*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>.
24*e4b17023SJohn Marino
25*e4b17023SJohn Marino/** @file profile/list
26*e4b17023SJohn Marino *  This file is a GNU profile extension to the Standard C++ Library.
27*e4b17023SJohn Marino */
28*e4b17023SJohn Marino
29*e4b17023SJohn Marino#ifndef _GLIBCXX_PROFILE_LIST
30*e4b17023SJohn Marino#define _GLIBCXX_PROFILE_LIST 1
31*e4b17023SJohn Marino
32*e4b17023SJohn Marino#include <list>
33*e4b17023SJohn Marino#include <profile/base.h>
34*e4b17023SJohn Marino#include <profile/iterator_tracker.h>
35*e4b17023SJohn Marino
36*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
37*e4b17023SJohn Marino{
38*e4b17023SJohn Marinonamespace __profile
39*e4b17023SJohn Marino{
40*e4b17023SJohn Marino  /** @brief List wrapper with performance instrumentation.  */
41*e4b17023SJohn Marinotemplate<typename _Tp, typename _Allocator = std::allocator<_Tp> >
42*e4b17023SJohn Marino    class list
43*e4b17023SJohn Marino    : public _GLIBCXX_STD_C::list<_Tp, _Allocator>
44*e4b17023SJohn Marino    {
45*e4b17023SJohn Marino      typedef _GLIBCXX_STD_C::list<_Tp, _Allocator> _Base;
46*e4b17023SJohn Marino
47*e4b17023SJohn Marino    public:
48*e4b17023SJohn Marino      typedef typename _Base::reference             reference;
49*e4b17023SJohn Marino      typedef typename _Base::const_reference       const_reference;
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino      typedef __iterator_tracker<typename _Base::iterator, list>
52*e4b17023SJohn Marino				                    iterator;
53*e4b17023SJohn Marino      typedef __iterator_tracker<typename _Base::const_iterator, list>
54*e4b17023SJohn Marino                                                    const_iterator;
55*e4b17023SJohn Marino
56*e4b17023SJohn Marino      typedef typename _Base::size_type             size_type;
57*e4b17023SJohn Marino      typedef typename _Base::difference_type       difference_type;
58*e4b17023SJohn Marino
59*e4b17023SJohn Marino      typedef _Tp				    value_type;
60*e4b17023SJohn Marino      typedef _Allocator			    allocator_type;
61*e4b17023SJohn Marino      typedef typename _Base::pointer               pointer;
62*e4b17023SJohn Marino      typedef typename _Base::const_pointer         const_pointer;
63*e4b17023SJohn Marino      typedef std::reverse_iterator<iterator>       reverse_iterator;
64*e4b17023SJohn Marino      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
65*e4b17023SJohn Marino
66*e4b17023SJohn Marino      // 23.2.2.1 construct/copy/destroy:
67*e4b17023SJohn Marino      explicit
68*e4b17023SJohn Marino      list(const _Allocator& __a = _Allocator())
69*e4b17023SJohn Marino      : _Base(__a)
70*e4b17023SJohn Marino      {
71*e4b17023SJohn Marino        __profcxx_list_construct(this); 	// list2slist
72*e4b17023SJohn Marino        __profcxx_list_construct2(this); 	// list2vector
73*e4b17023SJohn Marino      }
74*e4b17023SJohn Marino
75*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
76*e4b17023SJohn Marino      explicit
77*e4b17023SJohn Marino      list(size_type __n)
78*e4b17023SJohn Marino      : _Base(__n)
79*e4b17023SJohn Marino      {
80*e4b17023SJohn Marino        __profcxx_list_construct(this);
81*e4b17023SJohn Marino        __profcxx_list_construct2(this);
82*e4b17023SJohn Marino      }
83*e4b17023SJohn Marino
84*e4b17023SJohn Marino      list(size_type __n, const _Tp& __value,
85*e4b17023SJohn Marino	   const _Allocator& __a = _Allocator())
86*e4b17023SJohn Marino      : _Base(__n, __value, __a)
87*e4b17023SJohn Marino      {
88*e4b17023SJohn Marino        __profcxx_list_construct(this);
89*e4b17023SJohn Marino        __profcxx_list_construct2(this);
90*e4b17023SJohn Marino      }
91*e4b17023SJohn Marino#else
92*e4b17023SJohn Marino      explicit
93*e4b17023SJohn Marino      list(size_type __n, const _Tp& __value = _Tp(),
94*e4b17023SJohn Marino	   const _Allocator& __a = _Allocator())
95*e4b17023SJohn Marino      : _Base(__n, __value, __a)
96*e4b17023SJohn Marino      {
97*e4b17023SJohn Marino        __profcxx_list_construct(this);
98*e4b17023SJohn Marino        __profcxx_list_construct2(this);
99*e4b17023SJohn Marino      }
100*e4b17023SJohn Marino#endif
101*e4b17023SJohn Marino
102*e4b17023SJohn Marino      template<class _InputIterator>
103*e4b17023SJohn Marino      list(_InputIterator __first, _InputIterator __last,
104*e4b17023SJohn Marino	   const _Allocator& __a = _Allocator())
105*e4b17023SJohn Marino      : _Base(__first, __last, __a)
106*e4b17023SJohn Marino      {
107*e4b17023SJohn Marino        __profcxx_list_construct(this);
108*e4b17023SJohn Marino        __profcxx_list_construct2(this);
109*e4b17023SJohn Marino      }
110*e4b17023SJohn Marino
111*e4b17023SJohn Marino      list(const list& __x)
112*e4b17023SJohn Marino      : _Base(__x)
113*e4b17023SJohn Marino      {
114*e4b17023SJohn Marino        __profcxx_list_construct(this);
115*e4b17023SJohn Marino        __profcxx_list_construct2(this);
116*e4b17023SJohn Marino      }
117*e4b17023SJohn Marino
118*e4b17023SJohn Marino      list(const _Base& __x)
119*e4b17023SJohn Marino      : _Base(__x)
120*e4b17023SJohn Marino      {
121*e4b17023SJohn Marino        __profcxx_list_construct(this);
122*e4b17023SJohn Marino        __profcxx_list_construct2(this);
123*e4b17023SJohn Marino      }
124*e4b17023SJohn Marino
125*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
126*e4b17023SJohn Marino      list(list&& __x) noexcept
127*e4b17023SJohn Marino      : _Base(std::move(__x))
128*e4b17023SJohn Marino      {
129*e4b17023SJohn Marino        __profcxx_list_construct(this);
130*e4b17023SJohn Marino        __profcxx_list_construct2(this);
131*e4b17023SJohn Marino      }
132*e4b17023SJohn Marino
133*e4b17023SJohn Marino      list(initializer_list<value_type> __l,
134*e4b17023SJohn Marino           const allocator_type& __a = allocator_type())
135*e4b17023SJohn Marino        : _Base(__l, __a) { }
136*e4b17023SJohn Marino#endif
137*e4b17023SJohn Marino
138*e4b17023SJohn Marino      ~list() _GLIBCXX_NOEXCEPT
139*e4b17023SJohn Marino      {
140*e4b17023SJohn Marino        __profcxx_list_destruct(this);
141*e4b17023SJohn Marino        __profcxx_list_destruct2(this);
142*e4b17023SJohn Marino      }
143*e4b17023SJohn Marino
144*e4b17023SJohn Marino      list&
145*e4b17023SJohn Marino      operator=(const list& __x)
146*e4b17023SJohn Marino      {
147*e4b17023SJohn Marino	static_cast<_Base&>(*this) = __x;
148*e4b17023SJohn Marino	return *this;
149*e4b17023SJohn Marino      }
150*e4b17023SJohn Marino
151*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
152*e4b17023SJohn Marino      list&
153*e4b17023SJohn Marino      operator=(list&& __x)
154*e4b17023SJohn Marino      {
155*e4b17023SJohn Marino	// NB: DR 1204.
156*e4b17023SJohn Marino	// NB: DR 675.
157*e4b17023SJohn Marino	this->clear();
158*e4b17023SJohn Marino	this->swap(__x);
159*e4b17023SJohn Marino	return *this;
160*e4b17023SJohn Marino      }
161*e4b17023SJohn Marino
162*e4b17023SJohn Marino      list&
163*e4b17023SJohn Marino      operator=(initializer_list<value_type> __l)
164*e4b17023SJohn Marino      {
165*e4b17023SJohn Marino	static_cast<_Base&>(*this) = __l;
166*e4b17023SJohn Marino	return *this;
167*e4b17023SJohn Marino      }
168*e4b17023SJohn Marino
169*e4b17023SJohn Marino      void
170*e4b17023SJohn Marino      assign(initializer_list<value_type> __l)
171*e4b17023SJohn Marino      {	_Base::assign(__l); }
172*e4b17023SJohn Marino#endif
173*e4b17023SJohn Marino
174*e4b17023SJohn Marino      template<class _InputIterator>
175*e4b17023SJohn Marino        void
176*e4b17023SJohn Marino        assign(_InputIterator __first, _InputIterator __last)
177*e4b17023SJohn Marino        { _Base::assign(__first, __last); }
178*e4b17023SJohn Marino
179*e4b17023SJohn Marino      void
180*e4b17023SJohn Marino      assign(size_type __n, const _Tp& __t)
181*e4b17023SJohn Marino      {	_Base::assign(__n, __t); }
182*e4b17023SJohn Marino
183*e4b17023SJohn Marino      using _Base::get_allocator;
184*e4b17023SJohn Marino
185*e4b17023SJohn Marino      // iterators:
186*e4b17023SJohn Marino      iterator
187*e4b17023SJohn Marino      begin() _GLIBCXX_NOEXCEPT
188*e4b17023SJohn Marino      { return iterator(_Base::begin(), this); }
189*e4b17023SJohn Marino
190*e4b17023SJohn Marino      const_iterator
191*e4b17023SJohn Marino      begin() const _GLIBCXX_NOEXCEPT
192*e4b17023SJohn Marino      { return const_iterator(_Base::begin(), this); }
193*e4b17023SJohn Marino
194*e4b17023SJohn Marino      iterator
195*e4b17023SJohn Marino      end() _GLIBCXX_NOEXCEPT
196*e4b17023SJohn Marino      {
197*e4b17023SJohn Marino        __profcxx_list_rewind(this);
198*e4b17023SJohn Marino        return iterator(_Base::end(), this);
199*e4b17023SJohn Marino      }
200*e4b17023SJohn Marino
201*e4b17023SJohn Marino      const_iterator
202*e4b17023SJohn Marino      end() const _GLIBCXX_NOEXCEPT
203*e4b17023SJohn Marino      {
204*e4b17023SJohn Marino        __profcxx_list_rewind(this);
205*e4b17023SJohn Marino        return const_iterator(_Base::end(), this);
206*e4b17023SJohn Marino      }
207*e4b17023SJohn Marino
208*e4b17023SJohn Marino      reverse_iterator
209*e4b17023SJohn Marino      rbegin() _GLIBCXX_NOEXCEPT
210*e4b17023SJohn Marino      {
211*e4b17023SJohn Marino        __profcxx_list_rewind(this);
212*e4b17023SJohn Marino        return reverse_iterator(end());
213*e4b17023SJohn Marino      }
214*e4b17023SJohn Marino
215*e4b17023SJohn Marino      const_reverse_iterator
216*e4b17023SJohn Marino      rbegin() const _GLIBCXX_NOEXCEPT
217*e4b17023SJohn Marino      {
218*e4b17023SJohn Marino        __profcxx_list_rewind(this);
219*e4b17023SJohn Marino        return const_reverse_iterator(end());
220*e4b17023SJohn Marino      }
221*e4b17023SJohn Marino
222*e4b17023SJohn Marino      reverse_iterator
223*e4b17023SJohn Marino      rend() _GLIBCXX_NOEXCEPT
224*e4b17023SJohn Marino      { return reverse_iterator(begin()); }
225*e4b17023SJohn Marino
226*e4b17023SJohn Marino      const_reverse_iterator
227*e4b17023SJohn Marino      rend() const _GLIBCXX_NOEXCEPT
228*e4b17023SJohn Marino      { return const_reverse_iterator(begin()); }
229*e4b17023SJohn Marino
230*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
231*e4b17023SJohn Marino      const_iterator
232*e4b17023SJohn Marino      cbegin() const noexcept
233*e4b17023SJohn Marino      { return const_iterator(_Base::begin(), this); }
234*e4b17023SJohn Marino
235*e4b17023SJohn Marino      const_iterator
236*e4b17023SJohn Marino      cend() const noexcept
237*e4b17023SJohn Marino      { return const_iterator(_Base::end(), this); }
238*e4b17023SJohn Marino
239*e4b17023SJohn Marino      const_reverse_iterator
240*e4b17023SJohn Marino      crbegin() const noexcept
241*e4b17023SJohn Marino      { return const_reverse_iterator(end()); }
242*e4b17023SJohn Marino
243*e4b17023SJohn Marino      const_reverse_iterator
244*e4b17023SJohn Marino      crend() const noexcept
245*e4b17023SJohn Marino      { return const_reverse_iterator(begin()); }
246*e4b17023SJohn Marino#endif
247*e4b17023SJohn Marino
248*e4b17023SJohn Marino      // 23.2.2.2 capacity:
249*e4b17023SJohn Marino      using _Base::empty;
250*e4b17023SJohn Marino      using _Base::size;
251*e4b17023SJohn Marino      using _Base::max_size;
252*e4b17023SJohn Marino
253*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
254*e4b17023SJohn Marino      void
255*e4b17023SJohn Marino      resize(size_type __sz)
256*e4b17023SJohn Marino      { _Base::resize(__sz); }
257*e4b17023SJohn Marino
258*e4b17023SJohn Marino      void
259*e4b17023SJohn Marino      resize(size_type __sz, const _Tp& __c)
260*e4b17023SJohn Marino      { _Base::resize(__sz, __c); }
261*e4b17023SJohn Marino#else
262*e4b17023SJohn Marino      void
263*e4b17023SJohn Marino      resize(size_type __sz, _Tp __c = _Tp())
264*e4b17023SJohn Marino      { _Base::resize(__sz, __c); }
265*e4b17023SJohn Marino#endif
266*e4b17023SJohn Marino
267*e4b17023SJohn Marino      // element access:
268*e4b17023SJohn Marino      reference
269*e4b17023SJohn Marino      front()
270*e4b17023SJohn Marino      { return _Base::front(); }
271*e4b17023SJohn Marino
272*e4b17023SJohn Marino      const_reference
273*e4b17023SJohn Marino      front() const
274*e4b17023SJohn Marino      { return _Base::front(); }
275*e4b17023SJohn Marino
276*e4b17023SJohn Marino      reference
277*e4b17023SJohn Marino      back()
278*e4b17023SJohn Marino      {
279*e4b17023SJohn Marino        __profcxx_list_rewind(this);
280*e4b17023SJohn Marino	return _Base::back();
281*e4b17023SJohn Marino      }
282*e4b17023SJohn Marino
283*e4b17023SJohn Marino      const_reference
284*e4b17023SJohn Marino      back() const
285*e4b17023SJohn Marino      {
286*e4b17023SJohn Marino        __profcxx_list_rewind(this);
287*e4b17023SJohn Marino	return _Base::back();
288*e4b17023SJohn Marino      }
289*e4b17023SJohn Marino
290*e4b17023SJohn Marino      // 23.2.2.3 modifiers:
291*e4b17023SJohn Marino      void
292*e4b17023SJohn Marino      push_front(const value_type& __x)
293*e4b17023SJohn Marino      {
294*e4b17023SJohn Marino        __profcxx_list_invalid_operator(this);
295*e4b17023SJohn Marino        __profcxx_list_operation(this);
296*e4b17023SJohn Marino        _Base::push_front(__x);
297*e4b17023SJohn Marino      }
298*e4b17023SJohn Marino
299*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
300*e4b17023SJohn Marino      using _Base::emplace_front;
301*e4b17023SJohn Marino#endif
302*e4b17023SJohn Marino
303*e4b17023SJohn Marino      void
304*e4b17023SJohn Marino      pop_front()
305*e4b17023SJohn Marino      {
306*e4b17023SJohn Marino        __profcxx_list_operation(this);
307*e4b17023SJohn Marino	_Base::pop_front();
308*e4b17023SJohn Marino      }
309*e4b17023SJohn Marino
310*e4b17023SJohn Marino      using _Base::push_back;
311*e4b17023SJohn Marino
312*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
313*e4b17023SJohn Marino      using _Base::emplace_back;
314*e4b17023SJohn Marino#endif
315*e4b17023SJohn Marino
316*e4b17023SJohn Marino      void
317*e4b17023SJohn Marino      pop_back()
318*e4b17023SJohn Marino      {
319*e4b17023SJohn Marino	iterator __victim = end();
320*e4b17023SJohn Marino	--__victim;
321*e4b17023SJohn Marino	_Base::pop_back();
322*e4b17023SJohn Marino        __profcxx_list_rewind(this);
323*e4b17023SJohn Marino      }
324*e4b17023SJohn Marino
325*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
326*e4b17023SJohn Marino      template<typename... _Args>
327*e4b17023SJohn Marino        iterator
328*e4b17023SJohn Marino        emplace(iterator __position, _Args&&... __args)
329*e4b17023SJohn Marino	{
330*e4b17023SJohn Marino	  return iterator(_Base::emplace(__position.base(),
331*e4b17023SJohn Marino                                         std::forward<_Args>(__args)...));
332*e4b17023SJohn Marino	}
333*e4b17023SJohn Marino#endif
334*e4b17023SJohn Marino
335*e4b17023SJohn Marino      iterator
336*e4b17023SJohn Marino      insert(iterator __position, const _Tp& __x)
337*e4b17023SJohn Marino      {
338*e4b17023SJohn Marino        _M_profile_insert(this, __position, size());
339*e4b17023SJohn Marino        return iterator(_Base::insert(__position.base(), __x), this);
340*e4b17023SJohn Marino      }
341*e4b17023SJohn Marino
342*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
343*e4b17023SJohn Marino      iterator
344*e4b17023SJohn Marino      insert(iterator __position, _Tp&& __x)
345*e4b17023SJohn Marino      {
346*e4b17023SJohn Marino        _M_profile_insert(this, __position, size());
347*e4b17023SJohn Marino        return iterator(_Base::emplace(__position.base(), std::move(__x)),
348*e4b17023SJohn Marino                        this);
349*e4b17023SJohn Marino      }
350*e4b17023SJohn Marino
351*e4b17023SJohn Marino      void
352*e4b17023SJohn Marino      insert(iterator __position, initializer_list<value_type> __l)
353*e4b17023SJohn Marino      {
354*e4b17023SJohn Marino        _M_profile_insert(this, __position, size());
355*e4b17023SJohn Marino        _Base::insert(__position.base(), __l);
356*e4b17023SJohn Marino      }
357*e4b17023SJohn Marino#endif
358*e4b17023SJohn Marino
359*e4b17023SJohn Marino      void
360*e4b17023SJohn Marino      insert(iterator __position, size_type __n, const _Tp& __x)
361*e4b17023SJohn Marino      {
362*e4b17023SJohn Marino        _M_profile_insert(this, __position, size());
363*e4b17023SJohn Marino	_Base::insert(__position.base(), __n, __x);
364*e4b17023SJohn Marino      }
365*e4b17023SJohn Marino
366*e4b17023SJohn Marino      template<class _InputIterator>
367*e4b17023SJohn Marino        void
368*e4b17023SJohn Marino        insert(iterator __position, _InputIterator __first,
369*e4b17023SJohn Marino	       _InputIterator __last)
370*e4b17023SJohn Marino      {
371*e4b17023SJohn Marino        _M_profile_insert(this, __position, size());
372*e4b17023SJohn Marino        _Base::insert(__position.base(), __first, __last);
373*e4b17023SJohn Marino      }
374*e4b17023SJohn Marino
375*e4b17023SJohn Marino      iterator
376*e4b17023SJohn Marino      erase(iterator __position)
377*e4b17023SJohn Marino      {	return iterator(_Base::erase(__position.base()), this); }
378*e4b17023SJohn Marino
379*e4b17023SJohn Marino      iterator
380*e4b17023SJohn Marino      erase(iterator __position, iterator __last)
381*e4b17023SJohn Marino      {
382*e4b17023SJohn Marino	// _GLIBCXX_RESOLVE_LIB_DEFECTS
383*e4b17023SJohn Marino	// 151. can't currently clear() empty container
384*e4b17023SJohn Marino	return iterator(_Base::erase(__position.base(), __last.base()), this);
385*e4b17023SJohn Marino      }
386*e4b17023SJohn Marino
387*e4b17023SJohn Marino      void
388*e4b17023SJohn Marino      swap(list& __x)
389*e4b17023SJohn Marino      {	_Base::swap(__x); }
390*e4b17023SJohn Marino
391*e4b17023SJohn Marino      void
392*e4b17023SJohn Marino      clear() _GLIBCXX_NOEXCEPT
393*e4b17023SJohn Marino      {	_Base::clear(); }
394*e4b17023SJohn Marino
395*e4b17023SJohn Marino      // 23.2.2.4 list operations:
396*e4b17023SJohn Marino      void
397*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
398*e4b17023SJohn Marino      splice(iterator __position, list&& __x)
399*e4b17023SJohn Marino#else
400*e4b17023SJohn Marino      splice(iterator __position, list& __x)
401*e4b17023SJohn Marino#endif
402*e4b17023SJohn Marino      { this->splice(__position, _GLIBCXX_MOVE(__x), __x.begin(), __x.end()); }
403*e4b17023SJohn Marino
404*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
405*e4b17023SJohn Marino      void
406*e4b17023SJohn Marino      splice(iterator __position, list& __x)
407*e4b17023SJohn Marino      { this->splice(__position, std::move(__x)); }
408*e4b17023SJohn Marino#endif
409*e4b17023SJohn Marino
410*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
411*e4b17023SJohn Marino      void
412*e4b17023SJohn Marino      splice(iterator __position, list& __x, iterator __i)
413*e4b17023SJohn Marino      { this->splice(__position, std::move(__x), __i); }
414*e4b17023SJohn Marino#endif
415*e4b17023SJohn Marino
416*e4b17023SJohn Marino      void
417*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
418*e4b17023SJohn Marino      splice(iterator __position, list&& __x, iterator __i)
419*e4b17023SJohn Marino#else
420*e4b17023SJohn Marino      splice(iterator __position, list& __x, iterator __i)
421*e4b17023SJohn Marino#endif
422*e4b17023SJohn Marino      {
423*e4b17023SJohn Marino	// We used to perform the splice_alloc check:  not anymore, redundant
424*e4b17023SJohn Marino	// after implementing the relevant bits of N1599.
425*e4b17023SJohn Marino
426*e4b17023SJohn Marino	// _GLIBCXX_RESOLVE_LIB_DEFECTS
427*e4b17023SJohn Marino	_Base::splice(__position.base(), _GLIBCXX_MOVE(__x._M_base()),
428*e4b17023SJohn Marino		      __i.base());
429*e4b17023SJohn Marino      }
430*e4b17023SJohn Marino
431*e4b17023SJohn Marino      void
432*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
433*e4b17023SJohn Marino      splice(iterator __position, list&& __x, iterator __first,
434*e4b17023SJohn Marino	     iterator __last)
435*e4b17023SJohn Marino#else
436*e4b17023SJohn Marino      splice(iterator __position, list& __x, iterator __first,
437*e4b17023SJohn Marino	     iterator __last)
438*e4b17023SJohn Marino#endif
439*e4b17023SJohn Marino      {
440*e4b17023SJohn Marino	// We used to perform the splice_alloc check:  not anymore, redundant
441*e4b17023SJohn Marino	// after implementing the relevant bits of N1599.
442*e4b17023SJohn Marino
443*e4b17023SJohn Marino	_Base::splice(__position.base(), _GLIBCXX_MOVE(__x._M_base()),
444*e4b17023SJohn Marino		      __first.base(), __last.base());
445*e4b17023SJohn Marino      }
446*e4b17023SJohn Marino
447*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
448*e4b17023SJohn Marino      void
449*e4b17023SJohn Marino      splice(iterator __position, list& __x, iterator __first, iterator __last)
450*e4b17023SJohn Marino      { this->splice(__position, std::move(__x), __first, __last); }
451*e4b17023SJohn Marino#endif
452*e4b17023SJohn Marino
453*e4b17023SJohn Marino      void
454*e4b17023SJohn Marino      remove(const _Tp& __value)
455*e4b17023SJohn Marino      {
456*e4b17023SJohn Marino	for (iterator __x = begin(); __x != end(); )
457*e4b17023SJohn Marino	  {
458*e4b17023SJohn Marino	    if (*__x == __value)
459*e4b17023SJohn Marino	      __x = erase(__x);
460*e4b17023SJohn Marino	    else
461*e4b17023SJohn Marino	      ++__x;
462*e4b17023SJohn Marino	  }
463*e4b17023SJohn Marino      }
464*e4b17023SJohn Marino
465*e4b17023SJohn Marino      template<class _Predicate>
466*e4b17023SJohn Marino        void
467*e4b17023SJohn Marino        remove_if(_Predicate __pred)
468*e4b17023SJohn Marino        {
469*e4b17023SJohn Marino	  for (iterator __x = begin(); __x != end(); )
470*e4b17023SJohn Marino	    {
471*e4b17023SJohn Marino              __profcxx_list_operation(this);
472*e4b17023SJohn Marino	      if (__pred(*__x))
473*e4b17023SJohn Marino		__x = erase(__x);
474*e4b17023SJohn Marino	      else
475*e4b17023SJohn Marino		++__x;
476*e4b17023SJohn Marino	    }
477*e4b17023SJohn Marino	}
478*e4b17023SJohn Marino
479*e4b17023SJohn Marino      void
480*e4b17023SJohn Marino      unique()
481*e4b17023SJohn Marino      {
482*e4b17023SJohn Marino	iterator __first = begin();
483*e4b17023SJohn Marino	iterator __last = end();
484*e4b17023SJohn Marino	if (__first == __last)
485*e4b17023SJohn Marino	  return;
486*e4b17023SJohn Marino	iterator __next = __first;
487*e4b17023SJohn Marino	while (++__next != __last)
488*e4b17023SJohn Marino	  {
489*e4b17023SJohn Marino            __profcxx_list_operation(this);
490*e4b17023SJohn Marino	    if (*__first == *__next)
491*e4b17023SJohn Marino	      erase(__next);
492*e4b17023SJohn Marino	    else
493*e4b17023SJohn Marino	      __first = __next;
494*e4b17023SJohn Marino	    __next = __first;
495*e4b17023SJohn Marino	  }
496*e4b17023SJohn Marino      }
497*e4b17023SJohn Marino
498*e4b17023SJohn Marino      template<class _BinaryPredicate>
499*e4b17023SJohn Marino        void
500*e4b17023SJohn Marino        unique(_BinaryPredicate __binary_pred)
501*e4b17023SJohn Marino        {
502*e4b17023SJohn Marino	  iterator __first = begin();
503*e4b17023SJohn Marino	  iterator __last = end();
504*e4b17023SJohn Marino	  if (__first == __last)
505*e4b17023SJohn Marino	    return;
506*e4b17023SJohn Marino	  iterator __next = __first;
507*e4b17023SJohn Marino	  while (++__next != __last)
508*e4b17023SJohn Marino	    {
509*e4b17023SJohn Marino              __profcxx_list_operation(this);
510*e4b17023SJohn Marino	      if (__binary_pred(*__first, *__next))
511*e4b17023SJohn Marino		erase(__next);
512*e4b17023SJohn Marino	      else
513*e4b17023SJohn Marino		__first = __next;
514*e4b17023SJohn Marino	      __next = __first;
515*e4b17023SJohn Marino	    }
516*e4b17023SJohn Marino	}
517*e4b17023SJohn Marino
518*e4b17023SJohn Marino      void
519*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
520*e4b17023SJohn Marino      merge(list&& __x)
521*e4b17023SJohn Marino#else
522*e4b17023SJohn Marino      merge(list& __x)
523*e4b17023SJohn Marino#endif
524*e4b17023SJohn Marino      {
525*e4b17023SJohn Marino	// _GLIBCXX_RESOLVE_LIB_DEFECTS
526*e4b17023SJohn Marino	// 300. list::merge() specification incomplete
527*e4b17023SJohn Marino	if (this != &__x)
528*e4b17023SJohn Marino	  { _Base::merge(_GLIBCXX_MOVE(__x._M_base())); }
529*e4b17023SJohn Marino      }
530*e4b17023SJohn Marino
531*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
532*e4b17023SJohn Marino      void
533*e4b17023SJohn Marino      merge(list& __x)
534*e4b17023SJohn Marino      { this->merge(std::move(__x)); }
535*e4b17023SJohn Marino#endif
536*e4b17023SJohn Marino
537*e4b17023SJohn Marino      template<class _Compare>
538*e4b17023SJohn Marino        void
539*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
540*e4b17023SJohn Marino        merge(list&& __x, _Compare __comp)
541*e4b17023SJohn Marino#else
542*e4b17023SJohn Marino        merge(list& __x, _Compare __comp)
543*e4b17023SJohn Marino#endif
544*e4b17023SJohn Marino        {
545*e4b17023SJohn Marino	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
546*e4b17023SJohn Marino	  // 300. list::merge() specification incomplete
547*e4b17023SJohn Marino	  if (this != &__x)
548*e4b17023SJohn Marino	    { _Base::merge(_GLIBCXX_MOVE(__x._M_base()), __comp); }
549*e4b17023SJohn Marino	}
550*e4b17023SJohn Marino
551*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
552*e4b17023SJohn Marino      template<typename _Compare>
553*e4b17023SJohn Marino        void
554*e4b17023SJohn Marino        merge(list& __x, _Compare __comp)
555*e4b17023SJohn Marino        { this->merge(std::move(__x), __comp); }
556*e4b17023SJohn Marino#endif
557*e4b17023SJohn Marino
558*e4b17023SJohn Marino      void
559*e4b17023SJohn Marino      sort() { _Base::sort(); }
560*e4b17023SJohn Marino
561*e4b17023SJohn Marino      template<typename _StrictWeakOrdering>
562*e4b17023SJohn Marino        void
563*e4b17023SJohn Marino        sort(_StrictWeakOrdering __pred) { _Base::sort(__pred); }
564*e4b17023SJohn Marino
565*e4b17023SJohn Marino      using _Base::reverse;
566*e4b17023SJohn Marino
567*e4b17023SJohn Marino      _Base&
568*e4b17023SJohn Marino      _M_base() _GLIBCXX_NOEXCEPT       { return *this; }
569*e4b17023SJohn Marino
570*e4b17023SJohn Marino      const _Base&
571*e4b17023SJohn Marino      _M_base() const _GLIBCXX_NOEXCEPT { return *this; }
572*e4b17023SJohn Marino
573*e4b17023SJohn Marino      void _M_profile_find() const
574*e4b17023SJohn Marino      { }
575*e4b17023SJohn Marino
576*e4b17023SJohn Marino      void _M_profile_iterate(int __rewind = 0) const
577*e4b17023SJohn Marino      {
578*e4b17023SJohn Marino        __profcxx_list_operation(this);
579*e4b17023SJohn Marino        __profcxx_list_iterate(this);
580*e4b17023SJohn Marino        if (__rewind)
581*e4b17023SJohn Marino          __profcxx_list_rewind(this);
582*e4b17023SJohn Marino      }
583*e4b17023SJohn Marino
584*e4b17023SJohn Marino    private:
585*e4b17023SJohn Marino      size_type _M_profile_insert(void* obj, iterator __pos, size_type __size)
586*e4b17023SJohn Marino      {
587*e4b17023SJohn Marino        size_type __shift = 0;
588*e4b17023SJohn Marino        typename _Base::iterator __it = __pos.base();
589*e4b17023SJohn Marino        for ( ; __it!=_Base::end(); __it++)
590*e4b17023SJohn Marino          __shift++;
591*e4b17023SJohn Marino        __profcxx_list_rewind(this);
592*e4b17023SJohn Marino        __profcxx_list_operation(this);
593*e4b17023SJohn Marino        __profcxx_list_insert(this, __shift, __size);
594*e4b17023SJohn Marino      }
595*e4b17023SJohn Marino    };
596*e4b17023SJohn Marino
597*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
598*e4b17023SJohn Marino    inline bool
599*e4b17023SJohn Marino    operator==(const list<_Tp, _Alloc>& __lhs,
600*e4b17023SJohn Marino	       const list<_Tp, _Alloc>& __rhs)
601*e4b17023SJohn Marino    { return __lhs._M_base() == __rhs._M_base(); }
602*e4b17023SJohn Marino
603*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
604*e4b17023SJohn Marino    inline bool
605*e4b17023SJohn Marino    operator!=(const list<_Tp, _Alloc>& __lhs,
606*e4b17023SJohn Marino	       const list<_Tp, _Alloc>& __rhs)
607*e4b17023SJohn Marino    { return __lhs._M_base() != __rhs._M_base(); }
608*e4b17023SJohn Marino
609*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
610*e4b17023SJohn Marino    inline bool
611*e4b17023SJohn Marino    operator<(const list<_Tp, _Alloc>& __lhs,
612*e4b17023SJohn Marino	      const list<_Tp, _Alloc>& __rhs)
613*e4b17023SJohn Marino    { return __lhs._M_base() < __rhs._M_base(); }
614*e4b17023SJohn Marino
615*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
616*e4b17023SJohn Marino    inline bool
617*e4b17023SJohn Marino    operator<=(const list<_Tp, _Alloc>& __lhs,
618*e4b17023SJohn Marino	       const list<_Tp, _Alloc>& __rhs)
619*e4b17023SJohn Marino    { return __lhs._M_base() <= __rhs._M_base(); }
620*e4b17023SJohn Marino
621*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
622*e4b17023SJohn Marino    inline bool
623*e4b17023SJohn Marino    operator>=(const list<_Tp, _Alloc>& __lhs,
624*e4b17023SJohn Marino	       const list<_Tp, _Alloc>& __rhs)
625*e4b17023SJohn Marino    { return __lhs._M_base() >= __rhs._M_base(); }
626*e4b17023SJohn Marino
627*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
628*e4b17023SJohn Marino    inline bool
629*e4b17023SJohn Marino    operator>(const list<_Tp, _Alloc>& __lhs,
630*e4b17023SJohn Marino	      const list<_Tp, _Alloc>& __rhs)
631*e4b17023SJohn Marino    { return __lhs._M_base() > __rhs._M_base(); }
632*e4b17023SJohn Marino
633*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
634*e4b17023SJohn Marino    inline void
635*e4b17023SJohn Marino    swap(list<_Tp, _Alloc>& __lhs, list<_Tp, _Alloc>& __rhs)
636*e4b17023SJohn Marino    { __lhs.swap(__rhs); }
637*e4b17023SJohn Marino
638*e4b17023SJohn Marino} // namespace __profile
639*e4b17023SJohn Marino} // namespace std
640*e4b17023SJohn Marino
641*e4b17023SJohn Marino#endif
642