1ffeaf689SAlexander Kabaev// Debugging deque implementation -*- C++ -*-
2ffeaf689SAlexander Kabaev
3*f8a1b7d9SAlexander Kabaev// Copyright (C) 2003, 2004, 2005
4ffeaf689SAlexander Kabaev// Free Software Foundation, Inc.
5ffeaf689SAlexander Kabaev//
6ffeaf689SAlexander Kabaev// This file is part of the GNU ISO C++ Library.  This library is free
7ffeaf689SAlexander Kabaev// software; you can redistribute it and/or modify it under the
8ffeaf689SAlexander Kabaev// terms of the GNU General Public License as published by the
9ffeaf689SAlexander Kabaev// Free Software Foundation; either version 2, or (at your option)
10ffeaf689SAlexander Kabaev// any later version.
11ffeaf689SAlexander Kabaev
12ffeaf689SAlexander Kabaev// This library is distributed in the hope that it will be useful,
13ffeaf689SAlexander Kabaev// but WITHOUT ANY WARRANTY; without even the implied warranty of
14ffeaf689SAlexander Kabaev// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15ffeaf689SAlexander Kabaev// GNU General Public License for more details.
16ffeaf689SAlexander Kabaev
17ffeaf689SAlexander Kabaev// You should have received a copy of the GNU General Public License along
18ffeaf689SAlexander Kabaev// with this library; see the file COPYING.  If not, write to the Free
19*f8a1b7d9SAlexander Kabaev// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20ffeaf689SAlexander Kabaev// USA.
21ffeaf689SAlexander Kabaev
22ffeaf689SAlexander Kabaev// As a special exception, you may use this file as part of a free software
23ffeaf689SAlexander Kabaev// library without restriction.  Specifically, if other files instantiate
24ffeaf689SAlexander Kabaev// templates or use macros or inline functions from this file, or you compile
25ffeaf689SAlexander Kabaev// this file and link it with other files to produce an executable, this
26ffeaf689SAlexander Kabaev// file does not by itself cause the resulting executable to be covered by
27ffeaf689SAlexander Kabaev// the GNU General Public License.  This exception does not however
28ffeaf689SAlexander Kabaev// invalidate any other reasons why the executable file might be covered by
29ffeaf689SAlexander Kabaev// the GNU General Public License.
30ffeaf689SAlexander Kabaev
31*f8a1b7d9SAlexander Kabaev/** @file debug/deque
32*f8a1b7d9SAlexander Kabaev *  This file is a GNU debug extension to the Standard C++ Library.
33*f8a1b7d9SAlexander Kabaev */
34*f8a1b7d9SAlexander Kabaev
35ffeaf689SAlexander Kabaev#ifndef _GLIBCXX_DEBUG_DEQUE
36ffeaf689SAlexander Kabaev#define _GLIBCXX_DEBUG_DEQUE 1
37ffeaf689SAlexander Kabaev
38ffeaf689SAlexander Kabaev#include <deque>
39ffeaf689SAlexander Kabaev#include <debug/safe_sequence.h>
40ffeaf689SAlexander Kabaev#include <debug/safe_iterator.h>
41ffeaf689SAlexander Kabaev
42*f8a1b7d9SAlexander Kabaevnamespace std
43*f8a1b7d9SAlexander Kabaev{
44*f8a1b7d9SAlexander Kabaevnamespace __debug
45ffeaf689SAlexander Kabaev{
46ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
47ffeaf689SAlexander Kabaev    class deque
48ffeaf689SAlexander Kabaev    : public _GLIBCXX_STD::deque<_Tp, _Allocator>,
49ffeaf689SAlexander Kabaev      public __gnu_debug::_Safe_sequence<deque<_Tp, _Allocator> >
50ffeaf689SAlexander Kabaev    {
51ffeaf689SAlexander Kabaev      typedef  _GLIBCXX_STD::deque<_Tp, _Allocator> _Base;
52ffeaf689SAlexander Kabaev      typedef __gnu_debug::_Safe_sequence<deque> _Safe_base;
53ffeaf689SAlexander Kabaev
54ffeaf689SAlexander Kabaev    public:
55*f8a1b7d9SAlexander Kabaev      typedef typename _Base::reference             reference;
56*f8a1b7d9SAlexander Kabaev      typedef typename _Base::const_reference       const_reference;
57ffeaf689SAlexander Kabaev
58ffeaf689SAlexander Kabaev      typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,deque>
59ffeaf689SAlexander Kabaev						    iterator;
60ffeaf689SAlexander Kabaev      typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,deque>
61ffeaf689SAlexander Kabaev						     const_iterator;
62ffeaf689SAlexander Kabaev
63ffeaf689SAlexander Kabaev      typedef typename _Base::size_type             size_type;
64ffeaf689SAlexander Kabaev      typedef typename _Base::difference_type       difference_type;
65ffeaf689SAlexander Kabaev
66ffeaf689SAlexander Kabaev      typedef _Tp				    value_type;
67ffeaf689SAlexander Kabaev      typedef _Allocator			    allocator_type;
68*f8a1b7d9SAlexander Kabaev      typedef typename _Base::pointer               pointer;
69*f8a1b7d9SAlexander Kabaev      typedef typename _Base::const_pointer         const_pointer;
70ffeaf689SAlexander Kabaev      typedef std::reverse_iterator<iterator>       reverse_iterator;
71ffeaf689SAlexander Kabaev      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
72ffeaf689SAlexander Kabaev
73ffeaf689SAlexander Kabaev      // 23.2.1.1 construct/copy/destroy:
74ffeaf689SAlexander Kabaev      explicit deque(const _Allocator& __a = _Allocator())
75ffeaf689SAlexander Kabaev      : _Base(__a) { }
76ffeaf689SAlexander Kabaev
77ffeaf689SAlexander Kabaev      explicit deque(size_type __n, const _Tp& __value = _Tp(),
78ffeaf689SAlexander Kabaev		     const _Allocator& __a = _Allocator())
79ffeaf689SAlexander Kabaev      : _Base(__n, __value, __a) { }
80ffeaf689SAlexander Kabaev
81ffeaf689SAlexander Kabaev      template<class _InputIterator>
82ffeaf689SAlexander Kabaev        deque(_InputIterator __first, _InputIterator __last,
83ffeaf689SAlexander Kabaev	      const _Allocator& __a = _Allocator())
84ffeaf689SAlexander Kabaev	: _Base(__gnu_debug::__check_valid_range(__first, __last), __last, __a)
85ffeaf689SAlexander Kabaev        { }
86ffeaf689SAlexander Kabaev
87ffeaf689SAlexander Kabaev      deque(const deque<_Tp,_Allocator>& __x) : _Base(__x), _Safe_base() { }
88ffeaf689SAlexander Kabaev
89ffeaf689SAlexander Kabaev      deque(const _Base& __x) : _Base(__x), _Safe_base() { }
90ffeaf689SAlexander Kabaev
91ffeaf689SAlexander Kabaev      ~deque() { }
92ffeaf689SAlexander Kabaev
93ffeaf689SAlexander Kabaev      deque<_Tp,_Allocator>&
94ffeaf689SAlexander Kabaev      operator=(const deque<_Tp,_Allocator>& __x)
95ffeaf689SAlexander Kabaev      {
96ffeaf689SAlexander Kabaev	*static_cast<_Base*>(this) = __x;
97ffeaf689SAlexander Kabaev	this->_M_invalidate_all();
98ffeaf689SAlexander Kabaev	return *this;
99ffeaf689SAlexander Kabaev      }
100ffeaf689SAlexander Kabaev
101ffeaf689SAlexander Kabaev      template<class _InputIterator>
102ffeaf689SAlexander Kabaev        void
103ffeaf689SAlexander Kabaev        assign(_InputIterator __first, _InputIterator __last)
104ffeaf689SAlexander Kabaev        {
105ffeaf689SAlexander Kabaev	  __glibcxx_check_valid_range(__first, __last);
106ffeaf689SAlexander Kabaev	  _Base::assign(__first, __last);
107ffeaf689SAlexander Kabaev	  this->_M_invalidate_all();
108ffeaf689SAlexander Kabaev	}
109ffeaf689SAlexander Kabaev
110ffeaf689SAlexander Kabaev      void
111ffeaf689SAlexander Kabaev      assign(size_type __n, const _Tp& __t)
112ffeaf689SAlexander Kabaev      {
113ffeaf689SAlexander Kabaev	_Base::assign(__n, __t);
114ffeaf689SAlexander Kabaev	this->_M_invalidate_all();
115ffeaf689SAlexander Kabaev      }
116ffeaf689SAlexander Kabaev
117ffeaf689SAlexander Kabaev      using _Base::get_allocator;
118ffeaf689SAlexander Kabaev
119ffeaf689SAlexander Kabaev      // iterators:
120ffeaf689SAlexander Kabaev      iterator
121ffeaf689SAlexander Kabaev      begin()
122ffeaf689SAlexander Kabaev      { return iterator(_Base::begin(), this); }
123ffeaf689SAlexander Kabaev
124ffeaf689SAlexander Kabaev      const_iterator
125ffeaf689SAlexander Kabaev      begin() const
126ffeaf689SAlexander Kabaev      { return const_iterator(_Base::begin(), this); }
127ffeaf689SAlexander Kabaev
128ffeaf689SAlexander Kabaev      iterator
129ffeaf689SAlexander Kabaev      end()
130ffeaf689SAlexander Kabaev      { return iterator(_Base::end(), this); }
131ffeaf689SAlexander Kabaev
132ffeaf689SAlexander Kabaev      const_iterator
133ffeaf689SAlexander Kabaev      end() const
134ffeaf689SAlexander Kabaev      { return const_iterator(_Base::end(), this); }
135ffeaf689SAlexander Kabaev
136ffeaf689SAlexander Kabaev      reverse_iterator
137ffeaf689SAlexander Kabaev      rbegin()
138ffeaf689SAlexander Kabaev      { return reverse_iterator(end()); }
139ffeaf689SAlexander Kabaev
140ffeaf689SAlexander Kabaev      const_reverse_iterator
141ffeaf689SAlexander Kabaev      rbegin() const
142ffeaf689SAlexander Kabaev      { return const_reverse_iterator(end()); }
143ffeaf689SAlexander Kabaev
144ffeaf689SAlexander Kabaev      reverse_iterator
145ffeaf689SAlexander Kabaev      rend()
146ffeaf689SAlexander Kabaev      { return reverse_iterator(begin()); }
147ffeaf689SAlexander Kabaev
148ffeaf689SAlexander Kabaev      const_reverse_iterator
149ffeaf689SAlexander Kabaev      rend() const
150ffeaf689SAlexander Kabaev      { return const_reverse_iterator(begin()); }
151ffeaf689SAlexander Kabaev
152ffeaf689SAlexander Kabaev      // 23.2.1.2 capacity:
153ffeaf689SAlexander Kabaev      using _Base::size;
154ffeaf689SAlexander Kabaev      using _Base::max_size;
155ffeaf689SAlexander Kabaev
156ffeaf689SAlexander Kabaev      void
157ffeaf689SAlexander Kabaev      resize(size_type __sz, _Tp __c = _Tp())
158ffeaf689SAlexander Kabaev      {
159ffeaf689SAlexander Kabaev	typedef typename _Base::const_iterator _Base_const_iterator;
160ffeaf689SAlexander Kabaev	typedef __gnu_debug::_After_nth_from<_Base_const_iterator> _After_nth;
161ffeaf689SAlexander Kabaev
162ffeaf689SAlexander Kabaev	bool __invalidate_all = __sz > this->size();
163ffeaf689SAlexander Kabaev	if (__sz < this->size())
164ffeaf689SAlexander Kabaev	  this->_M_invalidate_if(_After_nth(__sz, _M_base().begin()));
165ffeaf689SAlexander Kabaev
166ffeaf689SAlexander Kabaev	_Base::resize(__sz, __c);
167ffeaf689SAlexander Kabaev
168ffeaf689SAlexander Kabaev	if (__invalidate_all)
169ffeaf689SAlexander Kabaev	  this->_M_invalidate_all();
170ffeaf689SAlexander Kabaev      }
171ffeaf689SAlexander Kabaev
172ffeaf689SAlexander Kabaev      using _Base::empty;
173ffeaf689SAlexander Kabaev
174ffeaf689SAlexander Kabaev      // element access:
175ffeaf689SAlexander Kabaev      reference
176ffeaf689SAlexander Kabaev      operator[](size_type __n)
177ffeaf689SAlexander Kabaev      {
178ffeaf689SAlexander Kabaev	__glibcxx_check_subscript(__n);
179ffeaf689SAlexander Kabaev	return _M_base()[__n];
180ffeaf689SAlexander Kabaev      }
181ffeaf689SAlexander Kabaev
182ffeaf689SAlexander Kabaev      const_reference
183ffeaf689SAlexander Kabaev      operator[](size_type __n) const
184ffeaf689SAlexander Kabaev      {
185ffeaf689SAlexander Kabaev	__glibcxx_check_subscript(__n);
186ffeaf689SAlexander Kabaev	return _M_base()[__n];
187ffeaf689SAlexander Kabaev      }
188ffeaf689SAlexander Kabaev
189ffeaf689SAlexander Kabaev      using _Base::at;
190ffeaf689SAlexander Kabaev
191ffeaf689SAlexander Kabaev      reference
192ffeaf689SAlexander Kabaev      front()
193ffeaf689SAlexander Kabaev      {
194ffeaf689SAlexander Kabaev	__glibcxx_check_nonempty();
195ffeaf689SAlexander Kabaev	return _Base::front();
196ffeaf689SAlexander Kabaev      }
197ffeaf689SAlexander Kabaev
198ffeaf689SAlexander Kabaev      const_reference
199ffeaf689SAlexander Kabaev      front() const
200ffeaf689SAlexander Kabaev      {
201ffeaf689SAlexander Kabaev	__glibcxx_check_nonempty();
202ffeaf689SAlexander Kabaev	return _Base::front();
203ffeaf689SAlexander Kabaev      }
204ffeaf689SAlexander Kabaev
205ffeaf689SAlexander Kabaev      reference
206ffeaf689SAlexander Kabaev      back()
207ffeaf689SAlexander Kabaev      {
208ffeaf689SAlexander Kabaev	__glibcxx_check_nonempty();
209ffeaf689SAlexander Kabaev	return _Base::back();
210ffeaf689SAlexander Kabaev      }
211ffeaf689SAlexander Kabaev
212ffeaf689SAlexander Kabaev      const_reference
213ffeaf689SAlexander Kabaev      back() const
214ffeaf689SAlexander Kabaev      {
215ffeaf689SAlexander Kabaev	__glibcxx_check_nonempty();
216ffeaf689SAlexander Kabaev	return _Base::back();
217ffeaf689SAlexander Kabaev      }
218ffeaf689SAlexander Kabaev
219ffeaf689SAlexander Kabaev      // 23.2.1.3 modifiers:
220ffeaf689SAlexander Kabaev      void
221ffeaf689SAlexander Kabaev      push_front(const _Tp& __x)
222ffeaf689SAlexander Kabaev      {
223ffeaf689SAlexander Kabaev	_Base::push_front(__x);
224ffeaf689SAlexander Kabaev	this->_M_invalidate_all();
225ffeaf689SAlexander Kabaev      }
226ffeaf689SAlexander Kabaev
227ffeaf689SAlexander Kabaev      void
228ffeaf689SAlexander Kabaev      push_back(const _Tp& __x)
229ffeaf689SAlexander Kabaev      {
230ffeaf689SAlexander Kabaev	_Base::push_back(__x);
231ffeaf689SAlexander Kabaev	this->_M_invalidate_all();
232ffeaf689SAlexander Kabaev      }
233ffeaf689SAlexander Kabaev
234ffeaf689SAlexander Kabaev      iterator
235ffeaf689SAlexander Kabaev      insert(iterator __position, const _Tp& __x)
236ffeaf689SAlexander Kabaev      {
237ffeaf689SAlexander Kabaev	__glibcxx_check_insert(__position);
238ffeaf689SAlexander Kabaev	typename _Base::iterator __res = _Base::insert(__position.base(), __x);
239ffeaf689SAlexander Kabaev	this->_M_invalidate_all();
240ffeaf689SAlexander Kabaev	return iterator(__res, this);
241ffeaf689SAlexander Kabaev      }
242ffeaf689SAlexander Kabaev
243ffeaf689SAlexander Kabaev      void
244ffeaf689SAlexander Kabaev      insert(iterator __position, size_type __n, const _Tp& __x)
245ffeaf689SAlexander Kabaev      {
246ffeaf689SAlexander Kabaev	__glibcxx_check_insert(__position);
247ffeaf689SAlexander Kabaev	_Base::insert(__position.base(), __n, __x);
248ffeaf689SAlexander Kabaev	this->_M_invalidate_all();
249ffeaf689SAlexander Kabaev      }
250ffeaf689SAlexander Kabaev
251ffeaf689SAlexander Kabaev      template<class _InputIterator>
252ffeaf689SAlexander Kabaev        void
253ffeaf689SAlexander Kabaev        insert(iterator __position,
254ffeaf689SAlexander Kabaev	       _InputIterator __first, _InputIterator __last)
255ffeaf689SAlexander Kabaev        {
256ffeaf689SAlexander Kabaev	  __glibcxx_check_insert_range(__position, __first, __last);
257ffeaf689SAlexander Kabaev	  _Base::insert(__position.base(), __first, __last);
258ffeaf689SAlexander Kabaev	  this->_M_invalidate_all();
259ffeaf689SAlexander Kabaev	}
260ffeaf689SAlexander Kabaev
261ffeaf689SAlexander Kabaev      void
262ffeaf689SAlexander Kabaev      pop_front()
263ffeaf689SAlexander Kabaev      {
264ffeaf689SAlexander Kabaev	__glibcxx_check_nonempty();
265ffeaf689SAlexander Kabaev	iterator __victim = begin();
266ffeaf689SAlexander Kabaev	__victim._M_invalidate();
267ffeaf689SAlexander Kabaev	_Base::pop_front();
268ffeaf689SAlexander Kabaev      }
269ffeaf689SAlexander Kabaev
270ffeaf689SAlexander Kabaev      void
271ffeaf689SAlexander Kabaev      pop_back()
272ffeaf689SAlexander Kabaev      {
273ffeaf689SAlexander Kabaev	__glibcxx_check_nonempty();
274ffeaf689SAlexander Kabaev	iterator __victim = end();
275ffeaf689SAlexander Kabaev	--__victim;
276ffeaf689SAlexander Kabaev	__victim._M_invalidate();
277ffeaf689SAlexander Kabaev	_Base::pop_back();
278ffeaf689SAlexander Kabaev      }
279ffeaf689SAlexander Kabaev
280ffeaf689SAlexander Kabaev      iterator
281ffeaf689SAlexander Kabaev      erase(iterator __position)
282ffeaf689SAlexander Kabaev      {
283ffeaf689SAlexander Kabaev	__glibcxx_check_erase(__position);
284ffeaf689SAlexander Kabaev	if (__position == begin() || __position == end()-1)
285ffeaf689SAlexander Kabaev	  {
286ffeaf689SAlexander Kabaev	    __position._M_invalidate();
287ffeaf689SAlexander Kabaev	    return iterator(_Base::erase(__position.base()), this);
288ffeaf689SAlexander Kabaev	  }
289ffeaf689SAlexander Kabaev	else
290ffeaf689SAlexander Kabaev	  {
291ffeaf689SAlexander Kabaev	    typename _Base::iterator __res = _Base::erase(__position.base());
292ffeaf689SAlexander Kabaev	    this->_M_invalidate_all();
293ffeaf689SAlexander Kabaev	    return iterator(__res, this);
294ffeaf689SAlexander Kabaev	  }
295ffeaf689SAlexander Kabaev      }
296ffeaf689SAlexander Kabaev
297ffeaf689SAlexander Kabaev      iterator
298ffeaf689SAlexander Kabaev      erase(iterator __first, iterator __last)
299ffeaf689SAlexander Kabaev      {
300ffeaf689SAlexander Kabaev	// _GLIBCXX_RESOLVE_LIB_DEFECTS
301ffeaf689SAlexander Kabaev	// 151. can't currently clear() empty container
302ffeaf689SAlexander Kabaev	__glibcxx_check_erase_range(__first, __last);
303ffeaf689SAlexander Kabaev        if (__first == begin() || __last == end())
304ffeaf689SAlexander Kabaev	  {
305ffeaf689SAlexander Kabaev	    this->_M_detach_singular();
306ffeaf689SAlexander Kabaev	    for (iterator __position = __first; __position != __last; )
307ffeaf689SAlexander Kabaev	      {
308ffeaf689SAlexander Kabaev		iterator __victim = __position++;
309ffeaf689SAlexander Kabaev		__victim._M_invalidate();
310ffeaf689SAlexander Kabaev	      }
311ffeaf689SAlexander Kabaev	    try
312ffeaf689SAlexander Kabaev	      {
313ffeaf689SAlexander Kabaev		return iterator(_Base::erase(__first.base(), __last.base()),
314ffeaf689SAlexander Kabaev				this);
315ffeaf689SAlexander Kabaev	      }
316ffeaf689SAlexander Kabaev	    catch (...)
317ffeaf689SAlexander Kabaev	      {
318ffeaf689SAlexander Kabaev		this->_M_revalidate_singular();
319ffeaf689SAlexander Kabaev		__throw_exception_again;
320ffeaf689SAlexander Kabaev	      }
321ffeaf689SAlexander Kabaev	  }
322ffeaf689SAlexander Kabaev	else
323ffeaf689SAlexander Kabaev	  {
324ffeaf689SAlexander Kabaev	    typename _Base::iterator __res = _Base::erase(__first.base(),
325ffeaf689SAlexander Kabaev							  __last.base());
326ffeaf689SAlexander Kabaev	    this->_M_invalidate_all();
327ffeaf689SAlexander Kabaev	    return iterator(__res, this);
328ffeaf689SAlexander Kabaev	  }
329ffeaf689SAlexander Kabaev      }
330ffeaf689SAlexander Kabaev
331ffeaf689SAlexander Kabaev      void
332ffeaf689SAlexander Kabaev      swap(deque<_Tp,_Allocator>& __x)
333ffeaf689SAlexander Kabaev      {
334ffeaf689SAlexander Kabaev	_Base::swap(__x);
335ffeaf689SAlexander Kabaev	this->_M_swap(__x);
336ffeaf689SAlexander Kabaev      }
337ffeaf689SAlexander Kabaev
338ffeaf689SAlexander Kabaev      void
339ffeaf689SAlexander Kabaev      clear()
340ffeaf689SAlexander Kabaev      {
341ffeaf689SAlexander Kabaev	_Base::clear();
342ffeaf689SAlexander Kabaev	this->_M_invalidate_all();
343ffeaf689SAlexander Kabaev      }
344ffeaf689SAlexander Kabaev
345ffeaf689SAlexander Kabaev      _Base&
346ffeaf689SAlexander Kabaev      _M_base()       { return *this; }
347ffeaf689SAlexander Kabaev
348ffeaf689SAlexander Kabaev      const _Base&
349ffeaf689SAlexander Kabaev      _M_base() const { return *this; }
350ffeaf689SAlexander Kabaev    };
351ffeaf689SAlexander Kabaev
352ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Alloc>
353ffeaf689SAlexander Kabaev    inline bool
354ffeaf689SAlexander Kabaev    operator==(const deque<_Tp, _Alloc>& __lhs,
355ffeaf689SAlexander Kabaev	       const deque<_Tp, _Alloc>& __rhs)
356ffeaf689SAlexander Kabaev    { return __lhs._M_base() == __rhs._M_base(); }
357ffeaf689SAlexander Kabaev
358ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Alloc>
359ffeaf689SAlexander Kabaev    inline bool
360ffeaf689SAlexander Kabaev    operator!=(const deque<_Tp, _Alloc>& __lhs,
361ffeaf689SAlexander Kabaev	       const deque<_Tp, _Alloc>& __rhs)
362ffeaf689SAlexander Kabaev    { return __lhs._M_base() != __rhs._M_base(); }
363ffeaf689SAlexander Kabaev
364ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Alloc>
365ffeaf689SAlexander Kabaev    inline bool
366ffeaf689SAlexander Kabaev    operator<(const deque<_Tp, _Alloc>& __lhs, const deque<_Tp, _Alloc>& __rhs)
367ffeaf689SAlexander Kabaev    { return __lhs._M_base() < __rhs._M_base(); }
368ffeaf689SAlexander Kabaev
369ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Alloc>
370ffeaf689SAlexander Kabaev    inline bool
371ffeaf689SAlexander Kabaev    operator<=(const deque<_Tp, _Alloc>& __lhs,
372ffeaf689SAlexander Kabaev	       const deque<_Tp, _Alloc>& __rhs)
373ffeaf689SAlexander Kabaev    { return __lhs._M_base() <= __rhs._M_base(); }
374ffeaf689SAlexander Kabaev
375ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Alloc>
376ffeaf689SAlexander Kabaev    inline bool
377ffeaf689SAlexander Kabaev    operator>=(const deque<_Tp, _Alloc>& __lhs,
378ffeaf689SAlexander Kabaev	       const deque<_Tp, _Alloc>& __rhs)
379ffeaf689SAlexander Kabaev    { return __lhs._M_base() >= __rhs._M_base(); }
380ffeaf689SAlexander Kabaev
381ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Alloc>
382ffeaf689SAlexander Kabaev    inline bool
383ffeaf689SAlexander Kabaev    operator>(const deque<_Tp, _Alloc>& __lhs, const deque<_Tp, _Alloc>& __rhs)
384ffeaf689SAlexander Kabaev    { return __lhs._M_base() > __rhs._M_base(); }
385ffeaf689SAlexander Kabaev
386ffeaf689SAlexander Kabaev  template<typename _Tp, typename _Alloc>
387ffeaf689SAlexander Kabaev    inline void
388ffeaf689SAlexander Kabaev    swap(deque<_Tp, _Alloc>& __lhs, deque<_Tp, _Alloc>& __rhs)
389ffeaf689SAlexander Kabaev    { __lhs.swap(__rhs); }
390*f8a1b7d9SAlexander Kabaev} // namespace __debug
391*f8a1b7d9SAlexander Kabaev} // namespace std
392ffeaf689SAlexander Kabaev
393ffeaf689SAlexander Kabaev#endif
394