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