You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1556 lines
45 KiB

// -*- C++ -*-
/***************************************************************************
*
* vector - declarations for the Standard Library vector class
*
* $Id: vector 172106 2011-11-02 17:04:12Z statham $
*
***************************************************************************
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
***************************************************************************
*
* Copyright (c) 1994-2001 Rogue Wave Software, Inc. All Rights Reserved.
*
* This computer software is owned by Rogue Wave Software, Inc. and is
* protected by U.S. copyright laws and other laws and by international
* treaties. This computer software is furnished by Rogue Wave Software,
* Inc. pursuant to a written license agreement and may be used, copied,
* transmitted, and stored only in accordance with the terms of such
* license and with the inclusion of the above copyright notice. This
* computer software or any other copies thereof may not be provided or
* otherwise made available to any other person.
*
* U.S. Government Restricted Rights. This computer software is provided
* with Restricted Rights. Use, duplication, or disclosure by the
* Government is subject to restrictions as set forth in subparagraph (c)
* (1) (ii) of The Rights in Technical Data and Computer Software clause
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
* Commercial Computer Software--Restricted Rights at 48 CFR 52.227-19,
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
* Flatiron Parkway, Boulder, Colorado 80301 USA.
*
**************************************************************************/
#ifndef _RWSTD_VECTOR_INCLUDED
#define _RWSTD_VECTOR_INCLUDED
#include <limits>
#include <memory>
#include <rw/_algobase.h>
#include <rw/_iterator.h>
#include <rw/_defs.h>
#include <rw/_dispatch.h>
#include <rw/_error.h>
_RWSTD_NAMESPACE_BEGIN (std)
template <class _TypeT,
class _Allocator _RWSTD_COMPLEX_DEFAULT(allocator<_TypeT>) >
class vector : private _Allocator
{
public:
typedef _TypeT value_type;
typedef _Allocator allocator_type;
typedef _TYPENAME allocator_type::size_type size_type;
typedef _TYPENAME allocator_type::difference_type difference_type;
typedef _TYPENAME allocator_type::reference reference;
typedef _TYPENAME allocator_type::const_reference const_reference;
typedef _TYPENAME allocator_type::pointer pointer;
typedef _TYPENAME allocator_type::const_pointer const_pointer;
#ifndef _RWSTD_NO_DEBUG_ITER
typedef _RW::__rw_debug_iter <vector, pointer, pointer> iterator;
typedef _RW::__rw_debug_iter <vector, const_pointer, pointer>
const_iterator;
iterator _C_make_iter (pointer __ptr) {
return iterator (*this, __ptr);
}
const_iterator _C_make_iter (pointer __ptr) const {
return const_iterator (*this, __ptr);
}
#else // if defined (_RWSTD_NO_DEBUG_ITER)
typedef pointer iterator;
typedef const_pointer const_iterator;
iterator _C_make_iter (pointer __ptr) {
return __ptr;
}
const_iterator _C_make_iter (const_pointer __ptr) const {
return __ptr;
}
#endif // _RWSTD_NO_DEBUG_ITER
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
typedef _STD::reverse_iterator<iterator> reverse_iterator;
#else
typedef _STD::reverse_iterator<const_iterator,
random_access_iterator_tag, value_type,
const_reference, const_pointer, difference_type>
const_reverse_iterator;
typedef _STD::reverse_iterator<iterator,
random_access_iterator_tag, value_type,
reference, pointer, difference_type>
reverse_iterator;
#endif
protected:
typedef _RWSTD_ALLOC_TYPE (_Allocator, value_type) _C_value_alloc_type;
pointer _C_start;
pointer _C_finish;
pointer _C_end_of_storage;
void _C_insert_aux (iterator, const_reference);
void _C_insert_aux (iterator, size_type, const_reference);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
void _C_insert_aux (iterator __position, _InputIter __first,
_InputIter __last, _RW_is_not_integer) {
_C_insert_aux2 (__position, __first, __last);
}
template<class _InputIter>
void _C_insert_aux (iterator __position, _InputIter __first,
_InputIter __last, _RW_is_integer) {
_C_insert_aux (__position, (size_type)__first, __last);
}
template<class _InputIter>
void _C_insert_aux2 (iterator __position, _InputIter __first,
_InputIter __last);
template <class _InputIter>
void _C_insert_interval_dispatch (iterator __position,
_InputIter __first,
_InputIter __last,
forward_iterator_tag) {
typedef _TYPENAME _RWdispatch<_InputIter>::_RWtype _RWtype;
_C_insert_aux(__position, __first, __last, _RWtype());
}
template <class _InputIter>
void _C_insert_interval_dispatch (iterator __position,
_InputIter __first,
_InputIter __last,
input_iterator_tag) {
while(__first != __last) {
__position = insert (__position,*__first);
++__position;
++__first;
}
}
#else
void _C_insert_aux2 (iterator, const_iterator, const_iterator);
#endif
void _C_destroy (iterator __start, iterator __finish) {
for ( ; __start != __finish; ++__start)
_RWSTD_VALUE_ALLOC (_C_value_alloc_type, destroy (&*__start));
}
//
// Allocate buffers and fill with __n values
//
void _C_initn(size_type __n, const_reference __value) {
size_t __initial_capacity =
max (__n, (size_t)_RW::__rw_new_capacity(0,this));
_C_start = _RWSTD_VALUE_ALLOC(_C_value_alloc_type,
allocate(__initial_capacity,0));
_TRY {
uninitialized_fill_n(begin(), __n, __value,
_RWSTD_VALUE_ALLOC_CAST (*this));
}
_CATCH (...) {
_RWSTD_VALUE_ALLOC(_C_value_alloc_type, deallocate(_C_start,__n));
_RETHROW;
}
_C_finish = _C_start + __n;
_C_end_of_storage = _C_start + __initial_capacity;
}
public:
_EXPLICIT vector (const _Allocator& __alloc = allocator_type ())
: allocator_type (__alloc), _C_start (0), _C_finish (0),
_C_end_of_storage (0){ }
_EXPLICIT
vector (size_type __n, const_reference __value = value_type (),
const _Allocator& __alloc = allocator_type ())
: allocator_type(__alloc), _C_start(0), _C_finish(0),
_C_end_of_storage (0) {
_C_initn (size_type (__n), __value);
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
void _C_init_aux (_InputIter __first, _InputIter __last,
_RW_is_not_integer) {
if (__is_input_iterator (_RWSTD_ITERATOR_CATEGORY (_InputIter,
__first))) {
copy(__first, __last, back_inserter(*this));
}
else {
size_type __n = _DISTANCE (__first, __last, size_type);
size_t __initial_capacity =
max (__n, (size_t)_RW::__rw_new_capacity(0,this));
_C_start = _RWSTD_VALUE_ALLOC(_C_value_alloc_type,
allocate(__initial_capacity,0));
_TRY {
uninitialized_copy(__first, __last, _C_start,
_RWSTD_VALUE_ALLOC_CAST (*this));
}
_CATCH (...) {
_RWSTD_VALUE_ALLOC(_C_value_alloc_type,
deallocate(_C_start,__n));
_RETHROW;
}
_C_finish = _C_start + __n;
_C_end_of_storage = _C_start + __initial_capacity;
}
}
template<class _InputIter>
void _C_init_aux (_InputIter __first, _InputIter __last,
_RW_is_integer) {
_C_initn((size_type)__first,__last);
}
template<class _InputIter>
vector (_InputIter __first, _InputIter __last,
const _Allocator& __alloc = allocator_type ())
: allocator_type(__alloc), _C_start(0), _C_finish(0),
_C_end_of_storage(0) {
typedef _TYPENAME _RWdispatch<_InputIter>::_RWtype _RWtype;
_C_init_aux(__first, __last, _RWtype());
}
#else // defined _RWSTD_NO_MEMBER_TEMPLATES
vector (const_iterator __first, const_iterator __last,
const _Allocator& __alloc = allocator_type ())
: allocator_type(__alloc), _C_start(0), _C_finish(0),
_C_end_of_storage(0) {
size_type __n = _DISTANCE (__first, __last, size_type);
size_t __initial_capacity =
max (__n, (size_t)_RW::__rw_new_capacity(0,this));
_C_start = _RWSTD_VALUE_ALLOC(_C_value_alloc_type,
allocate(__initial_capacity,0));
_TRY {
uninitialized_copy(__first, __last, _C_start,
_RWSTD_VALUE_ALLOC_CAST (*this));
}
_CATCH (...) {
_RWSTD_VALUE_ALLOC(_C_value_alloc_type, deallocate(_C_start,__n));
_RETHROW;
}
_C_finish = _C_start + __n;
_C_end_of_storage = _C_start + __initial_capacity;
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
vector (const vector &__x)
: allocator_type (__x.get_allocator ()), _C_start(0), _C_finish(0),
_C_end_of_storage(0) {
size_t __initial_capacity =
max (__x.size(), (size_t)_RW::__rw_new_capacity(0,this));
_C_start = _RWSTD_VALUE_ALLOC(_C_value_alloc_type,
allocate(__initial_capacity,0));
_TRY {
uninitialized_copy(__x.begin(), __x.end(), begin(),
_RWSTD_VALUE_ALLOC_CAST (*this));
}
_CATCH (...) {
_RWSTD_VALUE_ALLOC(_C_value_alloc_type,
deallocate(_C_start,__x.size()));
_RETHROW;
}
_C_finish = _C_start + __x.size();
_C_end_of_storage = _C_start + __initial_capacity;
}
~vector () {
_C_destroy(begin (), end ());
_RWSTD_VALUE_ALLOC(_C_value_alloc_type, deallocate(_C_start,
_C_end_of_storage - _C_start));
}
vector& operator= (const vector &__x);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
void assign (_InputIter __first, _InputIter __last) {
erase(begin(), end());
typedef _TYPENAME _RWdispatch<_InputIter>::_RWtype _RWtype;
_C_insert_aux(begin(), __first, __last, _RWtype());
}
void assign (size_type __n, const_reference __t) {
erase(begin(), end()); insert(begin(), __n, __t);
}
#else
void assign (const_iterator __first, const_iterator __last) {
erase(begin(), end()); insert(begin(), __first, __last);
}
//
// Assign n copies of t to this vector.
//
void assign (size_type __n, const_reference __t) {
erase(begin(), end()); insert(begin(), __n, __t);
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
allocator_type get_allocator() const {
return *this;
}
//
// Iterators.
//
iterator begin () {
return _C_make_iter (_C_start);
}
const_iterator begin () const {
return _C_make_iter (_C_start);
}
iterator end () {
return _C_make_iter (_C_finish);
}
const_iterator end () const {
return _C_make_iter (_C_finish);
}
reverse_iterator rbegin () {
reverse_iterator __tmp(end());
return __tmp;
}
const_reverse_iterator rbegin () const {
const_reverse_iterator __tmp(end());
return __tmp;
}
reverse_iterator rend () {
reverse_iterator __tmp(begin());
return __tmp;
}
const_reverse_iterator rend () const {
const_reverse_iterator __tmp(begin());
return __tmp;
}
size_type size () const {
return size_type(end() - begin());
}
size_type max_size () const {
return _RWSTD_VALUE_ALLOC(_C_value_alloc_type, max_size());
}
void resize (size_type __new_size, value_type __value = value_type ()) {
if (__new_size > size())
insert(end(), __new_size - size(), __value);
else if (__new_size < size())
erase(begin() + __new_size, end());
}
size_type capacity () const {
return _C_end_of_storage - _C_start;
}
bool empty () const {
return begin() == end();
}
void reserve (size_type __n) {
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("vector::reserve(size_type)"),
__n, max_size ()));
if (capacity() < __n) {
size_t __new_capacity =
max (__n, (size_t)_RW::__rw_new_capacity(size(),this));
pointer __tmp =
_RWSTD_VALUE_ALLOC(_C_value_alloc_type,
allocate(__new_capacity,_C_start));
_TRY {
uninitialized_copy(begin(), end(), _C_make_iter (__tmp),
_RWSTD_VALUE_ALLOC_CAST (*this));
}
_CATCH (...) {
_RWSTD_VALUE_ALLOC(_C_value_alloc_type, deallocate(__tmp,__n));
_RETHROW;
}
_C_destroy(begin (), end ());
_RWSTD_VALUE_ALLOC(_C_value_alloc_type,
deallocate(_C_start, _C_end_of_storage - _C_start));
_C_finish = __tmp + size();
_C_start = __tmp;
_C_end_of_storage = _C_start + __new_capacity;
}
}
//
// Element access.
//
reference operator[] (size_type __n) {
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("vector::operator[](size_type)"),
__n, size ()));
#endif // _RWSTD_BOUNDS_CHECKING
return *(begin() + __n);
}
const_reference operator[] (size_type __n) const {
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("vector::operator[](size_type) const"),
__n, size ()));
#endif // _RWSTD_BOUNDS_CHECKING
return *(begin() + __n);
}
reference at (size_type __n) {
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("vector::at (size_type)"),
__n, size ()));
return *(begin() + __n);
}
const_reference at (size_type __n) const {
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("vector::at(size_type) const"),
__n, size ()));
return *(begin() + __n);
}
reference front () {
return *begin();
}
const_reference front () const {
return *begin();
}
reference back () {
return *(end() - 1);
}
const_reference back () const {
return *(end() - 1);
}
//
// Modifiers.
//
void push_back (const_reference __x) {
if (_C_finish != _C_end_of_storage) {
++_C_finish;
_TRY {
_RWSTD_VALUE_ALLOC (_C_value_alloc_type,
construct (_C_finish - difference_type (1),
__x));
}
_CATCH (...) {
--_C_finish;
_RETHROW;
}
}
else
_C_insert_aux(end(), __x);
}
void pop_back()
{
_RWSTD_VALUE_ALLOC(_C_value_alloc_type, destroy(_C_finish-1));
--_C_finish;
}
//
// Insert x at __position.
//
iterator insert (iterator __position, const_reference __x) {
size_type __n = __position - begin();
if (_C_finish != _C_end_of_storage && __position == end()) {
++_C_finish;
_TRY {
_RWSTD_VALUE_ALLOC(_C_value_alloc_type,
construct(_C_finish - 1, __x));
}
_CATCH (...) {
--_C_finish;
_RETHROW;
}
}
else
_C_insert_aux(__position, __x);
return begin() + __n;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template <class _InputIter>
void insert (iterator __pos, _InputIter __first, _InputIter __last) {
insert (__pos, __first, __last, _RWSTD_DISPATCH (_InputIter));
}
template <class _InputIter>
void insert (iterator __pos, _InputIter __first, _InputIter __last,
_RWSTD_DISPATCH_INT (false)) {
// unnamed arg is used for overload resolution
// _RWSTD_COMPILE_ASSERT (sizeof (*__first));
_C_insert_interval_dispatch (__pos, __first, __last,
_RWSTD_ITERATOR_CATEGORY (_InputIter,
__first));
}
void insert (iterator __pos, size_type __n, const_reference __val,
_RWSTD_DISPATCH_INT (true)) {
// unnamed arg is used for overload resolution
_C_insert_aux (__pos, __n, __val);
}
void insert (iterator __position, size_type __n, const_reference __value) {
_C_insert_aux(__position,__n,__value);
}
#else
void insert (iterator __position, size_type __n, const_reference __x) {
_C_insert_aux(__position,__n,__x);
}
void insert (iterator __position, const_iterator __first,
const_iterator __last) {
_C_insert_aux2(__position, __first, __last);
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
iterator erase (iterator __position) {
if (!empty ()) {
if (__position + 1 != end())
copy(__position + 1, end(), __position);
_RWSTD_VALUE_ALLOC(_C_value_alloc_type, destroy(_C_finish - 1));
--_C_finish;
}
return __position;
}
iterator erase (iterator __first, iterator __last) {
if (!empty ()) {
iterator __i = copy (__last, end(), __first);
iterator __tmp = end ();
_C_destroy(__i, __tmp);
_C_finish -= (__last - __first);
}
return __first;
}
void swap (vector& __x) {
if((_C_value_alloc_type)*this==(_C_value_alloc_type)__x) {
_STD::swap (_C_start, __x._C_start);
_STD::swap (_C_finish, __x._C_finish);
_STD::swap (_C_end_of_storage, __x._C_end_of_storage);
}
else {
vector __v = *this;
*this = __x;
__x=__v;
}
}
void clear () {
erase (begin (), end ());
}
};
template <class _TypeT, class _Allocator>
inline bool operator== (const vector<_TypeT,_Allocator>& __x,
const vector<_TypeT,_Allocator>& __y)
{
return __x.size() == __y.size()
&& equal(__x.begin(), __x.end(), __y.begin());
}
template <class _TypeT, class _Allocator>
inline bool operator< (const vector<_TypeT,_Allocator>& __x,
const vector<_TypeT,_Allocator>& __y)
{
return lexicographical_compare(__x.begin(), __x.end(),
__y.begin(), __y.end());
}
template <class _TypeT, class _Allocator>
inline bool operator!= (const vector<_TypeT,_Allocator>& __x,
const vector<_TypeT,_Allocator>& __y)
{
return !(__x == __y);
}
template <class _TypeT, class _Allocator>
inline bool operator> (const vector<_TypeT,_Allocator>& __x,
const vector<_TypeT,_Allocator>& __y)
{
return __y < __x;
}
template <class _TypeT, class _Allocator>
inline bool operator>= (const vector<_TypeT,_Allocator>& __x,
const vector<_TypeT,_Allocator>& __y)
{
return !(__x < __y);
}
template <class _TypeT, class _Allocator>
inline bool operator<= (const vector<_TypeT,_Allocator>& __x,
const vector<_TypeT,_Allocator>& __y)
{
return !(__y < __x);
}
#ifndef _RWSTD_NO_PART_SPEC_OVERLOAD
template <class _TypeT, class _Allocator>
inline void swap(vector<_TypeT,_Allocator>& __a, vector<_TypeT,_Allocator>& __b)
{
__a.swap(__b);
}
#endif // _RWSTD_NO_PART_SPEC_OVERLOAD
#ifndef _RWSTD_NO_VECTOR_BOOL
#ifndef _RWSTD_NO_BOOL
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#else // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
// use a macro to mutate _Allocator into allocator<bool>
# define _Allocator allocator<bool>
_RWSTD_SPECIALIZED_CLASS
#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
class _RWSTD_EXPORT vector<bool, _Allocator > : private _Allocator
{
typedef _RWSTD_REBIND(_Allocator, unsigned int) _C_value_alloc_type;
typedef vector _C_self;
public:
typedef _Allocator allocator_type;
typedef bool value_type;
typedef _TYPENAME allocator_type::size_type size_type;
typedef _TYPENAME allocator_type::difference_type difference_type;
typedef _TYPENAME _C_value_alloc_type::pointer pointer;
typedef _TYPENAME _C_value_alloc_type::const_pointer const_pointer;
class iterator;
class const_iterator;
class reference {
friend class iterator;
friend class const_iterator;
protected:
unsigned int* _C_p;
unsigned int _C_mask;
reference (unsigned int* __x, unsigned int __y)
: _C_p (__x), _C_mask (__y) { }
public:
reference () : _C_p(0), _C_mask(0) {}
operator bool () const {
return !!(*_C_p & _C_mask);
}
reference& operator= (bool __x) {
if (__x)
*_C_p |= _C_mask;
else
*_C_p &= ~_C_mask;
return *this;
}
reference& operator= (const reference& __x) {
return *this = bool(__x);
}
#ifndef _RWSTD_NO_EXT_VECTOR_BOOL_REF_OPS
bool operator== (const reference& __x) const {
return bool(*this) == bool(__x);
}
bool operator< (const reference& __x) const {
#ifndef _MSC_VER
return bool(*this) < bool(__x);
#else
return int(*this) < int(__x);
#endif
}
bool operator!= (const reference& __x) const {
return !(*this == __x);
}
bool operator> (const reference& __x) const {
return __x < *this;
}
bool operator>= (const reference& __x) const {
return !(*this < __x);
}
bool operator<= (const reference& __x) const {
return !(*this > __x);
}
#endif // _RWSTD_NO_EXT_VECTOR_BOOL_REF_OPS
void flip () {
*_C_p ^= _C_mask;
}
};
typedef bool const_reference;
// hacks working around bogus g++ 2.95.2 warnings coming out of
// iterators below as well as what's probably an MSVC 6.0 bug
typedef reference _C_ref;
typedef const_reference _C_const_ref;
typedef difference_type _C_diff_t;
class _C_iter {
friend class iterator;
friend class const_iterator;
protected:
#if defined (__GNUG__) && __GNUG__ == 2 && __GNUG_MINOR__ < 96
public:
#elif defined (_MSC_VER) && _MSC_VER <= 1300
friend class vector<bool, _Allocator>;
#else
friend class vector;
#endif
unsigned int* _C_p;
unsigned int _C_offset;
_C_iter (unsigned int* __x = 0, unsigned int __y = 0)
: _C_p (__x), _C_offset (__y) { }
void operator++ () {
if (_C_offset++ == _RWSTD_WORD_BIT - 1) {
_C_offset = 0;
++_C_p;
}
}
void operator-- () {
if (_C_offset-- == 0) {
_C_offset = _RWSTD_WORD_BIT - 1;
--_C_p;
}
}
void operator+= (difference_type __i) {
difference_type __n = __i + _C_offset;
_C_p += __n / _RWSTD_WORD_BIT;
__n = __n % _RWSTD_WORD_BIT;
if (__n < 0) {
_C_offset = _RWSTD_STATIC_CAST (unsigned int,
__n + _RWSTD_WORD_BIT);
--_C_p;
}
else
_C_offset = _RWSTD_STATIC_CAST (unsigned int,__n);
}
public:
bool operator== (const _C_iter& __x) const {
return _C_p == __x._C_p && _C_offset == __x._C_offset;
}
bool operator< (const _C_iter& __x) const {
return _C_p < __x._C_p ||
(_C_p == __x._C_p && _C_offset < __x._C_offset);
}
bool operator!= (const _C_iter& __x) const {
return !(*this == __x);
}
bool operator> (const _C_iter& __x) const {
return __x < *this;
}
bool operator>= (const _C_iter& __x) const {
return !(*this < __x);
}
bool operator<= (const _C_iter& __x) const {
return !(*this > __x);
}
};
class iterator
: public _C_iter,
public _STD::iterator<random_access_iterator_tag,
value_type, _C_diff_t,
pointer, _C_ref> {
public:
// bring names used in declarations below into scope
// (dependent base members not visible without qualification)
typedef _C_ref reference;
typedef _C_diff_t difference_type;
iterator (unsigned int *__x = 0, unsigned int __y = 0)
: _C_iter (__x, __y) { }
reference operator* () const {
typedef reference _Reference;
return _Reference (this->_C_p, 1U << this->_C_offset);
}
iterator& operator++ () {
return _C_iter::operator++(), *this;
}
iterator operator++ (int) {
iterator __tmp = *this;
++*this;
return __tmp;
}
iterator& operator-- () {
return _C_iter::operator--(), *this;
}
iterator operator-- (int) {
iterator __tmp = *this;
--*this;
return __tmp;
}
iterator& operator+= (difference_type __i) {
return _C_iter::operator+= (__i), *this;
}
iterator& operator-= (difference_type __i) {
*this += -__i;
return *this;
}
iterator operator+ (difference_type __i) const {
iterator __tmp = *this;
return __tmp += __i;
}
iterator operator- (difference_type __i) const {
iterator __tmp = *this;
return __tmp -= __i;
}
difference_type operator- (iterator __x) const {
return _RWSTD_WORD_BIT * (this->_C_p - __x._C_p)
+ this->_C_offset - __x._C_offset;
}
reference operator[] (difference_type __i) {
return *(*this + __i);
}
};
class const_iterator
: public _C_iter,
public _STD::iterator<random_access_iterator_tag,
value_type, _C_diff_t,
const_pointer, _C_const_ref> {
public:
// bring names used in declarations below into scope
// (dependent base members not visible without qualification)
typedef _C_const_ref const_reference;
typedef _C_diff_t difference_type;
const_iterator (unsigned int *__x = 0, unsigned int __y = 0)
: _C_iter (__x, __y) { }
const_iterator (const _C_iter &__x)
: _C_iter (__x._C_p, __x._C_offset) { }
const_reference operator* () const {
return _C_ref (this->_C_p, 1U << this->_C_offset);
}
const_iterator& operator++ () {
return _C_iter::operator++(), *this;
}
const_iterator operator++ (int) {
const_iterator __tmp = *this;
++*this;
return __tmp;
}
const_iterator& operator-- () {
return _C_iter::operator--(), *this;
}
const_iterator operator-- (int) {
const_iterator __tmp = *this;
--*this;
return __tmp;
}
const_iterator& operator+= (difference_type __i) {
return _C_iter::operator+= (__i), *this;
}
const_iterator& operator-= (difference_type __i) {
return *this += -__i;
}
const_iterator
operator+ (difference_type __i) const {
return const_iterator (*this) += __i;
}
const_iterator operator- (difference_type __i) const {
return const_iterator (*this) -= __i;
}
difference_type operator- (const_iterator __x) const {
return _RWSTD_WORD_BIT * (this->_C_p - __x._C_p)
+ this->_C_offset - __x._C_offset;
}
const_reference operator[] (difference_type __i) {
return *(*this + __i);
}
};
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
typedef _STD::reverse_iterator<iterator> reverse_iterator;
#else
typedef _STD::reverse_iterator<const_iterator,
random_access_iterator_tag, value_type,
const_reference, const_pointer, difference_type>
const_reverse_iterator;
typedef _STD::reverse_iterator<iterator,
random_access_iterator_tag, value_type,
reference, pointer, difference_type>
reverse_iterator;
#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
private:
//
// These private functions are replicas of generic algorithms.
// We provide them here to avoid putting instantiations of
// the generic algorithms into an archive or shared library.
// This gives you full flexibilty in deciding where you want
// to put particular instantiations of the generic
// algorithms.
//
void _C_fill (iterator __first, iterator __last, const bool& __value) {
while (__first != __last) *__first++ = __value;
}
void _C_fill_n (iterator __first, size_type __n, const bool& __value) {
while (__n-- > 0) *__first++ = __value;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template <class _Iterator>
iterator _C_copy (_Iterator __first, _Iterator __last, iterator __res) {
while (__first != __last)
*__res++ = *__first++;
return __res;
}
template <class _Iterator>
iterator
_C_copy_backward (_Iterator __first, _Iterator __last, iterator __res) {
while (__first != __last) *--__res = *--__last;
return __res;
}
#else
iterator
_C_copy (const_iterator __first, const_iterator __last, iterator __res) {
while (__first != __last)
*__res++ = *__first++;
return __res;
}
iterator _C_copy (const bool* __first, const bool* __last, iterator __res) {
while (__first != __last)
*__res++ = *__first++;
return __res;
}
iterator _C_copy_backward (const_iterator __first, const_iterator __last,
iterator __res) {
while (__first != __last)
*--__res = *--__last;
return __res;
}
iterator
_C_copy_backward (const bool* __first, const bool* __last, iterator __res) {
while (__first != __last)
*--__res = *--__last;
return __res;
}
#endif
protected:
iterator _C_start;
iterator _C_finish;
unsigned int * _C_end_of_storage;
unsigned int* _C_bit_alloc (size_type __n) {
return _C_value_alloc_type(*this).
allocate ((__n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT,
pointer(_C_start._C_p));
}
void _C_init (size_type __n) {
unsigned int* __q = _C_bit_alloc(__n);
_C_end_of_storage = __q + (__n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
_C_start = iterator(__q, 0);
_C_finish = _C_start + __n;
}
void _C_insert_aux (iterator, bool);
public:
vector (const _Allocator& __alloc = allocator_type ())
: allocator_type (__alloc), _C_start(iterator()), _C_finish(iterator()),
_C_end_of_storage(0) { }
_EXPLICIT vector (size_type __n, bool __value = bool(),
const _Allocator& __alloc = allocator_type ())
: allocator_type (__alloc), _C_end_of_storage(0) {
_C_init(__n);
unsigned int * __first = _C_start._C_p;
size_type __m = (__n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
while (__m-- > 0) *__first++ = __value ? ~0 : 0;
}
vector (const _C_self &__x)
: allocator_type (__x.get_allocator ()), _C_end_of_storage (0) {
_C_init (__x.size ());
_C_copy (__x.begin (), __x.end (), _C_start);
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
vector (_InputIter __first, _InputIter __last)
: _C_end_of_storage(0)
{
size_type __n = _DISTANCE (__first, __last, size_type);
_C_init(__n);
_C_copy(__first, __last, _C_start);
}
#else
vector (const_iterator __first, const_iterator __last)
: _C_end_of_storage(0)
{
size_type __n = _DISTANCE (__first, __last, size_type);
_C_init(__n);
_C_copy(__first, __last, _C_start);
}
vector (const bool* __first, const bool* __last)
: _C_end_of_storage(0)
{
size_type __n = _DISTANCE (__first, __last, size_type);
_C_init(__n);
_C_copy(__first, __last, _C_start);
}
#endif
~vector () {
_C_value_alloc_type(*this).deallocate(_C_start._C_p,
_C_end_of_storage - _C_start._C_p);
}
_C_self& operator= (const _C_self& __x)
{
if (&__x == this) return *this;
if (__x.size() > capacity())
{
_C_value_alloc_type(*this).deallocate(_C_start._C_p,
_C_end_of_storage - _C_start._C_p);
_C_init(__x.size());
}
_C_copy(__x.begin(), __x.end(), begin());
_C_finish = begin() + __x.size();
return *this;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
void assign (_InputIter __first, _InputIter __last)
{ erase(begin(), end()); insert(begin(), __first, __last); }
#else
void assign (const_iterator __first, const_iterator __last)
{ erase(begin(), end()); insert(begin(), __first, __last); }
#endif
void assign (size_type __n, const bool& __t = bool())
{
erase(begin(), end()); insert(begin(), __n, __t);
}
allocator_type get_allocator() const
{
return *this;
}
//
// iterators
//
iterator begin () { return _C_start; }
const_iterator begin () const
{ return const_iterator(_C_start._C_p,_C_start._C_offset); }
iterator end () { return _C_finish; }
const_iterator end () const
{ return const_iterator(_C_finish._C_p,_C_finish._C_offset); }
reverse_iterator rbegin () { return reverse_iterator(end()); }
const_reverse_iterator rbegin () const
{
return const_reverse_iterator(end());
}
reverse_iterator rend () { return reverse_iterator(begin()); }
const_reverse_iterator rend () const
{
return const_reverse_iterator(begin());
}
//
// capacity
//
size_type size () const { return size_type(end() - begin()); }
size_type max_size () const {
return _C_value_alloc_type(*this).max_size();
}
void resize (size_type __new_size, bool __c = false);
size_type capacity () const
{
return size_type(const_iterator(_C_end_of_storage, 0) - begin());
}
bool empty () const { return begin() == end(); }
void reserve (size_type __n)
{
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("vector<bool>::reserve (size_type)"),
__n, max_size ()));
if (capacity() < __n)
{
unsigned int* __q = _C_bit_alloc(__n);
_C_finish = _C_copy(begin(), end(), iterator(__q, 0));
_C_value_alloc_type(*this).deallocate(_C_start._C_p,
_C_end_of_storage - _C_start._C_p);
_C_start = iterator(__q, 0);
_C_end_of_storage = __q + (__n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
}
}
//
// element access
//
reference operator[] (size_type __n)
{
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("vector<bool>::[](size_type)"),
__n, size ()));
#endif // _RWSTD_BOUNDS_CHECKING
return *(begin() + __n);
}
const_reference operator[] (size_type __n) const
{
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("vector<bool>::[](size_type)"),
__n, size ()));
#endif // _RWSTD_BOUNDS_CHECKING
return *(begin() + __n);
}
reference at (size_type __n)
{
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("vector<bool>::at(size_type)"),
__n, size ()));
return *(begin() + __n);
}
const_reference at (size_type __n) const
{
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("vector<bool>::at(size_type) const"),
__n, size ()));
return *(begin() + __n);
}
reference front () { return *begin(); }
const_reference front () const { return *begin(); }
reference back () { return *(end() - 1); }
const_reference back () const { return *(end() - 1); }
//
// modifiers
//
void push_back (const bool& __x)
{
if (_C_finish._C_p != _C_end_of_storage) {
++_C_finish;
*(_C_finish-1) = __x;
}
else
_C_insert_aux(end(), __x);
}
void pop_back () { --_C_finish; }
iterator insert (iterator __position, const bool& __x = bool())
{
size_type __n = __position - begin();
if (_C_finish._C_p != _C_end_of_storage && __position == end()) {
++_C_finish;
*(_C_finish-1) = __x;
}
else
_C_insert_aux(__position, __x);
return begin() + __n;
}
void insert (iterator __position, size_type __n, const bool& __x);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
void insert (iterator __position, _InputIter __first,
_InputIter __last);
#else
void insert (iterator __position, const_iterator __first,
const_iterator __last);
#endif
iterator erase (iterator __position)
{
if (!(__position + 1 == end()))
_C_copy(__position + 1, end(), __position);
--_C_finish;
return __position;
}
iterator erase(iterator __first, iterator __last)
{
_C_finish = _C_copy(__last, end(), __first);
return __first;
}
void swap (_C_self& __x)
{
if((_C_value_alloc_type)*this == (_C_value_alloc_type)__x)
{
_STD::swap (_C_start, __x._C_start);
_STD::swap (_C_finish, __x._C_finish);
_STD::swap (_C_end_of_storage, __x._C_end_of_storage);
}
else
{
_C_self _x = *this;
*this = __x;
__x=_x;
}
}
static void swap(reference __x, reference __y);
void flip ();
void clear()
{
erase(begin(),end());
}
};
#ifndef _RWSTD_NO_FUNC_PARTIAL_SPEC
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#endif
inline bool operator== (const vector<bool,_Allocator >& __x,
const vector<bool,_Allocator >& __y)
{
if (__x.size() == __y.size())
{
_TYPENAME vector<bool,_Allocator >::const_iterator
first1 = __x.begin(),
last1 = __x.end(),
first2 = __y.begin();
while (first1 != last1 && *first1 == *first2)
{
++first1;
++first2;
}
return first1 == last1;
}
return false;
}
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#endif
inline bool operator< (const vector<bool,_Allocator >& __x,
const vector<bool,_Allocator >& __y)
{
_TYPENAME vector<bool,_Allocator >::const_iterator
first1 = __x.begin(),
last1 = __x.end(),
first2 = __y.begin(),
last2 = __y.end();
while (first1 != last1 && first2 != last2)
{
if ((int)*first1 < (int)*first2) return true;
if ((int)*first2++ < (int)*first1++) return false;
}
return first1 == last1 && first2 != last2;
}
#else
_RWSTD_SPECIALIZED_FUNCTION
inline bool operator== (const vector<bool,allocator<bool> >& __x,
const vector<bool,allocator<bool> >& __y)
{
if (__x.size() == __y.size())
{
vector<bool,allocator<bool> >::const_iterator
first1 = __x.begin(),
last1 = __x.end(),
first2 = __y.begin();
while (first1 != last1 && *first1 == *first2)
{
++first1;
++first2;
}
return first1 == last1;
}
return false;
}
_RWSTD_SPECIALIZED_FUNCTION
inline bool operator< (const vector<bool,allocator<bool> >& __x,
const vector<bool,allocator<bool> >& __y)
{
vector<bool,allocator<bool> >::const_iterator
first1 = __x.begin(),
last1 = __x.end(),
first2 = __y.begin(),
last2 = __y.end();
while (first1 != last1 && first2 != last2)
{
if ((int)*first1 < (int)*first2) return true;
if ((int)*first2++ < (int)*first1++) return false;
}
return first1 == last1 && first2 != last2;
}
#endif
#ifndef _RWSTD_NO_FUNC_PARTIAL_SPEC
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#endif
inline bool operator!= (const vector<bool,_Allocator >& __x,
const vector<bool,_Allocator >& __y)
{
return !(__x == __y);
}
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#endif
inline bool operator> (const vector<bool,_Allocator >& __x,
const vector<bool,_Allocator >& __y)
{
return __y < __x;
}
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#endif
inline bool operator>= (const vector<bool,_Allocator >& __x,
const vector<bool,_Allocator >& __y)
{
return !(__x < __y);
}
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#endif
inline bool operator<= (const vector<bool,_Allocator >& __x,
const vector<bool,_Allocator >& __y)
{
return !(__y < __x);
}
#ifndef _RWSTD_NO_PART_SPEC_OVERLOAD
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _Allocator>
#endif
inline void swap(vector<bool,_Allocator >& __a, vector<bool,_Allocator >& __b)
{
__a.swap(__b);
}
#endif
#else //_RWSTD_NO_FUNC_PART_SPEC
_RWSTD_SPECIALIZED_FUNCTION
inline bool operator!= (const vector<bool,allocator<bool> >& __x,
const vector<bool,allocator<bool> >& __y)
{
return !(__x == __y);
}
_RWSTD_SPECIALIZED_FUNCTION
inline bool operator> (const vector<bool,allocator<bool> >& __x,
const vector<bool,allocator<bool> >& __y)
{
return __y < __x;
}
_RWSTD_SPECIALIZED_FUNCTION
inline bool operator>= (const vector<bool,allocator<bool> >& __x,
const vector<bool,allocator<bool> >& __y)
{
return !(__x < __y);
}
_RWSTD_SPECIALIZED_FUNCTION
inline bool operator<= (const vector<bool,allocator<bool> >& __x,
const vector<bool,allocator<bool> >& __y)
{
return !(__y < __x);
}
_RWSTD_SPECIALIZED_FUNCTION
inline void swap (vector<bool, allocator<bool> >& __a,
vector<bool, allocator<bool> >& __b)
{
__a.swap(__b);
}
#endif
#undef _Allocator
#endif // _RWSTD_NO_BOOL
#endif // _RWSTD_NO_VECTOR_BOOL
_RWSTD_NAMESPACE_END // std
#if defined (_RWSTD_COMPILE_INSTANTIATE)
# include <vector.cc>
#endif
#ifndef _RWSTD_NO_STL_SPECIALIZATION
#include "vector_spec.h"
#endif // _RWSTD_NO_STL_SPECIALIZATION
#endif // _RWSTD_VECTOR_INCLUDED