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