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