Line data Source code
1 : // Vector implementation -*- C++ -*-
2 :
3 : // Copyright (C) 2001-2016 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /*
26 : *
27 : * Copyright (c) 1994
28 : * Hewlett-Packard Company
29 : *
30 : * Permission to use, copy, modify, distribute and sell this software
31 : * and its documentation for any purpose is hereby granted without fee,
32 : * provided that the above copyright notice appear in all copies and
33 : * that both that copyright notice and this permission notice appear
34 : * in supporting documentation. Hewlett-Packard Company makes no
35 : * representations about the suitability of this software for any
36 : * purpose. It is provided "as is" without express or implied warranty.
37 : *
38 : *
39 : * Copyright (c) 1996
40 : * Silicon Graphics Computer Systems, Inc.
41 : *
42 : * Permission to use, copy, modify, distribute and sell this software
43 : * and its documentation for any purpose is hereby granted without fee,
44 : * provided that the above copyright notice appear in all copies and
45 : * that both that copyright notice and this permission notice appear
46 : * in supporting documentation. Silicon Graphics makes no
47 : * representations about the suitability of this software for any
48 : * purpose. It is provided "as is" without express or implied warranty.
49 : */
50 :
51 : /** @file bits/stl_vector.h
52 : * This is an internal header file, included by other library headers.
53 : * Do not attempt to use it directly. @headername{vector}
54 : */
55 :
56 : #ifndef _STL_VECTOR_H
57 : #define _STL_VECTOR_H 1
58 :
59 : #include <bits/stl_iterator_base_funcs.h>
60 : #include <bits/functexcept.h>
61 : #include <bits/concept_check.h>
62 : #if __cplusplus >= 201103L
63 : #include <initializer_list>
64 : #endif
65 :
66 : namespace std _GLIBCXX_VISIBILITY(default)
67 : {
68 : _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
69 :
70 : /// See bits/stl_deque.h's _Deque_base for an explanation.
71 : template<typename _Tp, typename _Alloc>
72 : struct _Vector_base
73 : {
74 : typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
75 : rebind<_Tp>::other _Tp_alloc_type;
76 : typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer
77 : pointer;
78 :
79 3695 : struct _Vector_impl
80 : : public _Tp_alloc_type
81 : {
82 : pointer _M_start;
83 : pointer _M_finish;
84 : pointer _M_end_of_storage;
85 :
86 3411 : _Vector_impl()
87 3411 : : _Tp_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage()
88 3411 : { }
89 :
90 212 : _Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
91 212 : : _Tp_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage()
92 212 : { }
93 :
94 : #if __cplusplus >= 201103L
95 72 : _Vector_impl(_Tp_alloc_type&& __a) noexcept
96 72 : : _Tp_alloc_type(std::move(__a)),
97 72 : _M_start(), _M_finish(), _M_end_of_storage()
98 72 : { }
99 : #endif
100 :
101 78 : void _M_swap_data(_Vector_impl& __x) _GLIBCXX_NOEXCEPT
102 : {
103 78 : std::swap(_M_start, __x._M_start);
104 78 : std::swap(_M_finish, __x._M_finish);
105 78 : std::swap(_M_end_of_storage, __x._M_end_of_storage);
106 78 : }
107 : };
108 :
109 : public:
110 : typedef _Alloc allocator_type;
111 :
112 : _Tp_alloc_type&
113 12415 : _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
114 12415 : { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); }
115 :
116 : const _Tp_alloc_type&
117 8454 : _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
118 8454 : { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }
119 :
120 : allocator_type
121 3 : get_allocator() const _GLIBCXX_NOEXCEPT
122 3 : { return allocator_type(_M_get_Tp_allocator()); }
123 :
124 3411 : _Vector_base()
125 3411 : : _M_impl() { }
126 :
127 3 : _Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
128 3 : : _M_impl(__a) { }
129 :
130 : _Vector_base(size_t __n)
131 : : _M_impl()
132 : { _M_create_storage(__n); }
133 :
134 209 : _Vector_base(size_t __n, const allocator_type& __a)
135 209 : : _M_impl(__a)
136 209 : { _M_create_storage(__n); }
137 :
138 : #if __cplusplus >= 201103L
139 : _Vector_base(_Tp_alloc_type&& __a) noexcept
140 : : _M_impl(std::move(__a)) { }
141 :
142 72 : _Vector_base(_Vector_base&& __x) noexcept
143 72 : : _M_impl(std::move(__x._M_get_Tp_allocator()))
144 72 : { this->_M_impl._M_swap_data(__x._M_impl); }
145 :
146 : _Vector_base(_Vector_base&& __x, const allocator_type& __a)
147 : : _M_impl(__a)
148 : {
149 : if (__x.get_allocator() == __a)
150 : this->_M_impl._M_swap_data(__x._M_impl);
151 : else
152 : {
153 : size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
154 : _M_create_storage(__n);
155 : }
156 : }
157 : #endif
158 :
159 3695 : ~_Vector_base() _GLIBCXX_NOEXCEPT
160 7390 : { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
161 7390 : - this->_M_impl._M_start); }
162 :
163 : public:
164 : _Vector_impl _M_impl;
165 :
166 : pointer
167 4354 : _M_allocate(size_t __n)
168 : {
169 : typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
170 4354 : return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
171 : }
172 :
173 : void
174 7840 : _M_deallocate(pointer __p, size_t __n)
175 : {
176 : typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
177 7840 : if (__p)
178 4331 : _Tr::deallocate(_M_impl, __p, __n);
179 7840 : }
180 :
181 : private:
182 : void
183 209 : _M_create_storage(size_t __n)
184 : {
185 209 : this->_M_impl._M_start = this->_M_allocate(__n);
186 209 : this->_M_impl._M_finish = this->_M_impl._M_start;
187 209 : this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
188 209 : }
189 : };
190 :
191 :
192 : /**
193 : * @brief A standard container which offers fixed time access to
194 : * individual elements in any order.
195 : *
196 : * @ingroup sequences
197 : *
198 : * @tparam _Tp Type of element.
199 : * @tparam _Alloc Allocator type, defaults to allocator<_Tp>.
200 : *
201 : * Meets the requirements of a <a href="tables.html#65">container</a>, a
202 : * <a href="tables.html#66">reversible container</a>, and a
203 : * <a href="tables.html#67">sequence</a>, including the
204 : * <a href="tables.html#68">optional sequence requirements</a> with the
205 : * %exception of @c push_front and @c pop_front.
206 : *
207 : * In some terminology a %vector can be described as a dynamic
208 : * C-style array, it offers fast and efficient access to individual
209 : * elements in any order and saves the user from worrying about
210 : * memory and size allocation. Subscripting ( @c [] ) access is
211 : * also provided as with C-style arrays.
212 : */
213 : template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
214 : class vector : protected _Vector_base<_Tp, _Alloc>
215 : {
216 : // Concept requirements.
217 : typedef typename _Alloc::value_type _Alloc_value_type;
218 : #if __cplusplus < 201103L
219 : __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
220 : #endif
221 : __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
222 :
223 : typedef _Vector_base<_Tp, _Alloc> _Base;
224 : typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
225 : typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
226 :
227 : public:
228 : typedef _Tp value_type;
229 : typedef typename _Base::pointer pointer;
230 : typedef typename _Alloc_traits::const_pointer const_pointer;
231 : typedef typename _Alloc_traits::reference reference;
232 : typedef typename _Alloc_traits::const_reference const_reference;
233 : typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
234 : typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
235 : const_iterator;
236 : typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
237 : typedef std::reverse_iterator<iterator> reverse_iterator;
238 : typedef size_t size_type;
239 : typedef ptrdiff_t difference_type;
240 : typedef _Alloc allocator_type;
241 :
242 : protected:
243 : using _Base::_M_allocate;
244 : using _Base::_M_deallocate;
245 : using _Base::_M_impl;
246 : using _Base::_M_get_Tp_allocator;
247 :
248 : public:
249 : // [23.2.4.1] construct/copy/destroy
250 : // (assign() and get_allocator() are also listed in this section)
251 :
252 : /**
253 : * @brief Creates a %vector with no elements.
254 : */
255 3411 : vector()
256 : #if __cplusplus >= 201103L
257 : noexcept(is_nothrow_default_constructible<_Alloc>::value)
258 : #endif
259 3411 : : _Base() { }
260 :
261 : /**
262 : * @brief Creates a %vector with no elements.
263 : * @param __a An allocator object.
264 : */
265 : explicit
266 3 : vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
267 3 : : _Base(__a) { }
268 :
269 : #if __cplusplus >= 201103L
270 : /**
271 : * @brief Creates a %vector with default constructed elements.
272 : * @param __n The number of elements to initially create.
273 : * @param __a An allocator.
274 : *
275 : * This constructor fills the %vector with @a __n default
276 : * constructed elements.
277 : */
278 : explicit
279 : vector(size_type __n, const allocator_type& __a = allocator_type())
280 : : _Base(__n, __a)
281 : { _M_default_initialize(__n); }
282 :
283 : /**
284 : * @brief Creates a %vector with copies of an exemplar element.
285 : * @param __n The number of elements to initially create.
286 : * @param __value An element to copy.
287 : * @param __a An allocator.
288 : *
289 : * This constructor fills the %vector with @a __n copies of @a __value.
290 : */
291 : vector(size_type __n, const value_type& __value,
292 : const allocator_type& __a = allocator_type())
293 : : _Base(__n, __a)
294 : { _M_fill_initialize(__n, __value); }
295 : #else
296 : /**
297 : * @brief Creates a %vector with copies of an exemplar element.
298 : * @param __n The number of elements to initially create.
299 : * @param __value An element to copy.
300 : * @param __a An allocator.
301 : *
302 : * This constructor fills the %vector with @a __n copies of @a __value.
303 : */
304 : explicit
305 : vector(size_type __n, const value_type& __value = value_type(),
306 : const allocator_type& __a = allocator_type())
307 : : _Base(__n, __a)
308 : { _M_fill_initialize(__n, __value); }
309 : #endif
310 :
311 : /**
312 : * @brief %Vector copy constructor.
313 : * @param __x A %vector of identical element and allocator types.
314 : *
315 : * The newly-created %vector uses a copy of the allocation
316 : * object used by @a __x. All the elements of @a __x are copied,
317 : * but any extra memory in
318 : * @a __x (for fast expansion) will not be copied.
319 : */
320 209 : vector(const vector& __x)
321 : : _Base(__x.size(),
322 209 : _Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
323 209 : { this->_M_impl._M_finish =
324 209 : std::__uninitialized_copy_a(__x.begin(), __x.end(),
325 : this->_M_impl._M_start,
326 209 : _M_get_Tp_allocator());
327 209 : }
328 :
329 : #if __cplusplus >= 201103L
330 : /**
331 : * @brief %Vector move constructor.
332 : * @param __x A %vector of identical element and allocator types.
333 : *
334 : * The newly-created %vector contains the exact contents of @a __x.
335 : * The contents of @a __x are a valid, but unspecified %vector.
336 : */
337 72 : vector(vector&& __x) noexcept
338 72 : : _Base(std::move(__x)) { }
339 :
340 : /// Copy constructor with alternative allocator
341 : vector(const vector& __x, const allocator_type& __a)
342 : : _Base(__x.size(), __a)
343 : { this->_M_impl._M_finish =
344 : std::__uninitialized_copy_a(__x.begin(), __x.end(),
345 : this->_M_impl._M_start,
346 : _M_get_Tp_allocator());
347 : }
348 :
349 : /// Move constructor with alternative allocator
350 : vector(vector&& __rv, const allocator_type& __m)
351 : noexcept(_Alloc_traits::_S_always_equal())
352 : : _Base(std::move(__rv), __m)
353 : {
354 : if (__rv.get_allocator() != __m)
355 : {
356 : this->_M_impl._M_finish =
357 : std::__uninitialized_move_a(__rv.begin(), __rv.end(),
358 : this->_M_impl._M_start,
359 : _M_get_Tp_allocator());
360 : __rv.clear();
361 : }
362 : }
363 :
364 : /**
365 : * @brief Builds a %vector from an initializer list.
366 : * @param __l An initializer_list.
367 : * @param __a An allocator.
368 : *
369 : * Create a %vector consisting of copies of the elements in the
370 : * initializer_list @a __l.
371 : *
372 : * This will call the element type's copy constructor N times
373 : * (where N is @a __l.size()) and do no memory reallocation.
374 : */
375 : vector(initializer_list<value_type> __l,
376 : const allocator_type& __a = allocator_type())
377 : : _Base(__a)
378 : {
379 : _M_range_initialize(__l.begin(), __l.end(),
380 : random_access_iterator_tag());
381 : }
382 : #endif
383 :
384 : /**
385 : * @brief Builds a %vector from a range.
386 : * @param __first An input iterator.
387 : * @param __last An input iterator.
388 : * @param __a An allocator.
389 : *
390 : * Create a %vector consisting of copies of the elements from
391 : * [first,last).
392 : *
393 : * If the iterators are forward, bidirectional, or
394 : * random-access, then this will call the elements' copy
395 : * constructor N times (where N is distance(first,last)) and do
396 : * no memory reallocation. But if only input iterators are
397 : * used, then this will do at most 2N calls to the copy
398 : * constructor, and logN memory reallocations.
399 : */
400 : #if __cplusplus >= 201103L
401 : template<typename _InputIterator,
402 : typename = std::_RequireInputIter<_InputIterator>>
403 : vector(_InputIterator __first, _InputIterator __last,
404 : const allocator_type& __a = allocator_type())
405 : : _Base(__a)
406 : { _M_initialize_dispatch(__first, __last, __false_type()); }
407 : #else
408 : template<typename _InputIterator>
409 : vector(_InputIterator __first, _InputIterator __last,
410 : const allocator_type& __a = allocator_type())
411 : : _Base(__a)
412 : {
413 : // Check whether it's an integral type. If so, it's not an iterator.
414 : typedef typename std::__is_integer<_InputIterator>::__type _Integral;
415 : _M_initialize_dispatch(__first, __last, _Integral());
416 : }
417 : #endif
418 :
419 : /**
420 : * The dtor only erases the elements, and note that if the
421 : * elements themselves are pointers, the pointed-to memory is
422 : * not touched in any way. Managing the pointer is the user's
423 : * responsibility.
424 : */
425 3695 : ~vector() _GLIBCXX_NOEXCEPT
426 3695 : { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
427 7390 : _M_get_Tp_allocator()); }
428 :
429 : /**
430 : * @brief %Vector assignment operator.
431 : * @param __x A %vector of identical element and allocator types.
432 : *
433 : * All the elements of @a __x are copied, but any extra memory in
434 : * @a __x (for fast expansion) will not be copied. Unlike the
435 : * copy constructor, the allocator object is not copied.
436 : */
437 : vector&
438 : operator=(const vector& __x);
439 :
440 : #if __cplusplus >= 201103L
441 : /**
442 : * @brief %Vector move assignment operator.
443 : * @param __x A %vector of identical element and allocator types.
444 : *
445 : * The contents of @a __x are moved into this %vector (without copying,
446 : * if the allocators permit it).
447 : * @a __x is a valid, but unspecified %vector.
448 : */
449 : vector&
450 3 : operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
451 : {
452 : constexpr bool __move_storage =
453 : _Alloc_traits::_S_propagate_on_move_assign()
454 3 : || _Alloc_traits::_S_always_equal();
455 3 : _M_move_assign(std::move(__x), __bool_constant<__move_storage>());
456 3 : return *this;
457 : }
458 :
459 : /**
460 : * @brief %Vector list assignment operator.
461 : * @param __l An initializer_list.
462 : *
463 : * This function fills a %vector with copies of the elements in the
464 : * initializer list @a __l.
465 : *
466 : * Note that the assignment completely changes the %vector and
467 : * that the resulting %vector's size is the same as the number
468 : * of elements assigned. Old data may be lost.
469 : */
470 : vector&
471 : operator=(initializer_list<value_type> __l)
472 : {
473 : this->assign(__l.begin(), __l.end());
474 : return *this;
475 : }
476 : #endif
477 :
478 : /**
479 : * @brief Assigns a given value to a %vector.
480 : * @param __n Number of elements to be assigned.
481 : * @param __val Value to be assigned.
482 : *
483 : * This function fills a %vector with @a __n copies of the given
484 : * value. Note that the assignment completely changes the
485 : * %vector and that the resulting %vector's size is the same as
486 : * the number of elements assigned. Old data may be lost.
487 : */
488 : void
489 : assign(size_type __n, const value_type& __val)
490 : { _M_fill_assign(__n, __val); }
491 :
492 : /**
493 : * @brief Assigns a range to a %vector.
494 : * @param __first An input iterator.
495 : * @param __last An input iterator.
496 : *
497 : * This function fills a %vector with copies of the elements in the
498 : * range [__first,__last).
499 : *
500 : * Note that the assignment completely changes the %vector and
501 : * that the resulting %vector's size is the same as the number
502 : * of elements assigned. Old data may be lost.
503 : */
504 : #if __cplusplus >= 201103L
505 : template<typename _InputIterator,
506 : typename = std::_RequireInputIter<_InputIterator>>
507 : void
508 : assign(_InputIterator __first, _InputIterator __last)
509 : { _M_assign_dispatch(__first, __last, __false_type()); }
510 : #else
511 : template<typename _InputIterator>
512 : void
513 : assign(_InputIterator __first, _InputIterator __last)
514 : {
515 : // Check whether it's an integral type. If so, it's not an iterator.
516 : typedef typename std::__is_integer<_InputIterator>::__type _Integral;
517 : _M_assign_dispatch(__first, __last, _Integral());
518 : }
519 : #endif
520 :
521 : #if __cplusplus >= 201103L
522 : /**
523 : * @brief Assigns an initializer list to a %vector.
524 : * @param __l An initializer_list.
525 : *
526 : * This function fills a %vector with copies of the elements in the
527 : * initializer list @a __l.
528 : *
529 : * Note that the assignment completely changes the %vector and
530 : * that the resulting %vector's size is the same as the number
531 : * of elements assigned. Old data may be lost.
532 : */
533 : void
534 : assign(initializer_list<value_type> __l)
535 : { this->assign(__l.begin(), __l.end()); }
536 : #endif
537 :
538 : /// Get a copy of the memory allocation object.
539 : using _Base::get_allocator;
540 :
541 : // iterators
542 : /**
543 : * Returns a read/write iterator that points to the first
544 : * element in the %vector. Iteration is done in ordinary
545 : * element order.
546 : */
547 : iterator
548 3030 : begin() _GLIBCXX_NOEXCEPT
549 3030 : { return iterator(this->_M_impl._M_start); }
550 :
551 : /**
552 : * Returns a read-only (constant) iterator that points to the
553 : * first element in the %vector. Iteration is done in ordinary
554 : * element order.
555 : */
556 : const_iterator
557 593 : begin() const _GLIBCXX_NOEXCEPT
558 593 : { return const_iterator(this->_M_impl._M_start); }
559 :
560 : /**
561 : * Returns a read/write iterator that points one past the last
562 : * element in the %vector. Iteration is done in ordinary
563 : * element order.
564 : */
565 : iterator
566 3197 : end() _GLIBCXX_NOEXCEPT
567 3197 : { return iterator(this->_M_impl._M_finish); }
568 :
569 : /**
570 : * Returns a read-only (constant) iterator that points one past
571 : * the last element in the %vector. Iteration is done in
572 : * ordinary element order.
573 : */
574 : const_iterator
575 596 : end() const _GLIBCXX_NOEXCEPT
576 596 : { return const_iterator(this->_M_impl._M_finish); }
577 :
578 : /**
579 : * Returns a read/write reverse iterator that points to the
580 : * last element in the %vector. Iteration is done in reverse
581 : * element order.
582 : */
583 : reverse_iterator
584 : rbegin() _GLIBCXX_NOEXCEPT
585 : { return reverse_iterator(end()); }
586 :
587 : /**
588 : * Returns a read-only (constant) reverse iterator that points
589 : * to the last element in the %vector. Iteration is done in
590 : * reverse element order.
591 : */
592 : const_reverse_iterator
593 : rbegin() const _GLIBCXX_NOEXCEPT
594 : { return const_reverse_iterator(end()); }
595 :
596 : /**
597 : * Returns a read/write reverse iterator that points to one
598 : * before the first element in the %vector. Iteration is done
599 : * in reverse element order.
600 : */
601 : reverse_iterator
602 : rend() _GLIBCXX_NOEXCEPT
603 : { return reverse_iterator(begin()); }
604 :
605 : /**
606 : * Returns a read-only (constant) reverse iterator that points
607 : * to one before the first element in the %vector. Iteration
608 : * is done in reverse element order.
609 : */
610 : const_reverse_iterator
611 : rend() const _GLIBCXX_NOEXCEPT
612 : { return const_reverse_iterator(begin()); }
613 :
614 : #if __cplusplus >= 201103L
615 : /**
616 : * Returns a read-only (constant) iterator that points to the
617 : * first element in the %vector. Iteration is done in ordinary
618 : * element order.
619 : */
620 : const_iterator
621 0 : cbegin() const noexcept
622 0 : { return const_iterator(this->_M_impl._M_start); }
623 :
624 : /**
625 : * Returns a read-only (constant) iterator that points one past
626 : * the last element in the %vector. Iteration is done in
627 : * ordinary element order.
628 : */
629 : const_iterator
630 : cend() const noexcept
631 : { return const_iterator(this->_M_impl._M_finish); }
632 :
633 : /**
634 : * Returns a read-only (constant) reverse iterator that points
635 : * to the last element in the %vector. Iteration is done in
636 : * reverse element order.
637 : */
638 : const_reverse_iterator
639 : crbegin() const noexcept
640 : { return const_reverse_iterator(end()); }
641 :
642 : /**
643 : * Returns a read-only (constant) reverse iterator that points
644 : * to one before the first element in the %vector. Iteration
645 : * is done in reverse element order.
646 : */
647 : const_reverse_iterator
648 : crend() const noexcept
649 : { return const_reverse_iterator(begin()); }
650 : #endif
651 :
652 : // [23.2.4.2] capacity
653 : /** Returns the number of elements in the %vector. */
654 : size_type
655 21319 : size() const _GLIBCXX_NOEXCEPT
656 21319 : { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
657 :
658 : /** Returns the size() of the largest possible %vector. */
659 : size_type
660 8242 : max_size() const _GLIBCXX_NOEXCEPT
661 8242 : { return _Alloc_traits::max_size(_M_get_Tp_allocator()); }
662 :
663 : #if __cplusplus >= 201103L
664 : /**
665 : * @brief Resizes the %vector to the specified number of elements.
666 : * @param __new_size Number of elements the %vector should contain.
667 : *
668 : * This function will %resize the %vector to the specified
669 : * number of elements. If the number is smaller than the
670 : * %vector's current size the %vector is truncated, otherwise
671 : * default constructed elements are appended.
672 : */
673 : void
674 138 : resize(size_type __new_size)
675 : {
676 138 : if (__new_size > size())
677 138 : _M_default_append(__new_size - size());
678 0 : else if (__new_size < size())
679 0 : _M_erase_at_end(this->_M_impl._M_start + __new_size);
680 138 : }
681 :
682 : /**
683 : * @brief Resizes the %vector to the specified number of elements.
684 : * @param __new_size Number of elements the %vector should contain.
685 : * @param __x Data with which new elements should be populated.
686 : *
687 : * This function will %resize the %vector to the specified
688 : * number of elements. If the number is smaller than the
689 : * %vector's current size the %vector is truncated, otherwise
690 : * the %vector is extended and new elements are populated with
691 : * given data.
692 : */
693 : void
694 : resize(size_type __new_size, const value_type& __x)
695 : {
696 : if (__new_size > size())
697 : insert(end(), __new_size - size(), __x);
698 : else if (__new_size < size())
699 : _M_erase_at_end(this->_M_impl._M_start + __new_size);
700 : }
701 : #else
702 : /**
703 : * @brief Resizes the %vector to the specified number of elements.
704 : * @param __new_size Number of elements the %vector should contain.
705 : * @param __x Data with which new elements should be populated.
706 : *
707 : * This function will %resize the %vector to the specified
708 : * number of elements. If the number is smaller than the
709 : * %vector's current size the %vector is truncated, otherwise
710 : * the %vector is extended and new elements are populated with
711 : * given data.
712 : */
713 : void
714 : resize(size_type __new_size, value_type __x = value_type())
715 : {
716 : if (__new_size > size())
717 : insert(end(), __new_size - size(), __x);
718 : else if (__new_size < size())
719 : _M_erase_at_end(this->_M_impl._M_start + __new_size);
720 : }
721 : #endif
722 :
723 : #if __cplusplus >= 201103L
724 : /** A non-binding request to reduce capacity() to size(). */
725 : void
726 : shrink_to_fit()
727 : { _M_shrink_to_fit(); }
728 : #endif
729 :
730 : /**
731 : * Returns the total number of elements that the %vector can
732 : * hold before needing to allocate more memory.
733 : */
734 : size_type
735 43 : capacity() const _GLIBCXX_NOEXCEPT
736 43 : { return size_type(this->_M_impl._M_end_of_storage
737 43 : - this->_M_impl._M_start); }
738 :
739 : /**
740 : * Returns true if the %vector is empty. (Thus begin() would
741 : * equal end().)
742 : */
743 : bool
744 13 : empty() const _GLIBCXX_NOEXCEPT
745 13 : { return begin() == end(); }
746 :
747 : /**
748 : * @brief Attempt to preallocate enough memory for specified number of
749 : * elements.
750 : * @param __n Number of elements required.
751 : * @throw std::length_error If @a n exceeds @c max_size().
752 : *
753 : * This function attempts to reserve enough memory for the
754 : * %vector to hold the specified number of elements. If the
755 : * number requested is more than max_size(), length_error is
756 : * thrown.
757 : *
758 : * The advantage of this function is that if optimal code is a
759 : * necessity and the user can determine the number of elements
760 : * that will be required, the user can reserve the memory in
761 : * %advance, and thus prevent a possible reallocation of memory
762 : * and copying of %vector data.
763 : */
764 : void
765 : reserve(size_type __n);
766 :
767 : // element access
768 : /**
769 : * @brief Subscript access to the data contained in the %vector.
770 : * @param __n The index of the element for which data should be
771 : * accessed.
772 : * @return Read/write reference to data.
773 : *
774 : * This operator allows for easy, array-style, data access.
775 : * Note that data access with this operator is unchecked and
776 : * out_of_range lookups are not defined. (For checked lookups
777 : * see at().)
778 : */
779 : reference
780 70 : operator[](size_type __n) _GLIBCXX_NOEXCEPT
781 70 : { return *(this->_M_impl._M_start + __n); }
782 :
783 : /**
784 : * @brief Subscript access to the data contained in the %vector.
785 : * @param __n The index of the element for which data should be
786 : * accessed.
787 : * @return Read-only (constant) reference to data.
788 : *
789 : * This operator allows for easy, array-style, data access.
790 : * Note that data access with this operator is unchecked and
791 : * out_of_range lookups are not defined. (For checked lookups
792 : * see at().)
793 : */
794 : const_reference
795 1 : operator[](size_type __n) const _GLIBCXX_NOEXCEPT
796 1 : { return *(this->_M_impl._M_start + __n); }
797 :
798 : protected:
799 : /// Safety check used only from at().
800 : void
801 : _M_range_check(size_type __n) const
802 : {
803 : if (__n >= this->size())
804 : __throw_out_of_range_fmt(__N("vector::_M_range_check: __n "
805 : "(which is %zu) >= this->size() "
806 : "(which is %zu)"),
807 : __n, this->size());
808 : }
809 :
810 : public:
811 : /**
812 : * @brief Provides access to the data contained in the %vector.
813 : * @param __n The index of the element for which data should be
814 : * accessed.
815 : * @return Read/write reference to data.
816 : * @throw std::out_of_range If @a __n is an invalid index.
817 : *
818 : * This function provides for safer data access. The parameter
819 : * is first checked that it is in the range of the vector. The
820 : * function throws out_of_range if the check fails.
821 : */
822 : reference
823 : at(size_type __n)
824 : {
825 : _M_range_check(__n);
826 : return (*this)[__n];
827 : }
828 :
829 : /**
830 : * @brief Provides access to the data contained in the %vector.
831 : * @param __n The index of the element for which data should be
832 : * accessed.
833 : * @return Read-only (constant) reference to data.
834 : * @throw std::out_of_range If @a __n is an invalid index.
835 : *
836 : * This function provides for safer data access. The parameter
837 : * is first checked that it is in the range of the vector. The
838 : * function throws out_of_range if the check fails.
839 : */
840 : const_reference
841 : at(size_type __n) const
842 : {
843 : _M_range_check(__n);
844 : return (*this)[__n];
845 : }
846 :
847 : /**
848 : * Returns a read/write reference to the data at the first
849 : * element of the %vector.
850 : */
851 : reference
852 6 : front() _GLIBCXX_NOEXCEPT
853 6 : { return *begin(); }
854 :
855 : /**
856 : * Returns a read-only (constant) reference to the data at the first
857 : * element of the %vector.
858 : */
859 : const_reference
860 : front() const _GLIBCXX_NOEXCEPT
861 : { return *begin(); }
862 :
863 : /**
864 : * Returns a read/write reference to the data at the last
865 : * element of the %vector.
866 : */
867 : reference
868 138 : back() _GLIBCXX_NOEXCEPT
869 138 : { return *(end() - 1); }
870 :
871 : /**
872 : * Returns a read-only (constant) reference to the data at the
873 : * last element of the %vector.
874 : */
875 : const_reference
876 : back() const _GLIBCXX_NOEXCEPT
877 : { return *(end() - 1); }
878 :
879 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
880 : // DR 464. Suggestion for new member functions in standard containers.
881 : // data access
882 : /**
883 : * Returns a pointer such that [data(), data() + size()) is a valid
884 : * range. For a non-empty %vector, data() == &front().
885 : */
886 : #if __cplusplus >= 201103L
887 : _Tp*
888 : #else
889 : pointer
890 : #endif
891 : data() _GLIBCXX_NOEXCEPT
892 : { return _M_data_ptr(this->_M_impl._M_start); }
893 :
894 : #if __cplusplus >= 201103L
895 : const _Tp*
896 : #else
897 : const_pointer
898 : #endif
899 : data() const _GLIBCXX_NOEXCEPT
900 : { return _M_data_ptr(this->_M_impl._M_start); }
901 :
902 : // [23.2.4.3] modifiers
903 : /**
904 : * @brief Add data to the end of the %vector.
905 : * @param __x Data to be added.
906 : *
907 : * This is a typical stack operation. The function creates an
908 : * element at the end of the %vector and assigns the given data
909 : * to it. Due to the nature of a %vector this operation can be
910 : * done in constant time if the %vector has preallocated space
911 : * available.
912 : */
913 : void
914 30 : push_back(const value_type& __x)
915 : {
916 30 : if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
917 : {
918 0 : _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
919 : __x);
920 0 : ++this->_M_impl._M_finish;
921 : }
922 : else
923 : #if __cplusplus >= 201103L
924 30 : _M_emplace_back_aux(__x);
925 : #else
926 : _M_insert_aux(end(), __x);
927 : #endif
928 30 : }
929 :
930 : #if __cplusplus >= 201103L
931 : void
932 8533 : push_back(value_type&& __x)
933 8533 : { emplace_back(std::move(__x)); }
934 :
935 : template<typename... _Args>
936 : void
937 : emplace_back(_Args&&... __args);
938 : #endif
939 :
940 : /**
941 : * @brief Removes last element.
942 : *
943 : * This is a typical stack operation. It shrinks the %vector by one.
944 : *
945 : * Note that no data is returned, and if the last element's
946 : * data is needed, it should be retrieved before pop_back() is
947 : * called.
948 : */
949 : void
950 17 : pop_back() _GLIBCXX_NOEXCEPT
951 : {
952 17 : --this->_M_impl._M_finish;
953 17 : _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
954 17 : }
955 :
956 : #if __cplusplus >= 201103L
957 : /**
958 : * @brief Inserts an object in %vector before specified iterator.
959 : * @param __position A const_iterator into the %vector.
960 : * @param __args Arguments.
961 : * @return An iterator that points to the inserted data.
962 : *
963 : * This function will insert an object of type T constructed
964 : * with T(std::forward<Args>(args)...) before the specified location.
965 : * Note that this kind of operation could be expensive for a %vector
966 : * and if it is frequently used the user should consider using
967 : * std::list.
968 : */
969 : template<typename... _Args>
970 : iterator
971 : emplace(const_iterator __position, _Args&&... __args);
972 :
973 : /**
974 : * @brief Inserts given value into %vector before specified iterator.
975 : * @param __position A const_iterator into the %vector.
976 : * @param __x Data to be inserted.
977 : * @return An iterator that points to the inserted data.
978 : *
979 : * This function will insert a copy of the given value before
980 : * the specified location. Note that this kind of operation
981 : * could be expensive for a %vector and if it is frequently
982 : * used the user should consider using std::list.
983 : */
984 : iterator
985 : insert(const_iterator __position, const value_type& __x);
986 : #else
987 : /**
988 : * @brief Inserts given value into %vector before specified iterator.
989 : * @param __position An iterator into the %vector.
990 : * @param __x Data to be inserted.
991 : * @return An iterator that points to the inserted data.
992 : *
993 : * This function will insert a copy of the given value before
994 : * the specified location. Note that this kind of operation
995 : * could be expensive for a %vector and if it is frequently
996 : * used the user should consider using std::list.
997 : */
998 : iterator
999 : insert(iterator __position, const value_type& __x);
1000 : #endif
1001 :
1002 : #if __cplusplus >= 201103L
1003 : /**
1004 : * @brief Inserts given rvalue into %vector before specified iterator.
1005 : * @param __position A const_iterator into the %vector.
1006 : * @param __x Data to be inserted.
1007 : * @return An iterator that points to the inserted data.
1008 : *
1009 : * This function will insert a copy of the given rvalue before
1010 : * the specified location. Note that this kind of operation
1011 : * could be expensive for a %vector and if it is frequently
1012 : * used the user should consider using std::list.
1013 : */
1014 : iterator
1015 : insert(const_iterator __position, value_type&& __x)
1016 : { return emplace(__position, std::move(__x)); }
1017 :
1018 : /**
1019 : * @brief Inserts an initializer_list into the %vector.
1020 : * @param __position An iterator into the %vector.
1021 : * @param __l An initializer_list.
1022 : *
1023 : * This function will insert copies of the data in the
1024 : * initializer_list @a l into the %vector before the location
1025 : * specified by @a position.
1026 : *
1027 : * Note that this kind of operation could be expensive for a
1028 : * %vector and if it is frequently used the user should
1029 : * consider using std::list.
1030 : */
1031 : iterator
1032 : insert(const_iterator __position, initializer_list<value_type> __l)
1033 : { return this->insert(__position, __l.begin(), __l.end()); }
1034 : #endif
1035 :
1036 : #if __cplusplus >= 201103L
1037 : /**
1038 : * @brief Inserts a number of copies of given data into the %vector.
1039 : * @param __position A const_iterator into the %vector.
1040 : * @param __n Number of elements to be inserted.
1041 : * @param __x Data to be inserted.
1042 : * @return An iterator that points to the inserted data.
1043 : *
1044 : * This function will insert a specified number of copies of
1045 : * the given data before the location specified by @a position.
1046 : *
1047 : * Note that this kind of operation could be expensive for a
1048 : * %vector and if it is frequently used the user should
1049 : * consider using std::list.
1050 : */
1051 : iterator
1052 : insert(const_iterator __position, size_type __n, const value_type& __x)
1053 : {
1054 : difference_type __offset = __position - cbegin();
1055 : _M_fill_insert(begin() + __offset, __n, __x);
1056 : return begin() + __offset;
1057 : }
1058 : #else
1059 : /**
1060 : * @brief Inserts a number of copies of given data into the %vector.
1061 : * @param __position An iterator into the %vector.
1062 : * @param __n Number of elements to be inserted.
1063 : * @param __x Data to be inserted.
1064 : *
1065 : * This function will insert a specified number of copies of
1066 : * the given data before the location specified by @a position.
1067 : *
1068 : * Note that this kind of operation could be expensive for a
1069 : * %vector and if it is frequently used the user should
1070 : * consider using std::list.
1071 : */
1072 : void
1073 : insert(iterator __position, size_type __n, const value_type& __x)
1074 : { _M_fill_insert(__position, __n, __x); }
1075 : #endif
1076 :
1077 : #if __cplusplus >= 201103L
1078 : /**
1079 : * @brief Inserts a range into the %vector.
1080 : * @param __position A const_iterator into the %vector.
1081 : * @param __first An input iterator.
1082 : * @param __last An input iterator.
1083 : * @return An iterator that points to the inserted data.
1084 : *
1085 : * This function will insert copies of the data in the range
1086 : * [__first,__last) into the %vector before the location specified
1087 : * by @a pos.
1088 : *
1089 : * Note that this kind of operation could be expensive for a
1090 : * %vector and if it is frequently used the user should
1091 : * consider using std::list.
1092 : */
1093 : template<typename _InputIterator,
1094 : typename = std::_RequireInputIter<_InputIterator>>
1095 : iterator
1096 : insert(const_iterator __position, _InputIterator __first,
1097 : _InputIterator __last)
1098 : {
1099 : difference_type __offset = __position - cbegin();
1100 : _M_insert_dispatch(begin() + __offset,
1101 : __first, __last, __false_type());
1102 : return begin() + __offset;
1103 : }
1104 : #else
1105 : /**
1106 : * @brief Inserts a range into the %vector.
1107 : * @param __position An iterator into the %vector.
1108 : * @param __first An input iterator.
1109 : * @param __last An input iterator.
1110 : *
1111 : * This function will insert copies of the data in the range
1112 : * [__first,__last) into the %vector before the location specified
1113 : * by @a pos.
1114 : *
1115 : * Note that this kind of operation could be expensive for a
1116 : * %vector and if it is frequently used the user should
1117 : * consider using std::list.
1118 : */
1119 : template<typename _InputIterator>
1120 : void
1121 : insert(iterator __position, _InputIterator __first,
1122 : _InputIterator __last)
1123 : {
1124 : // Check whether it's an integral type. If so, it's not an iterator.
1125 : typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1126 : _M_insert_dispatch(__position, __first, __last, _Integral());
1127 : }
1128 : #endif
1129 :
1130 : /**
1131 : * @brief Remove element at given position.
1132 : * @param __position Iterator pointing to element to be erased.
1133 : * @return An iterator pointing to the next element (or end()).
1134 : *
1135 : * This function will erase the element at the given position and thus
1136 : * shorten the %vector by one.
1137 : *
1138 : * Note This operation could be expensive and if it is
1139 : * frequently used the user should consider using std::list.
1140 : * The user is also cautioned that this function only erases
1141 : * the element, and that if the element is itself a pointer,
1142 : * the pointed-to memory is not touched in any way. Managing
1143 : * the pointer is the user's responsibility.
1144 : */
1145 : iterator
1146 : #if __cplusplus >= 201103L
1147 0 : erase(const_iterator __position)
1148 0 : { return _M_erase(begin() + (__position - cbegin())); }
1149 : #else
1150 : erase(iterator __position)
1151 : { return _M_erase(__position); }
1152 : #endif
1153 :
1154 : /**
1155 : * @brief Remove a range of elements.
1156 : * @param __first Iterator pointing to the first element to be erased.
1157 : * @param __last Iterator pointing to one past the last element to be
1158 : * erased.
1159 : * @return An iterator pointing to the element pointed to by @a __last
1160 : * prior to erasing (or end()).
1161 : *
1162 : * This function will erase the elements in the range
1163 : * [__first,__last) and shorten the %vector accordingly.
1164 : *
1165 : * Note This operation could be expensive and if it is
1166 : * frequently used the user should consider using std::list.
1167 : * The user is also cautioned that this function only erases
1168 : * the elements, and that if the elements themselves are
1169 : * pointers, the pointed-to memory is not touched in any way.
1170 : * Managing the pointer is the user's responsibility.
1171 : */
1172 : iterator
1173 : #if __cplusplus >= 201103L
1174 0 : erase(const_iterator __first, const_iterator __last)
1175 : {
1176 0 : const auto __beg = begin();
1177 0 : const auto __cbeg = cbegin();
1178 0 : return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
1179 : }
1180 : #else
1181 : erase(iterator __first, iterator __last)
1182 : { return _M_erase(__first, __last); }
1183 : #endif
1184 :
1185 : /**
1186 : * @brief Swaps data with another %vector.
1187 : * @param __x A %vector of the same element and allocator types.
1188 : *
1189 : * This exchanges the elements between two vectors in constant time.
1190 : * (Three pointers, so it should be quite fast.)
1191 : * Note that the global std::swap() function is specialized such that
1192 : * std::swap(v1,v2) will feed to this function.
1193 : */
1194 : void
1195 0 : swap(vector& __x) _GLIBCXX_NOEXCEPT
1196 : {
1197 0 : this->_M_impl._M_swap_data(__x._M_impl);
1198 0 : _Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
1199 : __x._M_get_Tp_allocator());
1200 0 : }
1201 :
1202 : /**
1203 : * Erases all the elements. Note that this function only erases the
1204 : * elements, and that if the elements themselves are pointers, the
1205 : * pointed-to memory is not touched in any way. Managing the pointer is
1206 : * the user's responsibility.
1207 : */
1208 : void
1209 0 : clear() _GLIBCXX_NOEXCEPT
1210 0 : { _M_erase_at_end(this->_M_impl._M_start); }
1211 :
1212 : protected:
1213 : /**
1214 : * Memory expansion handler. Uses the member allocation function to
1215 : * obtain @a n bytes of memory, and then copies [first,last) into it.
1216 : */
1217 : template<typename _ForwardIterator>
1218 : pointer
1219 38 : _M_allocate_and_copy(size_type __n,
1220 : _ForwardIterator __first, _ForwardIterator __last)
1221 : {
1222 38 : pointer __result = this->_M_allocate(__n);
1223 : __try
1224 : {
1225 38 : std::__uninitialized_copy_a(__first, __last, __result,
1226 38 : _M_get_Tp_allocator());
1227 38 : return __result;
1228 : }
1229 0 : __catch(...)
1230 : {
1231 0 : _M_deallocate(__result, __n);
1232 0 : __throw_exception_again;
1233 : }
1234 : }
1235 :
1236 :
1237 : // Internal constructor functions follow.
1238 :
1239 : // Called by the range constructor to implement [23.1.1]/9
1240 :
1241 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1242 : // 438. Ambiguity in the "do the right thing" clause
1243 : template<typename _Integer>
1244 : void
1245 : _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
1246 : {
1247 : this->_M_impl._M_start = _M_allocate(static_cast<size_type>(__n));
1248 : this->_M_impl._M_end_of_storage =
1249 : this->_M_impl._M_start + static_cast<size_type>(__n);
1250 : _M_fill_initialize(static_cast<size_type>(__n), __value);
1251 : }
1252 :
1253 : // Called by the range constructor to implement [23.1.1]/9
1254 : template<typename _InputIterator>
1255 : void
1256 : _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1257 : __false_type)
1258 : {
1259 : typedef typename std::iterator_traits<_InputIterator>::
1260 : iterator_category _IterCategory;
1261 : _M_range_initialize(__first, __last, _IterCategory());
1262 : }
1263 :
1264 : // Called by the second initialize_dispatch above
1265 : template<typename _InputIterator>
1266 : void
1267 : _M_range_initialize(_InputIterator __first,
1268 : _InputIterator __last, std::input_iterator_tag)
1269 : {
1270 : for (; __first != __last; ++__first)
1271 : #if __cplusplus >= 201103L
1272 : emplace_back(*__first);
1273 : #else
1274 : push_back(*__first);
1275 : #endif
1276 : }
1277 :
1278 : // Called by the second initialize_dispatch above
1279 : template<typename _ForwardIterator>
1280 : void
1281 : _M_range_initialize(_ForwardIterator __first,
1282 : _ForwardIterator __last, std::forward_iterator_tag)
1283 : {
1284 : const size_type __n = std::distance(__first, __last);
1285 : this->_M_impl._M_start = this->_M_allocate(__n);
1286 : this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
1287 : this->_M_impl._M_finish =
1288 : std::__uninitialized_copy_a(__first, __last,
1289 : this->_M_impl._M_start,
1290 : _M_get_Tp_allocator());
1291 : }
1292 :
1293 : // Called by the first initialize_dispatch above and by the
1294 : // vector(n,value,a) constructor.
1295 : void
1296 : _M_fill_initialize(size_type __n, const value_type& __value)
1297 : {
1298 : this->_M_impl._M_finish =
1299 : std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
1300 : _M_get_Tp_allocator());
1301 : }
1302 :
1303 : #if __cplusplus >= 201103L
1304 : // Called by the vector(n) constructor.
1305 : void
1306 : _M_default_initialize(size_type __n)
1307 : {
1308 : this->_M_impl._M_finish =
1309 : std::__uninitialized_default_n_a(this->_M_impl._M_start, __n,
1310 : _M_get_Tp_allocator());
1311 : }
1312 : #endif
1313 :
1314 : // Internal assign functions follow. The *_aux functions do the actual
1315 : // assignment work for the range versions.
1316 :
1317 : // Called by the range assign to implement [23.1.1]/9
1318 :
1319 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1320 : // 438. Ambiguity in the "do the right thing" clause
1321 : template<typename _Integer>
1322 : void
1323 : _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1324 : { _M_fill_assign(__n, __val); }
1325 :
1326 : // Called by the range assign to implement [23.1.1]/9
1327 : template<typename _InputIterator>
1328 : void
1329 : _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1330 : __false_type)
1331 : {
1332 : typedef typename std::iterator_traits<_InputIterator>::
1333 : iterator_category _IterCategory;
1334 : _M_assign_aux(__first, __last, _IterCategory());
1335 : }
1336 :
1337 : // Called by the second assign_dispatch above
1338 : template<typename _InputIterator>
1339 : void
1340 : _M_assign_aux(_InputIterator __first, _InputIterator __last,
1341 : std::input_iterator_tag);
1342 :
1343 : // Called by the second assign_dispatch above
1344 : template<typename _ForwardIterator>
1345 : void
1346 : _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1347 : std::forward_iterator_tag);
1348 :
1349 : // Called by assign(n,t), and the range assign when it turns out
1350 : // to be the same thing.
1351 : void
1352 : _M_fill_assign(size_type __n, const value_type& __val);
1353 :
1354 :
1355 : // Internal insert functions follow.
1356 :
1357 : // Called by the range insert to implement [23.1.1]/9
1358 :
1359 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1360 : // 438. Ambiguity in the "do the right thing" clause
1361 : template<typename _Integer>
1362 : void
1363 : _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
1364 : __true_type)
1365 : { _M_fill_insert(__pos, __n, __val); }
1366 :
1367 : // Called by the range insert to implement [23.1.1]/9
1368 : template<typename _InputIterator>
1369 : void
1370 : _M_insert_dispatch(iterator __pos, _InputIterator __first,
1371 : _InputIterator __last, __false_type)
1372 : {
1373 : typedef typename std::iterator_traits<_InputIterator>::
1374 : iterator_category _IterCategory;
1375 : _M_range_insert(__pos, __first, __last, _IterCategory());
1376 : }
1377 :
1378 : // Called by the second insert_dispatch above
1379 : template<typename _InputIterator>
1380 : void
1381 : _M_range_insert(iterator __pos, _InputIterator __first,
1382 : _InputIterator __last, std::input_iterator_tag);
1383 :
1384 : // Called by the second insert_dispatch above
1385 : template<typename _ForwardIterator>
1386 : void
1387 : _M_range_insert(iterator __pos, _ForwardIterator __first,
1388 : _ForwardIterator __last, std::forward_iterator_tag);
1389 :
1390 : // Called by insert(p,n,x), and the range insert when it turns out to be
1391 : // the same thing.
1392 : void
1393 : _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
1394 :
1395 : #if __cplusplus >= 201103L
1396 : // Called by resize(n).
1397 : void
1398 : _M_default_append(size_type __n);
1399 :
1400 : bool
1401 : _M_shrink_to_fit();
1402 : #endif
1403 :
1404 : // Called by insert(p,x)
1405 : #if __cplusplus < 201103L
1406 : void
1407 : _M_insert_aux(iterator __position, const value_type& __x);
1408 : #else
1409 : template<typename... _Args>
1410 : void
1411 : _M_insert_aux(iterator __position, _Args&&... __args);
1412 :
1413 : template<typename... _Args>
1414 : void
1415 : _M_emplace_back_aux(_Args&&... __args);
1416 : #endif
1417 :
1418 : // Called by the latter.
1419 : size_type
1420 4107 : _M_check_len(size_type __n, const char* __s) const
1421 : {
1422 4107 : if (max_size() - size() < __n)
1423 0 : __throw_length_error(__N(__s));
1424 :
1425 4107 : const size_type __len = size() + std::max(size(), __n);
1426 4107 : return (__len < size() || __len > max_size()) ? max_size() : __len;
1427 : }
1428 :
1429 : // Internal erase functions follow.
1430 :
1431 : // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
1432 : // _M_assign_aux.
1433 : void
1434 0 : _M_erase_at_end(pointer __pos) _GLIBCXX_NOEXCEPT
1435 : {
1436 0 : std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator());
1437 0 : this->_M_impl._M_finish = __pos;
1438 0 : }
1439 :
1440 : iterator
1441 : _M_erase(iterator __position);
1442 :
1443 : iterator
1444 : _M_erase(iterator __first, iterator __last);
1445 :
1446 : #if __cplusplus >= 201103L
1447 : private:
1448 : // Constant-time move assignment when source object's memory can be
1449 : // moved, either because the source's allocator will move too
1450 : // or because the allocators are equal.
1451 : void
1452 3 : _M_move_assign(vector&& __x, std::true_type) noexcept
1453 : {
1454 6 : vector __tmp(get_allocator());
1455 3 : this->_M_impl._M_swap_data(__tmp._M_impl);
1456 3 : this->_M_impl._M_swap_data(__x._M_impl);
1457 3 : std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
1458 3 : }
1459 :
1460 : // Do move assignment when it might not be possible to move source
1461 : // object's memory, resulting in a linear-time operation.
1462 : void
1463 : _M_move_assign(vector&& __x, std::false_type)
1464 : {
1465 : if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
1466 : _M_move_assign(std::move(__x), std::true_type());
1467 : else
1468 : {
1469 : // The rvalue's allocator cannot be moved and is not equal,
1470 : // so we need to individually move each element.
1471 : this->assign(std::__make_move_if_noexcept_iterator(__x.begin()),
1472 : std::__make_move_if_noexcept_iterator(__x.end()));
1473 : __x.clear();
1474 : }
1475 : }
1476 : #endif
1477 :
1478 : #if __cplusplus >= 201103L
1479 : template<typename _Up>
1480 : _Up*
1481 : _M_data_ptr(_Up* __ptr) const
1482 : { return __ptr; }
1483 :
1484 : template<typename _Ptr>
1485 : typename std::pointer_traits<_Ptr>::element_type*
1486 : _M_data_ptr(_Ptr __ptr) const
1487 : { return empty() ? nullptr : std::__addressof(*__ptr); }
1488 : #else
1489 : template<typename _Ptr>
1490 : _Ptr
1491 : _M_data_ptr(_Ptr __ptr) const
1492 : { return __ptr; }
1493 : #endif
1494 : };
1495 :
1496 :
1497 : /**
1498 : * @brief Vector equality comparison.
1499 : * @param __x A %vector.
1500 : * @param __y A %vector of the same type as @a __x.
1501 : * @return True iff the size and elements of the vectors are equal.
1502 : *
1503 : * This is an equivalence relation. It is linear in the size of the
1504 : * vectors. Vectors are considered equivalent if their sizes are equal,
1505 : * and if corresponding elements compare equal.
1506 : */
1507 : template<typename _Tp, typename _Alloc>
1508 : inline bool
1509 : operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1510 : { return (__x.size() == __y.size()
1511 : && std::equal(__x.begin(), __x.end(), __y.begin())); }
1512 :
1513 : /**
1514 : * @brief Vector ordering relation.
1515 : * @param __x A %vector.
1516 : * @param __y A %vector of the same type as @a __x.
1517 : * @return True iff @a __x is lexicographically less than @a __y.
1518 : *
1519 : * This is a total ordering relation. It is linear in the size of the
1520 : * vectors. The elements must be comparable with @c <.
1521 : *
1522 : * See std::lexicographical_compare() for how the determination is made.
1523 : */
1524 : template<typename _Tp, typename _Alloc>
1525 : inline bool
1526 : operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1527 : { return std::lexicographical_compare(__x.begin(), __x.end(),
1528 : __y.begin(), __y.end()); }
1529 :
1530 : /// Based on operator==
1531 : template<typename _Tp, typename _Alloc>
1532 : inline bool
1533 : operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1534 : { return !(__x == __y); }
1535 :
1536 : /// Based on operator<
1537 : template<typename _Tp, typename _Alloc>
1538 : inline bool
1539 : operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1540 : { return __y < __x; }
1541 :
1542 : /// Based on operator<
1543 : template<typename _Tp, typename _Alloc>
1544 : inline bool
1545 : operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1546 : { return !(__y < __x); }
1547 :
1548 : /// Based on operator<
1549 : template<typename _Tp, typename _Alloc>
1550 : inline bool
1551 : operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1552 : { return !(__x < __y); }
1553 :
1554 : /// See std::vector::swap().
1555 : template<typename _Tp, typename _Alloc>
1556 : inline void
1557 : swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
1558 : _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y)))
1559 : { __x.swap(__y); }
1560 :
1561 : _GLIBCXX_END_NAMESPACE_CONTAINER
1562 : } // namespace std
1563 :
1564 : #endif /* _STL_VECTOR_H */
|