This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/vector.h

1458 lines
42 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __VECTOR_H
#define __VECTOR_H
#pragma option push -b -a8 -pc -Vx- -Ve- -A- -w-inl -w-aus -w-sig
// -*- C++ -*-
/***************************************************************************
*
* vector - declarations for the Standard Library vector class
*
***************************************************************************
*
* 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-1999 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 __STD_VECTOR__
#define __STD_VECTOR__
#include <stdcomp.h>
#include <rw/stddefs.h>
#include <rw/rwdispatch.h>
#include <algorithm>
#include <iterator>
#include <memory>
#include <stdexcept>
#ifndef vector
#define vector vector
#endif
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
//
// Note that _RWSTD_COMPLEX_DEFAULT(x)
// will expand to: ' = x', or nothing,
// depending on your compiler's capabilities and/or
// flag settings (see stdcomp.h).
//
template <class T, class Allocator _RWSTD_COMPLEX_DEFAULT(allocator<T>) >
class vector
{
private:
#if defined( _RWSTD_ALLOCATOR) && !defined(_HPACC_)
typedef _TYPENAME Allocator::template rebind<T>::other __value_alloc_type;
#else
typedef allocator_interface<Allocator,T> __value_alloc_type;
#endif
public:
//
// Types.
//
typedef T value_type;
typedef Allocator allocator_type;
#ifndef _RWSTD_NO_COMPLICATED_TYPEDEF
typedef _TYPENAME _RWSTD_ALLOC_SIZE_TYPE size_type;
typedef _TYPENAME _RWSTD_ALLOC_DIFF_TYPE difference_type;
typedef _TYPENAME __value_alloc_type::pointer iterator;
typedef _TYPENAME __value_alloc_type::const_pointer const_iterator;
typedef _TYPENAME __value_alloc_type::reference reference;
typedef _TYPENAME __value_alloc_type::const_reference const_reference;
typedef _TYPENAME __value_alloc_type::pointer pointer;
typedef _TYPENAME __value_alloc_type::const_pointer const_pointer;
#else
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* iterator;
typedef const T* const_iterator;
typedef T& reference;
typedef const T& const_reference;
typedef T* pointer;
typedef const T* const_pointer;
#endif //_RWSTD_NO_COMPLICATED_TYPEDEF
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef _RW_STD::reverse_iterator<const_iterator> const_reverse_iterator;
typedef _RW_STD::reverse_iterator<iterator> reverse_iterator;
#else
typedef _RW_STD::reverse_iterator<const_iterator,
random_access_iterator_tag, value_type,
const_reference, const_pointer, difference_type>
const_reverse_iterator;
typedef _RW_STD::reverse_iterator<iterator,
random_access_iterator_tag, value_type,
reference, pointer, difference_type>
reverse_iterator;
#endif
protected:
size_type __buffer_size;
iterator __start;
iterator __finish;
__RWSTD::__rw_basis<iterator,allocator_type> __end_of_storage;
void __insert_aux (iterator position, const T& x);
void __insert_aux (iterator position, size_type n, const T& x);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class InputIterator>
void __insert_aux (iterator position, InputIterator first, InputIterator last, _RW_is_not_integer)
{ __insert_aux2 (position, first, last); }
template<class InputIterator>
void __insert_aux (iterator position, InputIterator first, InputIterator last, _RW_is_integer)
{ __insert_aux (position, (size_type)first, last); }
template<class InputIterator>
void __insert_aux2 (iterator position, InputIterator first, InputIterator last);
#else
void __insert_aux2 (iterator position, const_iterator first, const_iterator last);
#endif
void __destroy(iterator start, iterator finish)
{
while ( start != finish)
__value_alloc_type(__end_of_storage).destroy(start++);
}
//
// Allocate buffers and fill with n values
//
void __initn(size_type n, const T& value)
{
__init();
__start = __value_alloc_type(__end_of_storage).allocate(n,0);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
uninitialized_fill_n(__start, n, value);
} catch(...) {
__value_alloc_type(__end_of_storage).deallocate(__start,n);
throw;
}
#else
uninitialized_fill_n(__start, n, value);
#endif // _RWSTD_NO_EXCEPTIONS
__finish = __start + n;
__end_of_storage = __finish;
}
void __init()
{
__buffer_size =
max((size_type)1,__RWSTD::__rw_allocation_size((value_type*)0,(size_type)0,(size_type)0));
}
public:
//
// construct/copy/destroy
//
_EXPLICIT vector (const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
: __start(0), __finish(0), __end_of_storage(0,alloc)
{
__init();
}
#ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
vector (void)
: __start(0), __finish(0), __end_of_storage(0,Allocator())
{ ; }
vector (size_type n, const T& value)
: __start(0), __finish(0), __end_of_storage(0,Allocator())
{
__initn(n,value);
}
#endif
_EXPLICIT vector (size_type n)
: __start(0), __finish(0), __end_of_storage(0,Allocator())
{
T value = T();
__initn(n,value);
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class InputIterator>
void __init_aux (InputIterator first, InputIterator last, _RW_is_not_integer)
{
if (__is_input_iterator(__iterator_category(first))) {
copy(first, last, back_inserter(*this));
} else {
size_type n;
__init();
__initialize(n, size_type(0));
distance(first, last, n);
__start = __value_alloc_type(__end_of_storage).allocate(n,0);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
__finish = uninitialized_copy(first, last, __start);
} catch(...) {
__value_alloc_type(__end_of_storage).deallocate(__start,n);
throw;
}
#else
__finish = uninitialized_copy(first, last, __start);
#endif // _RWSTD_NO_EXCEPTIONS
__end_of_storage = __finish;
}
}
template<class InputIterator>
void __init_aux (InputIterator first, InputIterator last, _RW_is_integer)
{ __initn((size_type)first,last); }
template<class InputIterator>
vector (InputIterator first, InputIterator last,
const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
: __start(0), __finish(0), __end_of_storage(0,alloc)
{
typedef _TYPENAME _RWdispatch<InputIterator>::_RWtype _RWtype;
__init_aux(first, last, _RWtype());
}
vector (size_type n, const T& value,
const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
: __start(0), __finish(0), __end_of_storage(0,alloc)
{ __initn((size_type)n,value); }
#else
//
// Build a vector of size n with each element set to copy of value.
//
vector (size_type n, const T& value,
const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
: __start(0), __finish(0), __end_of_storage(0,alloc)
{
__initn(n,value);
}
vector (const_iterator first, const_iterator last,
const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
: __start(0), __finish(0), __end_of_storage(0,alloc)
{
size_type n;
__init();
__initialize(n, size_type(0));
distance(first, last, n);
__start = __value_alloc_type(__end_of_storage).allocate(n,0);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
__finish = uninitialized_copy(first, last, __start);
} catch(...) {
__value_alloc_type(__end_of_storage).deallocate(__start,n);
throw;
}
#else
__finish = uninitialized_copy(first, last, __start);
#endif // _RWSTD_NO_EXCEPTIONS
__end_of_storage = __finish;
}
#ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
vector (const_iterator first, const_iterator last)
: __start(0), __finish(0), __end_of_storage(0,Allocator())
{
size_type n;
__init();
__initialize(n, size_type(0));
distance(first, last, n);
__start = __value_alloc_type(__end_of_storage).allocate(n,0);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
__finish = uninitialized_copy(first, last, __start);
} catch(...) {
__value_alloc_type(__end_of_storage).deallocate(__start,n);
throw;
}
#else
__finish = uninitialized_copy(first, last, __start);
#endif // _RWSTD_NO_EXCEPTIONS
__end_of_storage = __finish;
}
#endif // _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
#endif // _RWSTD_NO_MEMBER_TEMPLATES
vector (const vector<T,Allocator>& x)
: __start(0), __finish(0), __end_of_storage(0,x.get_allocator())
{
__init();
__start = __value_alloc_type(__end_of_storage).allocate(x.end() - x.begin(),0);
__finish = uninitialized_copy(x.begin(), x.end(), __start);
__end_of_storage = __finish;
}
~vector ()
{
__destroy(__start, __finish);
__value_alloc_type(__end_of_storage).deallocate(__start,__end_of_storage.data()-__start);
}
vector<T,Allocator>& operator= (const vector<T,Allocator>& x);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class InputIterator>
void assign (InputIterator first, InputIterator last)
{
erase(begin(), end());
typedef _TYPENAME _RWdispatch<InputIterator>::_RWtype _RWtype;
__insert_aux(begin(), first, last, _RWtype());
}
void assign (size_type n, const T& 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 T& t)
{ erase(begin(), end()); insert(begin(), n, t); }
#endif // _RWSTD_NO_MEMBER_TEMPLATES
allocator_type get_allocator() const
{
return (allocator_type)__end_of_storage;
}
//
// Iterators.
//
iterator begin () { return __start; }
const_iterator begin () const { return __start; }
iterator end () { return __finish; }
const_iterator end () const { return __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;
}
//
// Capacity.
//
size_type size () const { return size_type(end() - begin()); }
size_type max_size () const { return __value_alloc_type(__end_of_storage).max_size(); }
void resize (size_type new_size);
void resize (size_type new_size, T value);
size_type capacity () const { return size_type(__end_of_storage.data() - begin()); }
bool empty () const { return begin() == end(); }
void reserve (size_type n)
{
_RWSTD_THROW(n > max_size(), length_error,
__RWSTD::except_msg_string(__RWSTD::__rwse_InvalidSizeParam,
"vector::reserve(size_t)",n,max_size()).msgstr());
if (capacity() < n)
{
__value_alloc_type va(__end_of_storage);
iterator tmp = va.allocate(n,__start);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
uninitialized_copy(begin(), end(), tmp);
} catch(...) {
__value_alloc_type(__end_of_storage).deallocate(tmp,n);
throw;
}
#else
uninitialized_copy(begin(), end(), tmp);
#endif // _RWSTD_NO_EXCEPTIONS
int tmp_size = size(); // RW_BUG: Fix for bts-78394
__destroy(__start, __finish);
va.deallocate(__start,__end_of_storage.data()-__start);
__finish = tmp + tmp_size; // RW_BUG: Fix for bts-78394
__start = tmp;
__end_of_storage = begin() + n;
}
}
//
// Element access.
//
reference operator[] (size_type n)
{
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
"vector::operator[](size_t)",n,size()).msgstr());
#endif
return *(begin() + n);
}
const_reference operator[] (size_type n) const
{
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
"vector::operator[](size_t) const",n,size()).msgstr());
#endif
return *(begin() + n);
}
reference at (size_type n)
{
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
"vector:: at(size_t)",n,size()).msgstr());
return *(begin() + n);
}
const_reference at (size_type n) const
{
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
"vector:: at(size_t) const",n,size()).msgstr());
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 T& x)
{
if (__finish != __end_of_storage.data())
{
__value_alloc_type(__end_of_storage).construct(__finish, x);
__finish++;
}
else
__insert_aux(end(), x);
}
void pop_back()
{
--__finish;
__value_alloc_type(__end_of_storage).destroy(__finish);
}
//
// Insert x at position.
//
iterator insert (iterator position, const T& x)
{
size_type n = position - begin();
if (__finish != __end_of_storage.data() && position == end())
{
__value_alloc_type(__end_of_storage).construct(__finish, x); __finish++;
}
else
__insert_aux(position, x);
return begin() + n;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class InputIterator>
void insert (iterator position, InputIterator first,
InputIterator last)
{
typedef _TYPENAME _RWdispatch<InputIterator>::_RWtype _RWtype;
__insert_aux(position, first, last, _RWtype());
}
void insert (iterator position, size_type n, const T& value)
{ __insert_aux(position,n,value); }
#else
void insert (iterator position, size_type n, const T& x)
{ __insert_aux(position,n,x); }
void insert (iterator position, const_iterator first, const_iterator last)
{ __insert_aux2(position, first, last); }
#endif // _RWSTD_NO_MEMBER_TEMPLATES
iterator erase (iterator position)
{
if (position + 1 != end())
copy(position + 1, end(), position);
--__finish;
__value_alloc_type(__end_of_storage).destroy(__finish);
return position;
}
iterator erase (iterator first, iterator last)
{
iterator i = copy(last, end(), first);
iterator tmp = __finish;
__finish = __finish - (last - first);
__destroy(i, tmp);
return first;
}
void swap (vector<T,Allocator>& x)
{
if((allocator_type)__end_of_storage==(allocator_type)x.__end_of_storage)
{
#ifndef _RWSTD_NO_NAMESPACE
std::swap(__start, x.__start);
std::swap(__finish, x.__finish);
std::swap(__end_of_storage, x.__end_of_storage);
#else
::swap(__start, x.__start);
::swap(__finish, x.__finish);
::swap(__end_of_storage, x.__end_of_storage);
#endif // _RWSTD_NO_NAMESPACE
}
else
{
vector<T,Allocator> _x = *this;
*this = x;
x=_x;
}
}
void clear()
{
erase(begin(),end());
}
#ifndef _RWSTD_STRICT_ANSI
// Non-standard function for setting buffer allocation size
size_type allocation_size() { return __buffer_size; }
size_type allocation_size(size_type new_size)
{
size_type tmp = __buffer_size;
__buffer_size = max((size_type)1,new_size);
return tmp;
}
#endif // _RWSTD_STRICT_ANSI
};
template <class T, class Allocator>
inline bool operator== (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
}
template <class T, class Allocator>
inline bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
}
#if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
template <class T, class Allocator>
inline bool operator!= (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
return !(x == y);
}
template <class T, class Allocator>
inline bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
return y < x;
}
template <class T, class Allocator>
inline bool operator>= (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
return !(x < y);
}
template <class T, class Allocator>
inline bool operator<= (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
return !(y < x);
}
template <class T, class Allocator>
inline void swap(vector<T,Allocator>& a, vector<T,Allocator>& b)
{
a.swap(b);
}
#endif // !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
#if defined (_RWSTD_NO_TEMPLATE_REPOSITORY) && defined (__BORLANDC__) && (__TURBOC__ < 0x540)
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#include <vector.cc>
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
#endif // (_RWSTD_NO_TEMPLATE_REPOSITORY) && defined (__BORLANDC__)
//
// If bool is a builtin type, we provide a vector<bool,allocator> specialization.
// We do not provide the allocator interface for this specialization.
//
#ifndef _RWSTD_NO_BOOL
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class Allocator>
class _RWSTDExport vector<bool, Allocator >
{
#else
// Use a macro to mutate Allocator into allocator<bool>
#define Allocator allocator<bool>
_RWSTD_TEMPLATE
class _RWSTDExport vector<bool, allocator<bool> >
{
#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
public:
//
// types
//
typedef Allocator allocator_type;
typedef bool value_type;
private:
#if defined ( _RWSTD_ALLOCATOR) && !defined(_HPACC_)
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef _TYPENAME allocator_type::template rebind<unsigned int>::other __value_alloc_type;
#else
typedef allocator_type::template rebind<unsigned int>::other __value_alloc_type;
#endif
#else
typedef allocator_interface<allocator_type,unsigned int> __value_alloc_type;
#endif
public:
#ifdef _RWSTD_NO_EMBEDDED_TYPEDEF
typedef allocator<bool>::size_type size_type;
typedef allocator<bool>::difference_type difference_type;
#else
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef allocator_type::size_type size_type;
typedef allocator_type::difference_type difference_type;
#else
typedef _TYPENAME allocator_type::size_type size_type;
typedef _TYPENAME allocator_type::difference_type difference_type;
#endif
#endif
protected:
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef __value_alloc_type::pointer pointer;
typedef __value_alloc_type::const_pointer const_pointer;
#else
typedef _TYPENAME __value_alloc_type::pointer pointer;
typedef _TYPENAME __value_alloc_type::const_pointer const_pointer;
#endif
public:
//
// forward declarations
//
class iterator;
class const_iterator;
//
// bit reference
//
class reference
{
friend class iterator;
friend class const_iterator;
protected:
unsigned int* p;
unsigned int mask;
reference (unsigned int* x, unsigned int y) : p(x), mask(y) {}
public:
reference () : p(0), mask(0) {}
operator bool () const { return !(!(*p & mask)); }
reference& operator= (bool x)
{
if (x)
*p |= mask;
else
*p &= ~mask;
return *this;
}
reference& operator= (const reference& x) { return *this = bool(x); }
#ifndef _RWSTD_STRICT_ANSI
bool operator== (const reference& x) const
{
return bool(*this) == bool(x);
}
bool operator< (const reference& x) const
{
#if !defined(_MSC_VER) || defined(__BORLANDC__)
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_STRICT_ANSI
void flip () { *p ^= mask; }
};
typedef bool const_reference;
//
// Definition of our iterator.
//
class iterator : public _RW_STD::iterator<random_access_iterator_tag,
value_type, difference_type,
pointer,reference>
{
#if !defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
friend class vector<bool,Allocator>;
#else
friend class vector<bool,allocator<bool> >;
#endif
friend class const_iterator;
protected:
unsigned int* p;
unsigned int offset;
void __bump_up ()
{
if (offset++ == _RWSTD_WORD_BIT - 1)
{
offset = 0; ++p;
}
}
void __bump_down ()
{
if (offset-- == 0)
{
offset = _RWSTD_WORD_BIT - 1; --p;
}
}
public:
iterator () : p(0), offset(0) {}
iterator (unsigned int* x, unsigned int y) : p(x), offset(y) {}
reference operator* () const { return reference(p, 1U << offset); }
iterator& operator++ ()
{
__bump_up(); return *this;
}
iterator operator++ (int)
{
iterator tmp = *this; __bump_up(); return tmp;
}
iterator& operator-- ()
{
__bump_down(); return *this;
}
iterator operator-- (int)
{
iterator tmp = *this; __bump_down(); return tmp;
}
iterator& operator+= (difference_type i)
{
difference_type n = i + offset;
p += n / _RWSTD_WORD_BIT;
n = n % _RWSTD_WORD_BIT;
if (n < 0)
{
offset = n + _RWSTD_WORD_BIT; --p;
}
else
offset = n;
return *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 * (p - x.p) + offset - x.offset;
}
reference operator[] (difference_type i)
{
return *(*this + i);
}
bool operator== (const iterator& x) const
{
return p == x.p && offset == x.offset;
}
bool operator< (const iterator& x) const
{
return p < x.p || (p == x.p && offset < x.offset);
}
bool operator!= (const iterator& x) const
{
return !(*this == x);
}
bool operator> (const iterator& x) const
{
return x < *this;
}
bool operator>= (const iterator& x) const
{
return !(*this < x);
}
bool operator<= (const iterator& x) const
{
return !(*this > x);
}
};
//
// Definition of our const_iterator.
//
class const_iterator
: public _RW_STD::iterator<random_access_iterator_tag,
value_type, difference_type,
const_pointer, const_reference>
{
#if !defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
friend class vector<bool,Allocator>;
#else
friend class vector<bool,allocator<bool> >;
#endif
protected:
unsigned int* p;
unsigned int offset;
void __bump_up ()
{
if (offset++ == _RWSTD_WORD_BIT - 1)
{
offset = 0; ++p;
}
}
void __bump_down()
{
if (offset-- == 0)
{
offset = _RWSTD_WORD_BIT - 1; --p;
}
}
public:
const_iterator () : p(0), offset(0) {}
const_iterator (unsigned int* x, unsigned int y) : p(x), offset(y) {}
#if !defined(_MSC_VER) || defined(__BORLANDC__)
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
const_iterator (const vector<bool,Allocator>::iterator& x) : p(x.p), offset(x.offset) {}
#else
const_iterator (const _TYPENAME vector<bool,Allocator>::iterator& x) : p(x.p), offset(x.offset) {}
#endif
#else
const_iterator (const iterator& x) : p(x.p), offset(x.offset) {}
#endif
const_reference operator* () const
{
return vector<bool,Allocator>::reference(p, 1U << offset);
}
const_iterator& operator++ ()
{
__bump_up(); return *this;
}
const_iterator operator++ (int)
{
const_iterator tmp = *this; __bump_up(); return tmp;
}
const_iterator& operator-- ()
{
__bump_down(); return *this;
}
const_iterator operator-- (int)
{
const_iterator tmp = *this; __bump_down(); return tmp;
}
const_iterator& operator+= (difference_type i)
{
difference_type n = i + offset;
p += n / _RWSTD_WORD_BIT;
n = n % _RWSTD_WORD_BIT;
if (n < 0)
{
offset = n + _RWSTD_WORD_BIT; --p;
}
else
offset = n;
return *this;
}
const_iterator& operator-= (difference_type i)
{
*this += -i; return *this;
}
const_iterator operator+ (difference_type i) const
{
const_iterator tmp = *this; return tmp += i;
}
const_iterator operator- (difference_type i) const
{
const_iterator tmp = *this; return tmp -= i;
}
difference_type operator- (const_iterator x) const
{
return _RWSTD_WORD_BIT * (p - x.p) + offset - x.offset;
}
const_reference operator[] (difference_type i)
{
return *(*this + i);
}
bool operator== (const const_iterator& x) const
{
return p == x.p && offset == x.offset;
}
bool operator< (const const_iterator& x) const
{
return p < x.p || (p == x.p && offset < x.offset);
}
bool operator!= (const const_iterator& x) const
{
return !(*this == x);
}
bool operator> (const const_iterator& x) const
{
return x < *this;
}
bool operator>= (const const_iterator& x) const
{
return !(*this < x);
}
bool operator<= (const const_iterator& x) const
{
return !(*this > x);
}
};
//
// types
//
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef _RW_STD::reverse_iterator<const_iterator> const_reverse_iterator;
typedef _RW_STD::reverse_iterator<iterator> reverse_iterator;
#else
typedef _RW_STD::reverse_iterator<const_iterator,
random_access_iterator_tag, value_type,
const_reference, const_pointer, difference_type>
const_reverse_iterator;
typedef _RW_STD::reverse_iterator<iterator,
random_access_iterator_tag, value_type,
reference, pointer, difference_type>
reverse_iterator;
#endif
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 __fill (iterator first, iterator last,
const bool& value)
{
while (first != last) *first++ = value;
}
void __fill_n (iterator first, size_type n,
const bool& value)
{
while (n-- > 0) *first++ = value;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template <class Iterator>
iterator __copy (Iterator first, Iterator last,
iterator result)
{
while (first != last) *result++ = *first++;
return result;
}
template <class Iterator>
iterator __copy_backward (Iterator first, Iterator last,
iterator result)
{
while (first != last) *--result = *--last;
return result;
}
#else
iterator __copy (const_iterator first, const_iterator last,
iterator result)
{
while (first != last) *result++ = *first++;
return result;
}
iterator __copy (const bool* first, const bool* last,
iterator result)
{
while (first != last) *result++ = *first++;
return result;
}
iterator __copy_backward (const_iterator first, const_iterator last,
iterator result)
{
while (first != last) *--result = *--last;
return result;
}
iterator __copy_backward (const bool* first, const bool* last,
iterator result)
{
while (first != last) *--result = *--last;
return result;
}
#endif
protected:
iterator __start;
iterator __finish;
__RWSTD::__rw_basis<unsigned int*,allocator_type> __end_of_storage;
unsigned int* __bit_alloc (size_type n)
{
return __value_alloc_type(__end_of_storage).allocate((n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT,__start.p);
}
void __init (size_type n)
{
unsigned int* q = __bit_alloc(n);
__end_of_storage = q + (n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
__start = iterator(q, 0);
__finish = __start + n;
}
void __insert_aux (iterator position, bool x);
public:
//
// construct/copy/destroy
//
vector<bool,Allocator> (const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
: __start(iterator()), __finish(iterator()),
__end_of_storage(0,alloc)
{ ; }
_EXPLICIT vector<bool,Allocator> (size_type n, bool value = bool(),
const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
: __end_of_storage(0,alloc)
{
__init(n);
unsigned int * first = __start.p;
size_type m = (n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
while (m-- > 0) *first++ = value ? ~0 : 0;
}
vector<bool,Allocator> (const vector<bool,Allocator >& x)
: __end_of_storage(0,x.get_allocator())
{
__init(x.size());
__copy(x.begin(), x.end(), __start);
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class InputIterator>
vector<bool,Allocator> (InputIterator first, InputIterator last)
: __end_of_storage(0,Allocator())
{
size_type n;
__initialize(n, size_type(0));
distance(first, last, n);
__init(n);
__copy(first, last, __start);
}
#else
vector<bool,Allocator> (const_iterator first, const_iterator last)
: __end_of_storage(0,Allocator())
{
size_type n;
__initialize(n, size_type(0));
distance(first, last, n);
__init(n);
__copy(first, last, __start);
}
vector<bool,Allocator> (const bool* first, const bool* last)
: __end_of_storage(0,Allocator())
{
size_type n;
__initialize(n, size_type(0));
distance(first, last, n);
__init(n);
__copy(first, last, __start);
}
#endif
~vector<bool,Allocator> () {
__value_alloc_type(__end_of_storage).deallocate(__start.p,
__end_of_storage.data()-__start.p);
}
vector<bool,Allocator>& operator= (const vector<bool, Allocator>& x)
{
if (&x == this) return *this;
if (x.size() > capacity())
{
__value_alloc_type(__end_of_storage).deallocate(__start.p,
__end_of_storage.data()-__start.p);
__init(x.size());
}
__copy(x.begin(), x.end(), begin());
__finish = begin() + x.size();
return *this;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class InputIterator>
void assign (InputIterator first, InputIterator 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 (allocator_type)__end_of_storage;
}
//
// iterators
//
iterator begin () { return __start; }
const_iterator begin () const
{ return const_iterator(__start.p,__start.offset); }
iterator end () { return __finish; }
const_iterator end () const
{ return const_iterator(__finish.p,__finish.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 __value_alloc_type(__end_of_storage).max_size(); }
void resize (size_type new_size, bool c = false);
size_type capacity () const
{
return size_type(const_iterator(__end_of_storage.data(), 0) - begin());
}
bool empty () const { return begin() == end(); }
void reserve (size_type n)
{
_RWSTD_THROW(n > max_size(), length_error,
__RWSTD::except_msg_string(__RWSTD::__rwse_InvalidSizeParam,
"vector<bool>::reserve(size_t)",n,max_size()).msgstr());
if (capacity() < n)
{
unsigned int* q = __bit_alloc(n);
__finish = __copy(begin(), end(), iterator(q, 0));
__value_alloc_type(__end_of_storage).deallocate(__start.p,
__end_of_storage.data()-__start.p);
__start = iterator(q, 0);
__end_of_storage = q + (n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
}
}
//
// element access
//
reference operator[] (size_type n)
{
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
"vector<bool>::[](size_t)",n,size()).msgstr());
#endif
return *(begin() + n);
}
const_reference operator[] (size_type n) const
{
#ifdef _RWSTD_BOUNDS_CHECKING
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
"vector<bool>::[](size_t)",n,size()).msgstr());
#endif
return *(begin() + n);
}
reference at (size_type n)
{
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
"vector<bool>:: at(size_t)",n,size()).msgstr());
return *(begin() + n);
}
const_reference at (size_type n) const
{
_RWSTD_THROW(n >= size(), out_of_range,
__RWSTD::except_msg_string( __RWSTD::rwse_OutOfRange,
"vector<bool>:: at(size_t) const",n,size()).msgstr());
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 (__finish.p != __end_of_storage.data())
*__finish++ = x;
else
__insert_aux(end(), x);
}
void pop_back () { --__finish; }
iterator insert (iterator position, const bool& x = bool())
{
size_type n = position - begin();
if (__finish.p != __end_of_storage.data() && position == end())
*__finish++ = x;
else
__insert_aux(position, x);
return begin() + n;
}
void insert (iterator position, size_type n, const bool& x);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
#else
void insert (iterator position, const_iterator first,
const_iterator last);
#endif
iterator erase (iterator position)
{
if (!(position + 1 == end()))
__copy(position + 1, end(), position);
--__finish;
return position;
}
iterator erase(iterator first, iterator last)
{
__finish = __copy(last, end(), first);
return first;
}
void swap (vector<bool,Allocator >& x)
{
if((allocator_type)__end_of_storage==(allocator_type)x.__end_of_storage)
{
#ifndef _RWSTD_NO_NAMESPACE
std::swap(__start, x.__start);
std::swap(__finish, x.__finish);
std::swap(__end_of_storage, x.__end_of_storage);
#else
::swap(__start, x.__start);
::swap(__finish, x.__finish);
::swap(__end_of_storage, x.__end_of_storage);
#endif // _RWSTD_NO_NAMESPACE
}
else
{
vector<bool,Allocator> _x = *this;
*this = x;
x=_x;
}
}
static void swap(reference x, reference y);
void flip ();
void clear()
{
erase(begin(),end());
}
};
#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())
{
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
vector<bool,Allocator >::const_iterator first1 = x.begin(),
#else
_TYPENAME vector<bool,Allocator >::const_iterator first1 = x.begin(),
#endif
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)
{
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
vector<bool,Allocator >::const_iterator first1 = x.begin(),
#else
_TYPENAME vector<bool,Allocator >::const_iterator first1 = x.begin(),
#endif
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;
}
#if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
#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_CLASS_PARTIAL_SPEC
template <class Allocator>
#endif
inline void swap(vector<bool,Allocator >& a, vector<bool,Allocator >& b)
{
a.swap(b);
}
#endif
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
#undef Allocator
#endif
#endif /*_RWSTD_NO_BOOL*/
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#if defined (_RWSTD_NO_TEMPLATE_REPOSITORY) && (!defined (__TURBOC__) || (__TURBOC__ > 0x530))
#include <vector.cc>
#endif
#undef vector
#endif /*__STD_VECTOR__*/
#ifndef __USING_STD_NAMES__
using namespace std;
#endif
#pragma option pop
#endif /* __VECTOR_H */