Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5134 serge 1
// vector specialization -*- C++ -*-
2
 
3
// Copyright (C) 2001-2013 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
// .
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-1999
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_bvector.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_BVECTOR_H
57
#define _STL_BVECTOR_H 1
58
 
59
#if __cplusplus >= 201103L
60
#include 
61
#endif
62
 
63
namespace std _GLIBCXX_VISIBILITY(default)
64
{
65
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
66
 
67
  typedef unsigned long _Bit_type;
68
  enum { _S_word_bit = int(__CHAR_BIT__ * sizeof(_Bit_type)) };
69
 
70
  struct _Bit_reference
71
  {
72
    _Bit_type * _M_p;
73
    _Bit_type _M_mask;
74
 
75
    _Bit_reference(_Bit_type * __x, _Bit_type __y)
76
    : _M_p(__x), _M_mask(__y) { }
77
 
78
    _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
79
 
80
    operator bool() const _GLIBCXX_NOEXCEPT
81
    { return !!(*_M_p & _M_mask); }
82
 
83
    _Bit_reference&
84
    operator=(bool __x) _GLIBCXX_NOEXCEPT
85
    {
86
      if (__x)
87
	*_M_p |= _M_mask;
88
      else
89
	*_M_p &= ~_M_mask;
90
      return *this;
91
    }
92
 
93
    _Bit_reference&
94
    operator=(const _Bit_reference& __x) _GLIBCXX_NOEXCEPT
95
    { return *this = bool(__x); }
96
 
97
    bool
98
    operator==(const _Bit_reference& __x) const
99
    { return bool(*this) == bool(__x); }
100
 
101
    bool
102
    operator<(const _Bit_reference& __x) const
103
    { return !bool(*this) && bool(__x); }
104
 
105
    void
106
    flip() _GLIBCXX_NOEXCEPT
107
    { *_M_p ^= _M_mask; }
108
  };
109
 
110
#if __cplusplus >= 201103L
111
  inline void
112
  swap(_Bit_reference __x, _Bit_reference __y) noexcept
113
  {
114
    bool __tmp = __x;
115
    __x = __y;
116
    __y = __tmp;
117
  }
118
 
119
  inline void
120
  swap(_Bit_reference __x, bool& __y) noexcept
121
  {
122
    bool __tmp = __x;
123
    __x = __y;
124
    __y = __tmp;
125
  }
126
 
127
  inline void
128
  swap(bool& __x, _Bit_reference __y) noexcept
129
  {
130
    bool __tmp = __x;
131
    __x = __y;
132
    __y = __tmp;
133
  }
134
#endif
135
 
136
  struct _Bit_iterator_base
137
  : public std::iterator
138
  {
139
    _Bit_type * _M_p;
140
    unsigned int _M_offset;
141
 
142
    _Bit_iterator_base(_Bit_type * __x, unsigned int __y)
143
    : _M_p(__x), _M_offset(__y) { }
144
 
145
    void
146
    _M_bump_up()
147
    {
148
      if (_M_offset++ == int(_S_word_bit) - 1)
149
	{
150
	  _M_offset = 0;
151
	  ++_M_p;
152
	}
153
    }
154
 
155
    void
156
    _M_bump_down()
157
    {
158
      if (_M_offset-- == 0)
159
	{
160
	  _M_offset = int(_S_word_bit) - 1;
161
	  --_M_p;
162
	}
163
    }
164
 
165
    void
166
    _M_incr(ptrdiff_t __i)
167
    {
168
      difference_type __n = __i + _M_offset;
169
      _M_p += __n / int(_S_word_bit);
170
      __n = __n % int(_S_word_bit);
171
      if (__n < 0)
172
	{
173
	  __n += int(_S_word_bit);
174
	  --_M_p;
175
	}
176
      _M_offset = static_cast(__n);
177
    }
178
 
179
    bool
180
    operator==(const _Bit_iterator_base& __i) const
181
    { return _M_p == __i._M_p && _M_offset == __i._M_offset; }
182
 
183
    bool
184
    operator<(const _Bit_iterator_base& __i) const
185
    {
186
      return _M_p < __i._M_p
187
	     || (_M_p == __i._M_p && _M_offset < __i._M_offset);
188
    }
189
 
190
    bool
191
    operator!=(const _Bit_iterator_base& __i) const
192
    { return !(*this == __i); }
193
 
194
    bool
195
    operator>(const _Bit_iterator_base& __i) const
196
    { return __i < *this; }
197
 
198
    bool
199
    operator<=(const _Bit_iterator_base& __i) const
200
    { return !(__i < *this); }
201
 
202
    bool
203
    operator>=(const _Bit_iterator_base& __i) const
204
    { return !(*this < __i); }
205
  };
206
 
207
  inline ptrdiff_t
208
  operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
209
  {
210
    return (int(_S_word_bit) * (__x._M_p - __y._M_p)
211
	    + __x._M_offset - __y._M_offset);
212
  }
213
 
214
  struct _Bit_iterator : public _Bit_iterator_base
215
  {
216
    typedef _Bit_reference  reference;
217
    typedef _Bit_reference* pointer;
218
    typedef _Bit_iterator   iterator;
219
 
220
    _Bit_iterator() : _Bit_iterator_base(0, 0) { }
221
 
222
    _Bit_iterator(_Bit_type * __x, unsigned int __y)
223
    : _Bit_iterator_base(__x, __y) { }
224
 
225
    reference
226
    operator*() const
227
    { return reference(_M_p, 1UL << _M_offset); }
228
 
229
    iterator&
230
    operator++()
231
    {
232
      _M_bump_up();
233
      return *this;
234
    }
235
 
236
    iterator
237
    operator++(int)
238
    {
239
      iterator __tmp = *this;
240
      _M_bump_up();
241
      return __tmp;
242
    }
243
 
244
    iterator&
245
    operator--()
246
    {
247
      _M_bump_down();
248
      return *this;
249
    }
250
 
251
    iterator
252
    operator--(int)
253
    {
254
      iterator __tmp = *this;
255
      _M_bump_down();
256
      return __tmp;
257
    }
258
 
259
    iterator&
260
    operator+=(difference_type __i)
261
    {
262
      _M_incr(__i);
263
      return *this;
264
    }
265
 
266
    iterator&
267
    operator-=(difference_type __i)
268
    {
269
      *this += -__i;
270
      return *this;
271
    }
272
 
273
    iterator
274
    operator+(difference_type __i) const
275
    {
276
      iterator __tmp = *this;
277
      return __tmp += __i;
278
    }
279
 
280
    iterator
281
    operator-(difference_type __i) const
282
    {
283
      iterator __tmp = *this;
284
      return __tmp -= __i;
285
    }
286
 
287
    reference
288
    operator[](difference_type __i) const
289
    { return *(*this + __i); }
290
  };
291
 
292
  inline _Bit_iterator
293
  operator+(ptrdiff_t __n, const _Bit_iterator& __x)
294
  { return __x + __n; }
295
 
296
  struct _Bit_const_iterator : public _Bit_iterator_base
297
  {
298
    typedef bool                 reference;
299
    typedef bool                 const_reference;
300
    typedef const bool*          pointer;
301
    typedef _Bit_const_iterator  const_iterator;
302
 
303
    _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }
304
 
305
    _Bit_const_iterator(_Bit_type * __x, unsigned int __y)
306
    : _Bit_iterator_base(__x, __y) { }
307
 
308
    _Bit_const_iterator(const _Bit_iterator& __x)
309
    : _Bit_iterator_base(__x._M_p, __x._M_offset) { }
310
 
311
    const_reference
312
    operator*() const
313
    { return _Bit_reference(_M_p, 1UL << _M_offset); }
314
 
315
    const_iterator&
316
    operator++()
317
    {
318
      _M_bump_up();
319
      return *this;
320
    }
321
 
322
    const_iterator
323
    operator++(int)
324
    {
325
      const_iterator __tmp = *this;
326
      _M_bump_up();
327
      return __tmp;
328
    }
329
 
330
    const_iterator&
331
    operator--()
332
    {
333
      _M_bump_down();
334
      return *this;
335
    }
336
 
337
    const_iterator
338
    operator--(int)
339
    {
340
      const_iterator __tmp = *this;
341
      _M_bump_down();
342
      return __tmp;
343
    }
344
 
345
    const_iterator&
346
    operator+=(difference_type __i)
347
    {
348
      _M_incr(__i);
349
      return *this;
350
    }
351
 
352
    const_iterator&
353
    operator-=(difference_type __i)
354
    {
355
      *this += -__i;
356
      return *this;
357
    }
358
 
359
    const_iterator
360
    operator+(difference_type __i) const
361
    {
362
      const_iterator __tmp = *this;
363
      return __tmp += __i;
364
    }
365
 
366
    const_iterator
367
    operator-(difference_type __i) const
368
    {
369
      const_iterator __tmp = *this;
370
      return __tmp -= __i;
371
    }
372
 
373
    const_reference
374
    operator[](difference_type __i) const
375
    { return *(*this + __i); }
376
  };
377
 
378
  inline _Bit_const_iterator
379
  operator+(ptrdiff_t __n, const _Bit_const_iterator& __x)
380
  { return __x + __n; }
381
 
382
  inline void
383
  __fill_bvector(_Bit_iterator __first, _Bit_iterator __last, bool __x)
384
  {
385
    for (; __first != __last; ++__first)
386
      *__first = __x;
387
  }
388
 
389
  inline void
390
  fill(_Bit_iterator __first, _Bit_iterator __last, const bool& __x)
391
  {
392
    if (__first._M_p != __last._M_p)
393
      {
394
	std::fill(__first._M_p + 1, __last._M_p, __x ? ~0 : 0);
395
	__fill_bvector(__first, _Bit_iterator(__first._M_p + 1, 0), __x);
396
	__fill_bvector(_Bit_iterator(__last._M_p, 0), __last, __x);
397
      }
398
    else
399
      __fill_bvector(__first, __last, __x);
400
  }
401
 
402
  template
403
    struct _Bvector_base
404
    {
405
      typedef typename _Alloc::template rebind<_Bit_type>::other
406
        _Bit_alloc_type;
407
 
408
      struct _Bvector_impl
409
      : public _Bit_alloc_type
410
      {
411
	_Bit_iterator 	_M_start;
412
	_Bit_iterator 	_M_finish;
413
	_Bit_type* 	_M_end_of_storage;
414
 
415
	_Bvector_impl()
416
	: _Bit_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage(0)
417
	{ }
418
 
419
	_Bvector_impl(const _Bit_alloc_type& __a)
420
	: _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage(0)
421
	{ }
422
 
423
#if __cplusplus >= 201103L
424
	_Bvector_impl(_Bit_alloc_type&& __a)
425
	: _Bit_alloc_type(std::move(__a)), _M_start(), _M_finish(),
426
	  _M_end_of_storage(0)
427
	{ }
428
#endif
429
      };
430
 
431
    public:
432
      typedef _Alloc allocator_type;
433
 
434
      _Bit_alloc_type&
435
      _M_get_Bit_allocator() _GLIBCXX_NOEXCEPT
436
      { return *static_cast<_Bit_alloc_type*>(&this->_M_impl); }
437
 
438
      const _Bit_alloc_type&
439
      _M_get_Bit_allocator() const _GLIBCXX_NOEXCEPT
440
      { return *static_cast(&this->_M_impl); }
441
 
442
      allocator_type
443
      get_allocator() const _GLIBCXX_NOEXCEPT
444
      { return allocator_type(_M_get_Bit_allocator()); }
445
 
446
      _Bvector_base()
447
      : _M_impl() { }
448
 
449
      _Bvector_base(const allocator_type& __a)
450
      : _M_impl(__a) { }
451
 
452
#if __cplusplus >= 201103L
453
      _Bvector_base(_Bvector_base&& __x) noexcept
454
      : _M_impl(std::move(__x._M_get_Bit_allocator()))
455
      {
456
	this->_M_impl._M_start = __x._M_impl._M_start;
457
	this->_M_impl._M_finish = __x._M_impl._M_finish;
458
	this->_M_impl._M_end_of_storage = __x._M_impl._M_end_of_storage;
459
	__x._M_impl._M_start = _Bit_iterator();
460
	__x._M_impl._M_finish = _Bit_iterator();
461
	__x._M_impl._M_end_of_storage = 0;
462
      }
463
#endif
464
 
465
      ~_Bvector_base()
466
      { this->_M_deallocate(); }
467
 
468
    protected:
469
      _Bvector_impl _M_impl;
470
 
471
      _Bit_type*
472
      _M_allocate(size_t __n)
473
      { return _M_impl.allocate(_S_nword(__n)); }
474
 
475
      void
476
      _M_deallocate()
477
      {
478
	if (_M_impl._M_start._M_p)
479
	  _M_impl.deallocate(_M_impl._M_start._M_p,
480
			     _M_impl._M_end_of_storage - _M_impl._M_start._M_p);
481
      }
482
 
483
      static size_t
484
      _S_nword(size_t __n)
485
      { return (__n + int(_S_word_bit) - 1) / int(_S_word_bit); }
486
    };
487
 
488
_GLIBCXX_END_NAMESPACE_CONTAINER
489
} // namespace std
490
 
491
// Declare a partial specialization of vector.
492
#include 
493
 
494
namespace std _GLIBCXX_VISIBILITY(default)
495
{
496
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
497
 
498
  /**
499
   *  @brief  A specialization of vector for booleans which offers fixed time
500
   *  access to individual elements in any order.
501
   *
502
   *  @ingroup sequences
503
   *
504
   *  @tparam _Alloc  Allocator type.
505
   *
506
   *  Note that vector does not actually meet the requirements for being
507
   *  a container.  This is because the reference and pointer types are not
508
   *  really references and pointers to bool.  See DR96 for details.  @see
509
   *  vector for function documentation.
510
   *
511
   *  In some terminology a %vector can be described as a dynamic
512
   *  C-style array, it offers fast and efficient access to individual
513
   *  elements in any order and saves the user from worrying about
514
   *  memory and size allocation.  Subscripting ( @c [] ) access is
515
   *  also provided as with C-style arrays.
516
  */
517
template
518
  class vector : protected _Bvector_base<_Alloc>
519
  {
520
    typedef _Bvector_base<_Alloc>			 _Base;
521
 
522
#if __cplusplus >= 201103L
523
    template friend struct hash;
524
#endif
525
 
526
  public:
527
    typedef bool                                         value_type;
528
    typedef size_t                                       size_type;
529
    typedef ptrdiff_t                                    difference_type;
530
    typedef _Bit_reference                               reference;
531
    typedef bool                                         const_reference;
532
    typedef _Bit_reference*                              pointer;
533
    typedef const bool*                                  const_pointer;
534
    typedef _Bit_iterator                                iterator;
535
    typedef _Bit_const_iterator                          const_iterator;
536
    typedef std::reverse_iterator        const_reverse_iterator;
537
    typedef std::reverse_iterator              reverse_iterator;
538
    typedef _Alloc                        		 allocator_type;
539
 
540
    allocator_type get_allocator() const
541
    { return _Base::get_allocator(); }
542
 
543
  protected:
544
    using _Base::_M_allocate;
545
    using _Base::_M_deallocate;
546
    using _Base::_S_nword;
547
    using _Base::_M_get_Bit_allocator;
548
 
549
  public:
550
    vector()
551
    : _Base() { }
552
 
553
    explicit
554
    vector(const allocator_type& __a)
555
    : _Base(__a) { }
556
 
557
#if __cplusplus >= 201103L
558
    explicit
559
    vector(size_type __n, const allocator_type& __a = allocator_type())
560
    : vector(__n, false, __a)
561
    { }
562
 
563
    vector(size_type __n, const bool& __value,
564
	   const allocator_type& __a = allocator_type())
565
    : _Base(__a)
566
    {
567
      _M_initialize(__n);
568
      std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_of_storage,
569
		__value ? ~0 : 0);
570
    }
571
#else
572
    explicit
573
    vector(size_type __n, const bool& __value = bool(),
574
	   const allocator_type& __a = allocator_type())
575
    : _Base(__a)
576
    {
577
      _M_initialize(__n);
578
      std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_of_storage,
579
		__value ? ~0 : 0);
580
    }
581
#endif
582
 
583
    vector(const vector& __x)
584
    : _Base(__x._M_get_Bit_allocator())
585
    {
586
      _M_initialize(__x.size());
587
      _M_copy_aligned(__x.begin(), __x.end(), this->_M_impl._M_start);
588
    }
589
 
590
#if __cplusplus >= 201103L
591
    vector(vector&& __x) noexcept
592
    : _Base(std::move(__x)) { }
593
 
594
    vector(initializer_list __l,
595
	   const allocator_type& __a = allocator_type())
596
    : _Base(__a)
597
    {
598
      _M_initialize_range(__l.begin(), __l.end(),
599
			  random_access_iterator_tag());
600
    }
601
#endif
602
 
603
#if __cplusplus >= 201103L
604
    template
605
	     typename = std::_RequireInputIter<_InputIterator>>
606
      vector(_InputIterator __first, _InputIterator __last,
607
	     const allocator_type& __a = allocator_type())
608
      : _Base(__a)
609
      { _M_initialize_dispatch(__first, __last, __false_type()); }
610
#else
611
    template
612
      vector(_InputIterator __first, _InputIterator __last,
613
	     const allocator_type& __a = allocator_type())
614
      : _Base(__a)
615
      {
616
	typedef typename std::__is_integer<_InputIterator>::__type _Integral;
617
	_M_initialize_dispatch(__first, __last, _Integral());
618
      }
619
#endif
620
 
621
    ~vector() _GLIBCXX_NOEXCEPT { }
622
 
623
    vector&
624
    operator=(const vector& __x)
625
    {
626
      if (&__x == this)
627
	return *this;
628
      if (__x.size() > capacity())
629
	{
630
	  this->_M_deallocate();
631
	  _M_initialize(__x.size());
632
	}
633
      this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
634
						begin());
635
      return *this;
636
    }
637
 
638
#if __cplusplus >= 201103L
639
    vector&
640
    operator=(vector&& __x)
641
    {
642
      // NB: DR 1204.
643
      // NB: DR 675.
644
      this->clear();
645
      this->swap(__x);
646
      return *this;
647
    }
648
 
649
    vector&
650
    operator=(initializer_list __l)
651
    {
652
      this->assign (__l.begin(), __l.end());
653
      return *this;
654
    }
655
#endif
656
 
657
    // assign(), a generalized assignment member function.  Two
658
    // versions: one that takes a count, and one that takes a range.
659
    // The range version is a member template, so we dispatch on whether
660
    // or not the type is an integer.
661
    void
662
    assign(size_type __n, const bool& __x)
663
    { _M_fill_assign(__n, __x); }
664
 
665
#if __cplusplus >= 201103L
666
    template
667
	     typename = std::_RequireInputIter<_InputIterator>>
668
      void
669
      assign(_InputIterator __first, _InputIterator __last)
670
      { _M_assign_dispatch(__first, __last, __false_type()); }
671
#else
672
    template
673
      void
674
      assign(_InputIterator __first, _InputIterator __last)
675
      {
676
	typedef typename std::__is_integer<_InputIterator>::__type _Integral;
677
	_M_assign_dispatch(__first, __last, _Integral());
678
      }
679
#endif
680
 
681
#if __cplusplus >= 201103L
682
    void
683
    assign(initializer_list __l)
684
    { this->assign(__l.begin(), __l.end()); }
685
#endif
686
 
687
    iterator
688
    begin() _GLIBCXX_NOEXCEPT
689
    { return this->_M_impl._M_start; }
690
 
691
    const_iterator
692
    begin() const _GLIBCXX_NOEXCEPT
693
    { return this->_M_impl._M_start; }
694
 
695
    iterator
696
    end() _GLIBCXX_NOEXCEPT
697
    { return this->_M_impl._M_finish; }
698
 
699
    const_iterator
700
    end() const _GLIBCXX_NOEXCEPT
701
    { return this->_M_impl._M_finish; }
702
 
703
    reverse_iterator
704
    rbegin() _GLIBCXX_NOEXCEPT
705
    { return reverse_iterator(end()); }
706
 
707
    const_reverse_iterator
708
    rbegin() const _GLIBCXX_NOEXCEPT
709
    { return const_reverse_iterator(end()); }
710
 
711
    reverse_iterator
712
    rend() _GLIBCXX_NOEXCEPT
713
    { return reverse_iterator(begin()); }
714
 
715
    const_reverse_iterator
716
    rend() const _GLIBCXX_NOEXCEPT
717
    { return const_reverse_iterator(begin()); }
718
 
719
#if __cplusplus >= 201103L
720
    const_iterator
721
    cbegin() const noexcept
722
    { return this->_M_impl._M_start; }
723
 
724
    const_iterator
725
    cend() const noexcept
726
    { return this->_M_impl._M_finish; }
727
 
728
    const_reverse_iterator
729
    crbegin() const noexcept
730
    { return const_reverse_iterator(end()); }
731
 
732
    const_reverse_iterator
733
    crend() const noexcept
734
    { return const_reverse_iterator(begin()); }
735
#endif
736
 
737
    size_type
738
    size() const _GLIBCXX_NOEXCEPT
739
    { return size_type(end() - begin()); }
740
 
741
    size_type
742
    max_size() const _GLIBCXX_NOEXCEPT
743
    {
744
      const size_type __isize =
745
	__gnu_cxx::__numeric_traits::__max
746
	- int(_S_word_bit) + 1;
747
      const size_type __asize = _M_get_Bit_allocator().max_size();
748
      return (__asize <= __isize / int(_S_word_bit)
749
	      ? __asize * int(_S_word_bit) : __isize);
750
    }
751
 
752
    size_type
753
    capacity() const _GLIBCXX_NOEXCEPT
754
    { return size_type(const_iterator(this->_M_impl._M_end_of_storage, 0)
755
		       - begin()); }
756
 
757
    bool
758
    empty() const _GLIBCXX_NOEXCEPT
759
    { return begin() == end(); }
760
 
761
    reference
762
    operator[](size_type __n)
763
    {
764
      return *iterator(this->_M_impl._M_start._M_p
765
		       + __n / int(_S_word_bit), __n % int(_S_word_bit));
766
    }
767
 
768
    const_reference
769
    operator[](size_type __n) const
770
    {
771
      return *const_iterator(this->_M_impl._M_start._M_p
772
			     + __n / int(_S_word_bit), __n % int(_S_word_bit));
773
    }
774
 
775
  protected:
776
    void
777
    _M_range_check(size_type __n) const
778
    {
779
      if (__n >= this->size())
780
        __throw_out_of_range(__N("vector::_M_range_check"));
781
    }
782
 
783
  public:
784
    reference
785
    at(size_type __n)
786
    { _M_range_check(__n); return (*this)[__n]; }
787
 
788
    const_reference
789
    at(size_type __n) const
790
    { _M_range_check(__n); return (*this)[__n]; }
791
 
792
    void
793
    reserve(size_type __n)
794
    {
795
      if (__n > max_size())
796
	__throw_length_error(__N("vector::reserve"));
797
      if (capacity() < __n)
798
	_M_reallocate(__n);
799
    }
800
 
801
    reference
802
    front()
803
    { return *begin(); }
804
 
805
    const_reference
806
    front() const
807
    { return *begin(); }
808
 
809
    reference
810
    back()
811
    { return *(end() - 1); }
812
 
813
    const_reference
814
    back() const
815
    { return *(end() - 1); }
816
 
817
    // _GLIBCXX_RESOLVE_LIB_DEFECTS
818
    // DR 464. Suggestion for new member functions in standard containers.
819
    // N.B. DR 464 says nothing about vector but we need something
820
    // here due to the way we are implementing DR 464 in the debug-mode
821
    // vector class.
822
    void
823
    data() _GLIBCXX_NOEXCEPT { }
824
 
825
    void
826
    push_back(bool __x)
827
    {
828
      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage)
829
        *this->_M_impl._M_finish++ = __x;
830
      else
831
        _M_insert_aux(end(), __x);
832
    }
833
 
834
    void
835
    swap(vector& __x)
836
    {
837
      std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
838
      std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
839
      std::swap(this->_M_impl._M_end_of_storage,
840
		__x._M_impl._M_end_of_storage);
841
 
842
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
843
      // 431. Swapping containers with unequal allocators.
844
      std::__alloc_swap::
845
	_S_do_it(_M_get_Bit_allocator(), __x._M_get_Bit_allocator());
846
    }
847
 
848
    // [23.2.5]/1, third-to-last entry in synopsis listing
849
    static void
850
    swap(reference __x, reference __y) _GLIBCXX_NOEXCEPT
851
    {
852
      bool __tmp = __x;
853
      __x = __y;
854
      __y = __tmp;
855
    }
856
 
857
    iterator
858
    insert(iterator __position, const bool& __x = bool())
859
    {
860
      const difference_type __n = __position - begin();
861
      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage
862
	  && __position == end())
863
        *this->_M_impl._M_finish++ = __x;
864
      else
865
        _M_insert_aux(__position, __x);
866
      return begin() + __n;
867
    }
868
 
869
#if __cplusplus >= 201103L
870
    template
871
	     typename = std::_RequireInputIter<_InputIterator>>
872
      void
873
      insert(iterator __position,
874
	     _InputIterator __first, _InputIterator __last)
875
      { _M_insert_dispatch(__position, __first, __last, __false_type()); }
876
#else
877
    template
878
      void
879
      insert(iterator __position,
880
	     _InputIterator __first, _InputIterator __last)
881
      {
882
	typedef typename std::__is_integer<_InputIterator>::__type _Integral;
883
	_M_insert_dispatch(__position, __first, __last, _Integral());
884
      }
885
#endif
886
 
887
    void
888
    insert(iterator __position, size_type __n, const bool& __x)
889
    { _M_fill_insert(__position, __n, __x); }
890
 
891
#if __cplusplus >= 201103L
892
    void insert(iterator __p, initializer_list __l)
893
    { this->insert(__p, __l.begin(), __l.end()); }
894
#endif
895
 
896
    void
897
    pop_back()
898
    { --this->_M_impl._M_finish; }
899
 
900
    iterator
901
    erase(iterator __position)
902
    {
903
      if (__position + 1 != end())
904
        std::copy(__position + 1, end(), __position);
905
      --this->_M_impl._M_finish;
906
      return __position;
907
    }
908
 
909
    iterator
910
    erase(iterator __first, iterator __last)
911
    {
912
      if (__first != __last)
913
	_M_erase_at_end(std::copy(__last, end(), __first));
914
      return __first;
915
    }
916
 
917
    void
918
    resize(size_type __new_size, bool __x = bool())
919
    {
920
      if (__new_size < size())
921
        _M_erase_at_end(begin() + difference_type(__new_size));
922
      else
923
        insert(end(), __new_size - size(), __x);
924
    }
925
 
926
#if __cplusplus >= 201103L
927
    void
928
    shrink_to_fit()
929
    { _M_shrink_to_fit(); }
930
#endif
931
 
932
    void
933
    flip() _GLIBCXX_NOEXCEPT
934
    {
935
      for (_Bit_type * __p = this->_M_impl._M_start._M_p;
936
	   __p != this->_M_impl._M_end_of_storage; ++__p)
937
        *__p = ~*__p;
938
    }
939
 
940
    void
941
    clear() _GLIBCXX_NOEXCEPT
942
    { _M_erase_at_end(begin()); }
943
 
944
 
945
  protected:
946
    // Precondition: __first._M_offset == 0 && __result._M_offset == 0.
947
    iterator
948
    _M_copy_aligned(const_iterator __first, const_iterator __last,
949
		    iterator __result)
950
    {
951
      _Bit_type* __q = std::copy(__first._M_p, __last._M_p, __result._M_p);
952
      return std::copy(const_iterator(__last._M_p, 0), __last,
953
		       iterator(__q, 0));
954
    }
955
 
956
    void
957
    _M_initialize(size_type __n)
958
    {
959
      _Bit_type* __q = this->_M_allocate(__n);
960
      this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
961
      this->_M_impl._M_start = iterator(__q, 0);
962
      this->_M_impl._M_finish = this->_M_impl._M_start + difference_type(__n);
963
    }
964
 
965
    void
966
    _M_reallocate(size_type __n);
967
 
968
#if __cplusplus >= 201103L
969
    bool
970
    _M_shrink_to_fit();
971
#endif
972
 
973
    // Check whether it's an integral type.  If so, it's not an iterator.
974
 
975
    // _GLIBCXX_RESOLVE_LIB_DEFECTS
976
    // 438. Ambiguity in the "do the right thing" clause
977
    template
978
      void
979
      _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
980
      {
981
	_M_initialize(static_cast(__n));
982
	std::fill(this->_M_impl._M_start._M_p,
983
		  this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
984
      }
985
 
986
    template
987
      void
988
      _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
989
			     __false_type)
990
      { _M_initialize_range(__first, __last,
991
			    std::__iterator_category(__first)); }
992
 
993
    template
994
      void
995
      _M_initialize_range(_InputIterator __first, _InputIterator __last,
996
			  std::input_iterator_tag)
997
      {
998
	for (; __first != __last; ++__first)
999
	  push_back(*__first);
1000
      }
1001
 
1002
    template
1003
      void
1004
      _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
1005
			  std::forward_iterator_tag)
1006
      {
1007
	const size_type __n = std::distance(__first, __last);
1008
	_M_initialize(__n);
1009
	std::copy(__first, __last, this->_M_impl._M_start);
1010
      }
1011
 
1012
    // _GLIBCXX_RESOLVE_LIB_DEFECTS
1013
    // 438. Ambiguity in the "do the right thing" clause
1014
    template
1015
      void
1016
      _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1017
      { _M_fill_assign(__n, __val); }
1018
 
1019
    template
1020
      void
1021
      _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1022
			 __false_type)
1023
      { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
1024
 
1025
    void
1026
    _M_fill_assign(size_t __n, bool __x)
1027
    {
1028
      if (__n > size())
1029
	{
1030
	  std::fill(this->_M_impl._M_start._M_p,
1031
		    this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
1032
	  insert(end(), __n - size(), __x);
1033
	}
1034
      else
1035
	{
1036
	  _M_erase_at_end(begin() + __n);
1037
	  std::fill(this->_M_impl._M_start._M_p,
1038
		    this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
1039
	}
1040
    }
1041
 
1042
    template
1043
      void
1044
      _M_assign_aux(_InputIterator __first, _InputIterator __last,
1045
		    std::input_iterator_tag)
1046
      {
1047
	iterator __cur = begin();
1048
	for (; __first != __last && __cur != end(); ++__cur, ++__first)
1049
	  *__cur = *__first;
1050
	if (__first == __last)
1051
	  _M_erase_at_end(__cur);
1052
	else
1053
	  insert(end(), __first, __last);
1054
      }
1055
 
1056
    template
1057
      void
1058
      _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1059
		    std::forward_iterator_tag)
1060
      {
1061
	const size_type __len = std::distance(__first, __last);
1062
	if (__len < size())
1063
	  _M_erase_at_end(std::copy(__first, __last, begin()));
1064
	else
1065
	  {
1066
	    _ForwardIterator __mid = __first;
1067
	    std::advance(__mid, size());
1068
	    std::copy(__first, __mid, begin());
1069
	    insert(end(), __mid, __last);
1070
	  }
1071
      }
1072
 
1073
    // Check whether it's an integral type.  If so, it's not an iterator.
1074
 
1075
    // _GLIBCXX_RESOLVE_LIB_DEFECTS
1076
    // 438. Ambiguity in the "do the right thing" clause
1077
    template
1078
      void
1079
      _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
1080
			 __true_type)
1081
      { _M_fill_insert(__pos, __n, __x); }
1082
 
1083
    template
1084
      void
1085
      _M_insert_dispatch(iterator __pos,
1086
			 _InputIterator __first, _InputIterator __last,
1087
			 __false_type)
1088
      { _M_insert_range(__pos, __first, __last,
1089
			std::__iterator_category(__first)); }
1090
 
1091
    void
1092
    _M_fill_insert(iterator __position, size_type __n, bool __x);
1093
 
1094
    template
1095
      void
1096
      _M_insert_range(iterator __pos, _InputIterator __first,
1097
		      _InputIterator __last, std::input_iterator_tag)
1098
      {
1099
	for (; __first != __last; ++__first)
1100
	  {
1101
	    __pos = insert(__pos, *__first);
1102
	    ++__pos;
1103
	  }
1104
      }
1105
 
1106
    template
1107
      void
1108
      _M_insert_range(iterator __position, _ForwardIterator __first,
1109
		      _ForwardIterator __last, std::forward_iterator_tag);
1110
 
1111
    void
1112
    _M_insert_aux(iterator __position, bool __x);
1113
 
1114
    size_type
1115
    _M_check_len(size_type __n, const char* __s) const
1116
    {
1117
      if (max_size() - size() < __n)
1118
	__throw_length_error(__N(__s));
1119
 
1120
      const size_type __len = size() + std::max(size(), __n);
1121
      return (__len < size() || __len > max_size()) ? max_size() : __len;
1122
    }
1123
 
1124
    void
1125
    _M_erase_at_end(iterator __pos)
1126
    { this->_M_impl._M_finish = __pos; }
1127
  };
1128
 
1129
_GLIBCXX_END_NAMESPACE_CONTAINER
1130
} // namespace std
1131
 
1132
#if __cplusplus >= 201103L
1133
 
1134
#include 
1135
 
1136
namespace std _GLIBCXX_VISIBILITY(default)
1137
{
1138
_GLIBCXX_BEGIN_NAMESPACE_VERSION
1139
 
1140
  // DR 1182.
1141
  /// std::hash specialization for vector.
1142
  template
1143
    struct hash<_GLIBCXX_STD_C::vector>
1144
    : public __hash_base>
1145
    {
1146
      size_t
1147
      operator()(const _GLIBCXX_STD_C::vector&) const noexcept;
1148
    };
1149
 
1150
_GLIBCXX_END_NAMESPACE_VERSION
1151
}// namespace std
1152
 
1153
#endif // C++11
1154
 
1155
#endif