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