1ffeaf689SAlexander Kabaev// Debugging vector 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/vector 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_VECTOR 36ffeaf689SAlexander Kabaev#define _GLIBCXX_DEBUG_VECTOR 1 37ffeaf689SAlexander Kabaev 38ffeaf689SAlexander Kabaev#include <vector> 39*f8a1b7d9SAlexander Kabaev#include <utility> 40ffeaf689SAlexander Kabaev#include <debug/safe_sequence.h> 41ffeaf689SAlexander Kabaev#include <debug/safe_iterator.h> 42ffeaf689SAlexander Kabaev 43*f8a1b7d9SAlexander Kabaevnamespace std 44*f8a1b7d9SAlexander Kabaev{ 45*f8a1b7d9SAlexander Kabaevnamespace __debug 46ffeaf689SAlexander Kabaev{ 47ffeaf689SAlexander Kabaev template<typename _Tp, 48ffeaf689SAlexander Kabaev typename _Allocator = std::allocator<_Tp> > 49ffeaf689SAlexander Kabaev class vector 50ffeaf689SAlexander Kabaev : public _GLIBCXX_STD::vector<_Tp, _Allocator>, 51ffeaf689SAlexander Kabaev public __gnu_debug::_Safe_sequence<vector<_Tp, _Allocator> > 52ffeaf689SAlexander Kabaev { 53ffeaf689SAlexander Kabaev typedef _GLIBCXX_STD::vector<_Tp, _Allocator> _Base; 54ffeaf689SAlexander Kabaev typedef __gnu_debug::_Safe_sequence<vector> _Safe_base; 55ffeaf689SAlexander Kabaev 56ffeaf689SAlexander Kabaev typedef typename _Base::const_iterator _Base_const_iterator; 57ffeaf689SAlexander Kabaev typedef __gnu_debug::_After_nth_from<_Base_const_iterator> _After_nth; 58ffeaf689SAlexander Kabaev 59ffeaf689SAlexander Kabaev public: 60ffeaf689SAlexander Kabaev typedef typename _Base::reference reference; 61ffeaf689SAlexander Kabaev typedef typename _Base::const_reference const_reference; 62ffeaf689SAlexander Kabaev 63ffeaf689SAlexander Kabaev typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,vector> 64ffeaf689SAlexander Kabaev iterator; 65ffeaf689SAlexander Kabaev typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,vector> 66ffeaf689SAlexander Kabaev const_iterator; 67ffeaf689SAlexander Kabaev 68ffeaf689SAlexander Kabaev typedef typename _Base::size_type size_type; 69ffeaf689SAlexander Kabaev typedef typename _Base::difference_type difference_type; 70ffeaf689SAlexander Kabaev 71ffeaf689SAlexander Kabaev typedef _Tp value_type; 72ffeaf689SAlexander Kabaev typedef _Allocator allocator_type; 73*f8a1b7d9SAlexander Kabaev typedef typename _Base::pointer pointer; 74*f8a1b7d9SAlexander Kabaev typedef typename _Base::const_pointer const_pointer; 75ffeaf689SAlexander Kabaev typedef std::reverse_iterator<iterator> reverse_iterator; 76ffeaf689SAlexander Kabaev typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 77ffeaf689SAlexander Kabaev 78ffeaf689SAlexander Kabaev // 23.2.4.1 construct/copy/destroy: 79ffeaf689SAlexander Kabaev explicit vector(const _Allocator& __a = _Allocator()) 80ffeaf689SAlexander Kabaev : _Base(__a), _M_guaranteed_capacity(0) { } 81ffeaf689SAlexander Kabaev 82ffeaf689SAlexander Kabaev explicit vector(size_type __n, const _Tp& __value = _Tp(), 83ffeaf689SAlexander Kabaev const _Allocator& __a = _Allocator()) 84ffeaf689SAlexander Kabaev : _Base(__n, __value, __a), _M_guaranteed_capacity(__n) { } 85ffeaf689SAlexander Kabaev 86ffeaf689SAlexander Kabaev template<class _InputIterator> 87ffeaf689SAlexander Kabaev vector(_InputIterator __first, _InputIterator __last, 88ffeaf689SAlexander Kabaev const _Allocator& __a = _Allocator()) 89ffeaf689SAlexander Kabaev : _Base(__gnu_debug::__check_valid_range(__first, __last), 90ffeaf689SAlexander Kabaev __last, __a), 91ffeaf689SAlexander Kabaev _M_guaranteed_capacity(0) 92ffeaf689SAlexander Kabaev { _M_update_guaranteed_capacity(); } 93ffeaf689SAlexander Kabaev 94ffeaf689SAlexander Kabaev vector(const vector<_Tp,_Allocator>& __x) 95ffeaf689SAlexander Kabaev : _Base(__x), _Safe_base(), _M_guaranteed_capacity(__x.size()) { } 96ffeaf689SAlexander Kabaev 97ffeaf689SAlexander Kabaev /// Construction from a release-mode vector 98ffeaf689SAlexander Kabaev vector(const _Base& __x) 99ffeaf689SAlexander Kabaev : _Base(__x), _Safe_base(), _M_guaranteed_capacity(__x.size()) { } 100ffeaf689SAlexander Kabaev 101ffeaf689SAlexander Kabaev ~vector() { } 102ffeaf689SAlexander Kabaev 103ffeaf689SAlexander Kabaev vector<_Tp,_Allocator>& 104ffeaf689SAlexander Kabaev operator=(const vector<_Tp,_Allocator>& __x) 105ffeaf689SAlexander Kabaev { 106ffeaf689SAlexander Kabaev static_cast<_Base&>(*this) = __x; 107ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 108ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity(); 109ffeaf689SAlexander Kabaev return *this; 110ffeaf689SAlexander Kabaev } 111ffeaf689SAlexander Kabaev 112ffeaf689SAlexander Kabaev template<typename _InputIterator> 113ffeaf689SAlexander Kabaev void 114ffeaf689SAlexander Kabaev assign(_InputIterator __first, _InputIterator __last) 115ffeaf689SAlexander Kabaev { 116ffeaf689SAlexander Kabaev __glibcxx_check_valid_range(__first, __last); 117ffeaf689SAlexander Kabaev _Base::assign(__first, __last); 118ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 119ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity(); 120ffeaf689SAlexander Kabaev } 121ffeaf689SAlexander Kabaev 122ffeaf689SAlexander Kabaev void 123ffeaf689SAlexander Kabaev assign(size_type __n, const _Tp& __u) 124ffeaf689SAlexander Kabaev { 125ffeaf689SAlexander Kabaev _Base::assign(__n, __u); 126ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 127ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity(); 128ffeaf689SAlexander Kabaev } 129ffeaf689SAlexander Kabaev 130ffeaf689SAlexander Kabaev using _Base::get_allocator; 131ffeaf689SAlexander Kabaev 132ffeaf689SAlexander Kabaev // iterators: 133ffeaf689SAlexander Kabaev iterator 134ffeaf689SAlexander Kabaev begin() 135ffeaf689SAlexander Kabaev { return iterator(_Base::begin(), this); } 136ffeaf689SAlexander Kabaev 137ffeaf689SAlexander Kabaev const_iterator 138ffeaf689SAlexander Kabaev begin() const 139ffeaf689SAlexander Kabaev { return const_iterator(_Base::begin(), this); } 140ffeaf689SAlexander Kabaev 141ffeaf689SAlexander Kabaev iterator 142ffeaf689SAlexander Kabaev end() 143ffeaf689SAlexander Kabaev { return iterator(_Base::end(), this); } 144ffeaf689SAlexander Kabaev 145ffeaf689SAlexander Kabaev const_iterator 146ffeaf689SAlexander Kabaev end() const 147ffeaf689SAlexander Kabaev { return const_iterator(_Base::end(), this); } 148ffeaf689SAlexander Kabaev 149ffeaf689SAlexander Kabaev reverse_iterator 150ffeaf689SAlexander Kabaev rbegin() 151ffeaf689SAlexander Kabaev { return reverse_iterator(end()); } 152ffeaf689SAlexander Kabaev 153ffeaf689SAlexander Kabaev const_reverse_iterator 154ffeaf689SAlexander Kabaev rbegin() const 155ffeaf689SAlexander Kabaev { return const_reverse_iterator(end()); } 156ffeaf689SAlexander Kabaev 157ffeaf689SAlexander Kabaev reverse_iterator 158ffeaf689SAlexander Kabaev rend() 159ffeaf689SAlexander Kabaev { return reverse_iterator(begin()); } 160ffeaf689SAlexander Kabaev 161ffeaf689SAlexander Kabaev const_reverse_iterator 162ffeaf689SAlexander Kabaev rend() const 163ffeaf689SAlexander Kabaev { return const_reverse_iterator(begin()); } 164ffeaf689SAlexander Kabaev 165ffeaf689SAlexander Kabaev // 23.2.4.2 capacity: 166ffeaf689SAlexander Kabaev using _Base::size; 167ffeaf689SAlexander Kabaev using _Base::max_size; 168ffeaf689SAlexander Kabaev 169ffeaf689SAlexander Kabaev void 170ffeaf689SAlexander Kabaev resize(size_type __sz, _Tp __c = _Tp()) 171ffeaf689SAlexander Kabaev { 172ffeaf689SAlexander Kabaev bool __realloc = _M_requires_reallocation(__sz); 173ffeaf689SAlexander Kabaev if (__sz < this->size()) 174ffeaf689SAlexander Kabaev this->_M_invalidate_if(_After_nth(__sz, _M_base().begin())); 175ffeaf689SAlexander Kabaev _Base::resize(__sz, __c); 176ffeaf689SAlexander Kabaev if (__realloc) 177ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 178ffeaf689SAlexander Kabaev } 179ffeaf689SAlexander Kabaev 180ffeaf689SAlexander Kabaev using _Base::capacity; 181ffeaf689SAlexander Kabaev using _Base::empty; 182ffeaf689SAlexander Kabaev 183ffeaf689SAlexander Kabaev void 184ffeaf689SAlexander Kabaev reserve(size_type __n) 185ffeaf689SAlexander Kabaev { 186ffeaf689SAlexander Kabaev bool __realloc = _M_requires_reallocation(__n); 187ffeaf689SAlexander Kabaev _Base::reserve(__n); 188ffeaf689SAlexander Kabaev if (__n > _M_guaranteed_capacity) 189ffeaf689SAlexander Kabaev _M_guaranteed_capacity = __n; 190ffeaf689SAlexander Kabaev if (__realloc) 191ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 192ffeaf689SAlexander Kabaev } 193ffeaf689SAlexander Kabaev 194ffeaf689SAlexander Kabaev // element access: 195ffeaf689SAlexander Kabaev reference 196ffeaf689SAlexander Kabaev operator[](size_type __n) 197ffeaf689SAlexander Kabaev { 198ffeaf689SAlexander Kabaev __glibcxx_check_subscript(__n); 199ffeaf689SAlexander Kabaev return _M_base()[__n]; 200ffeaf689SAlexander Kabaev } 201ffeaf689SAlexander Kabaev 202ffeaf689SAlexander Kabaev const_reference 203ffeaf689SAlexander Kabaev operator[](size_type __n) const 204ffeaf689SAlexander Kabaev { 205ffeaf689SAlexander Kabaev __glibcxx_check_subscript(__n); 206ffeaf689SAlexander Kabaev return _M_base()[__n]; 207ffeaf689SAlexander Kabaev } 208ffeaf689SAlexander Kabaev 209ffeaf689SAlexander Kabaev using _Base::at; 210ffeaf689SAlexander Kabaev 211ffeaf689SAlexander Kabaev reference 212ffeaf689SAlexander Kabaev front() 213ffeaf689SAlexander Kabaev { 214ffeaf689SAlexander Kabaev __glibcxx_check_nonempty(); 215ffeaf689SAlexander Kabaev return _Base::front(); 216ffeaf689SAlexander Kabaev } 217ffeaf689SAlexander Kabaev 218ffeaf689SAlexander Kabaev const_reference 219ffeaf689SAlexander Kabaev front() const 220ffeaf689SAlexander Kabaev { 221ffeaf689SAlexander Kabaev __glibcxx_check_nonempty(); 222ffeaf689SAlexander Kabaev return _Base::front(); 223ffeaf689SAlexander Kabaev } 224ffeaf689SAlexander Kabaev 225ffeaf689SAlexander Kabaev reference 226ffeaf689SAlexander Kabaev back() 227ffeaf689SAlexander Kabaev { 228ffeaf689SAlexander Kabaev __glibcxx_check_nonempty(); 229ffeaf689SAlexander Kabaev return _Base::back(); 230ffeaf689SAlexander Kabaev } 231ffeaf689SAlexander Kabaev 232ffeaf689SAlexander Kabaev const_reference 233ffeaf689SAlexander Kabaev back() const 234ffeaf689SAlexander Kabaev { 235ffeaf689SAlexander Kabaev __glibcxx_check_nonempty(); 236ffeaf689SAlexander Kabaev return _Base::back(); 237ffeaf689SAlexander Kabaev } 238ffeaf689SAlexander Kabaev 239*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 240*f8a1b7d9SAlexander Kabaev // DR 464. Suggestion for new member functions in standard containers. 241*f8a1b7d9SAlexander Kabaev using _Base::data; 242*f8a1b7d9SAlexander Kabaev 243ffeaf689SAlexander Kabaev // 23.2.4.3 modifiers: 244ffeaf689SAlexander Kabaev void 245ffeaf689SAlexander Kabaev push_back(const _Tp& __x) 246ffeaf689SAlexander Kabaev { 247ffeaf689SAlexander Kabaev bool __realloc = _M_requires_reallocation(this->size() + 1); 248ffeaf689SAlexander Kabaev _Base::push_back(__x); 249ffeaf689SAlexander Kabaev if (__realloc) 250ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 251ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity(); 252ffeaf689SAlexander Kabaev } 253ffeaf689SAlexander Kabaev 254ffeaf689SAlexander Kabaev void 255ffeaf689SAlexander Kabaev pop_back() 256ffeaf689SAlexander Kabaev { 257ffeaf689SAlexander Kabaev __glibcxx_check_nonempty(); 258ffeaf689SAlexander Kabaev iterator __victim = end() - 1; 259ffeaf689SAlexander Kabaev __victim._M_invalidate(); 260ffeaf689SAlexander Kabaev _Base::pop_back(); 261ffeaf689SAlexander Kabaev } 262ffeaf689SAlexander Kabaev 263ffeaf689SAlexander Kabaev iterator 264ffeaf689SAlexander Kabaev insert(iterator __position, const _Tp& __x) 265ffeaf689SAlexander Kabaev { 266ffeaf689SAlexander Kabaev __glibcxx_check_insert(__position); 267ffeaf689SAlexander Kabaev bool __realloc = _M_requires_reallocation(this->size() + 1); 268ffeaf689SAlexander Kabaev difference_type __offset = __position - begin(); 269ffeaf689SAlexander Kabaev typename _Base::iterator __res = _Base::insert(__position.base(),__x); 270ffeaf689SAlexander Kabaev if (__realloc) 271ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 272ffeaf689SAlexander Kabaev else 273ffeaf689SAlexander Kabaev this->_M_invalidate_if(_After_nth(__offset, _M_base().begin())); 274ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity(); 275ffeaf689SAlexander Kabaev return iterator(__res, this); 276ffeaf689SAlexander Kabaev } 277ffeaf689SAlexander Kabaev 278ffeaf689SAlexander Kabaev void 279ffeaf689SAlexander Kabaev insert(iterator __position, size_type __n, const _Tp& __x) 280ffeaf689SAlexander Kabaev { 281ffeaf689SAlexander Kabaev __glibcxx_check_insert(__position); 282ffeaf689SAlexander Kabaev bool __realloc = _M_requires_reallocation(this->size() + __n); 283ffeaf689SAlexander Kabaev difference_type __offset = __position - begin(); 284ffeaf689SAlexander Kabaev _Base::insert(__position.base(), __n, __x); 285ffeaf689SAlexander Kabaev if (__realloc) 286ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 287ffeaf689SAlexander Kabaev else 288ffeaf689SAlexander Kabaev this->_M_invalidate_if(_After_nth(__offset, _M_base().begin())); 289ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity(); 290ffeaf689SAlexander Kabaev } 291ffeaf689SAlexander Kabaev 292ffeaf689SAlexander Kabaev template<class _InputIterator> 293ffeaf689SAlexander Kabaev void 294ffeaf689SAlexander Kabaev insert(iterator __position, 295ffeaf689SAlexander Kabaev _InputIterator __first, _InputIterator __last) 296ffeaf689SAlexander Kabaev { 297ffeaf689SAlexander Kabaev __glibcxx_check_insert_range(__position, __first, __last); 298ffeaf689SAlexander Kabaev 299ffeaf689SAlexander Kabaev /* Hard to guess if invalidation will occur, because __last 300ffeaf689SAlexander Kabaev - __first can't be calculated in all cases, so we just 301ffeaf689SAlexander Kabaev punt here by checking if it did occur. */ 302ffeaf689SAlexander Kabaev typename _Base::iterator __old_begin = _M_base().begin(); 303ffeaf689SAlexander Kabaev difference_type __offset = __position - begin(); 304ffeaf689SAlexander Kabaev _Base::insert(__position.base(), __first, __last); 305ffeaf689SAlexander Kabaev 306ffeaf689SAlexander Kabaev if (_M_base().begin() != __old_begin) 307ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 308ffeaf689SAlexander Kabaev else 309ffeaf689SAlexander Kabaev this->_M_invalidate_if(_After_nth(__offset, _M_base().begin())); 310ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity(); 311ffeaf689SAlexander Kabaev } 312ffeaf689SAlexander Kabaev 313ffeaf689SAlexander Kabaev iterator 314ffeaf689SAlexander Kabaev erase(iterator __position) 315ffeaf689SAlexander Kabaev { 316ffeaf689SAlexander Kabaev __glibcxx_check_erase(__position); 317ffeaf689SAlexander Kabaev difference_type __offset = __position - begin(); 318ffeaf689SAlexander Kabaev typename _Base::iterator __res = _Base::erase(__position.base()); 319ffeaf689SAlexander Kabaev this->_M_invalidate_if(_After_nth(__offset, _M_base().begin())); 320ffeaf689SAlexander Kabaev return iterator(__res, this); 321ffeaf689SAlexander Kabaev } 322ffeaf689SAlexander Kabaev 323ffeaf689SAlexander Kabaev iterator 324ffeaf689SAlexander Kabaev erase(iterator __first, iterator __last) 325ffeaf689SAlexander Kabaev { 326ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 327ffeaf689SAlexander Kabaev // 151. can't currently clear() empty container 328ffeaf689SAlexander Kabaev __glibcxx_check_erase_range(__first, __last); 329ffeaf689SAlexander Kabaev 330ffeaf689SAlexander Kabaev difference_type __offset = __first - begin(); 331ffeaf689SAlexander Kabaev typename _Base::iterator __res = _Base::erase(__first.base(), 332ffeaf689SAlexander Kabaev __last.base()); 333ffeaf689SAlexander Kabaev this->_M_invalidate_if(_After_nth(__offset, _M_base().begin())); 334ffeaf689SAlexander Kabaev return iterator(__res, this); 335ffeaf689SAlexander Kabaev } 336ffeaf689SAlexander Kabaev 337ffeaf689SAlexander Kabaev void 338ffeaf689SAlexander Kabaev swap(vector<_Tp,_Allocator>& __x) 339ffeaf689SAlexander Kabaev { 340ffeaf689SAlexander Kabaev _Base::swap(__x); 341ffeaf689SAlexander Kabaev this->_M_swap(__x); 342ffeaf689SAlexander Kabaev std::swap(_M_guaranteed_capacity, __x._M_guaranteed_capacity); 343ffeaf689SAlexander Kabaev } 344ffeaf689SAlexander Kabaev 345ffeaf689SAlexander Kabaev void 346ffeaf689SAlexander Kabaev clear() 347ffeaf689SAlexander Kabaev { 348ffeaf689SAlexander Kabaev _Base::clear(); 349ffeaf689SAlexander Kabaev this->_M_invalidate_all(); 350ffeaf689SAlexander Kabaev _M_guaranteed_capacity = 0; 351ffeaf689SAlexander Kabaev } 352ffeaf689SAlexander Kabaev 353ffeaf689SAlexander Kabaev _Base& 354ffeaf689SAlexander Kabaev _M_base() { return *this; } 355ffeaf689SAlexander Kabaev 356ffeaf689SAlexander Kabaev const _Base& 357ffeaf689SAlexander Kabaev _M_base() const { return *this; } 358ffeaf689SAlexander Kabaev 359ffeaf689SAlexander Kabaev private: 360ffeaf689SAlexander Kabaev size_type _M_guaranteed_capacity; 361ffeaf689SAlexander Kabaev 362ffeaf689SAlexander Kabaev bool 363ffeaf689SAlexander Kabaev _M_requires_reallocation(size_type __elements) 364ffeaf689SAlexander Kabaev { 365ffeaf689SAlexander Kabaev#ifdef _GLIBCXX_DEBUG_PEDANTIC 366ffeaf689SAlexander Kabaev return __elements > this->capacity(); 367ffeaf689SAlexander Kabaev#else 368ffeaf689SAlexander Kabaev return __elements > _M_guaranteed_capacity; 369ffeaf689SAlexander Kabaev#endif 370ffeaf689SAlexander Kabaev } 371ffeaf689SAlexander Kabaev 372ffeaf689SAlexander Kabaev void 373ffeaf689SAlexander Kabaev _M_update_guaranteed_capacity() 374ffeaf689SAlexander Kabaev { 375ffeaf689SAlexander Kabaev if (this->size() > _M_guaranteed_capacity) 376ffeaf689SAlexander Kabaev _M_guaranteed_capacity = this->size(); 377ffeaf689SAlexander Kabaev } 378ffeaf689SAlexander Kabaev }; 379ffeaf689SAlexander Kabaev 380ffeaf689SAlexander Kabaev template<typename _Tp, typename _Alloc> 381ffeaf689SAlexander Kabaev inline bool 382ffeaf689SAlexander Kabaev operator==(const vector<_Tp, _Alloc>& __lhs, 383ffeaf689SAlexander Kabaev const vector<_Tp, _Alloc>& __rhs) 384ffeaf689SAlexander Kabaev { return __lhs._M_base() == __rhs._M_base(); } 385ffeaf689SAlexander Kabaev 386ffeaf689SAlexander Kabaev template<typename _Tp, typename _Alloc> 387ffeaf689SAlexander Kabaev inline bool 388ffeaf689SAlexander Kabaev operator!=(const vector<_Tp, _Alloc>& __lhs, 389ffeaf689SAlexander Kabaev const vector<_Tp, _Alloc>& __rhs) 390ffeaf689SAlexander Kabaev { return __lhs._M_base() != __rhs._M_base(); } 391ffeaf689SAlexander Kabaev 392ffeaf689SAlexander Kabaev template<typename _Tp, typename _Alloc> 393ffeaf689SAlexander Kabaev inline bool 394ffeaf689SAlexander Kabaev operator<(const vector<_Tp, _Alloc>& __lhs, 395ffeaf689SAlexander Kabaev const vector<_Tp, _Alloc>& __rhs) 396ffeaf689SAlexander Kabaev { return __lhs._M_base() < __rhs._M_base(); } 397ffeaf689SAlexander Kabaev 398ffeaf689SAlexander Kabaev template<typename _Tp, typename _Alloc> 399ffeaf689SAlexander Kabaev inline bool 400ffeaf689SAlexander Kabaev operator<=(const vector<_Tp, _Alloc>& __lhs, 401ffeaf689SAlexander Kabaev const vector<_Tp, _Alloc>& __rhs) 402ffeaf689SAlexander Kabaev { return __lhs._M_base() <= __rhs._M_base(); } 403ffeaf689SAlexander Kabaev 404ffeaf689SAlexander Kabaev template<typename _Tp, typename _Alloc> 405ffeaf689SAlexander Kabaev inline bool 406ffeaf689SAlexander Kabaev operator>=(const vector<_Tp, _Alloc>& __lhs, 407ffeaf689SAlexander Kabaev const vector<_Tp, _Alloc>& __rhs) 408ffeaf689SAlexander Kabaev { return __lhs._M_base() >= __rhs._M_base(); } 409ffeaf689SAlexander Kabaev 410ffeaf689SAlexander Kabaev template<typename _Tp, typename _Alloc> 411ffeaf689SAlexander Kabaev inline bool 412ffeaf689SAlexander Kabaev operator>(const vector<_Tp, _Alloc>& __lhs, 413ffeaf689SAlexander Kabaev const vector<_Tp, _Alloc>& __rhs) 414ffeaf689SAlexander Kabaev { return __lhs._M_base() > __rhs._M_base(); } 415ffeaf689SAlexander Kabaev 416ffeaf689SAlexander Kabaev template<typename _Tp, typename _Alloc> 417ffeaf689SAlexander Kabaev inline void 418ffeaf689SAlexander Kabaev swap(vector<_Tp, _Alloc>& __lhs, vector<_Tp, _Alloc>& __rhs) 419ffeaf689SAlexander Kabaev { __lhs.swap(__rhs); } 420*f8a1b7d9SAlexander Kabaev} // namespace __debug 421*f8a1b7d9SAlexander Kabaev} // namespace std 422ffeaf689SAlexander Kabaev 423ffeaf689SAlexander Kabaev#endif 424