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