#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 #include #include #include #include #include #include #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 vector { private: #if defined( _RWSTD_ALLOCATOR) && !defined(_HPACC_) typedef _TYPENAME Allocator::template rebind::other __value_alloc_type; #else typedef allocator_interface __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_reverse_iterator; typedef _RW_STD::reverse_iterator reverse_iterator; #else typedef _RW_STD::reverse_iterator const_reverse_iterator; typedef _RW_STD::reverse_iterator reverse_iterator; #endif protected: size_type __buffer_size; iterator __start; iterator __finish; __RWSTD::__rw_basis __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 void __insert_aux (iterator position, InputIterator first, InputIterator last, _RW_is_not_integer) { __insert_aux2 (position, first, last); } template void __insert_aux (iterator position, InputIterator first, InputIterator last, _RW_is_integer) { __insert_aux (position, (size_type)first, last); } template 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 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 void __init_aux (InputIterator first, InputIterator last, _RW_is_integer) { __initn((size_type)first,last); } template vector (InputIterator first, InputIterator last, const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator())) : __start(0), __finish(0), __end_of_storage(0,alloc) { typedef _TYPENAME _RWdispatch::_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& 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& operator= (const vector& x); #ifndef _RWSTD_NO_MEMBER_TEMPLATES template void assign (InputIterator first, InputIterator last) { erase(begin(), end()); typedef _TYPENAME _RWdispatch::_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 void insert (iterator position, InputIterator first, InputIterator last) { typedef _TYPENAME _RWdispatch::_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& 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 _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 inline bool operator== (const vector& x, const vector& y) { return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); } template inline bool operator< (const vector& x, const vector& y) { return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); } #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD) template inline bool operator!= (const vector& x, const vector& y) { return !(x == y); } template inline bool operator> (const vector& x, const vector& y) { return y < x; } template inline bool operator>= (const vector& x, const vector& y) { return !(x < y); } template inline bool operator<= (const vector& x, const vector& y) { return !(y < x); } template inline void swap(vector& a, vector& 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 #ifndef _RWSTD_NO_NAMESPACE namespace std { #endif #endif // (_RWSTD_NO_TEMPLATE_REPOSITORY) && defined (__BORLANDC__) // // If bool is a builtin type, we provide a vector specialization. // We do not provide the allocator interface for this specialization. // #ifndef _RWSTD_NO_BOOL #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC template class _RWSTDExport vector { #else // Use a macro to mutate Allocator into allocator #define Allocator allocator _RWSTD_TEMPLATE class _RWSTDExport vector > { #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::other __value_alloc_type; #else typedef allocator_type::template rebind::other __value_alloc_type; #endif #else typedef allocator_interface __value_alloc_type; #endif public: #ifdef _RWSTD_NO_EMBEDDED_TYPEDEF typedef allocator::size_type size_type; typedef allocator::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 { #if !defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) friend class vector; #else friend class vector >; #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 { #if !defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) friend class vector; #else friend class vector >; #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::iterator& x) : p(x.p), offset(x.offset) {} #else const_iterator (const _TYPENAME vector::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::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_reverse_iterator; typedef _RW_STD::reverse_iterator reverse_iterator; #else typedef _RW_STD::reverse_iterator const_reverse_iterator; typedef _RW_STD::reverse_iterator 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 iterator __copy (Iterator first, Iterator last, iterator result) { while (first != last) *result++ = *first++; return result; } template 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 __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 (const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator())) : __start(iterator()), __finish(iterator()), __end_of_storage(0,alloc) { ; } _EXPLICIT vector (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 (const vector& x) : __end_of_storage(0,x.get_allocator()) { __init(x.size()); __copy(x.begin(), x.end(), __start); } #ifndef _RWSTD_NO_MEMBER_TEMPLATES template vector (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 (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 (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 () { __value_alloc_type(__end_of_storage).deallocate(__start.p, __end_of_storage.data()-__start.p); } vector& operator= (const vector& 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 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::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::[](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::[](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:: 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 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 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& 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 _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 #endif inline bool operator== (const vector& x, const vector& y) { if (x.size() == y.size()) { #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC vector::const_iterator first1 = x.begin(), #else _TYPENAME vector::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 #endif inline bool operator< (const vector& x, const vector& y) { #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC vector::const_iterator first1 = x.begin(), #else _TYPENAME vector::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 #endif inline bool operator!= (const vector& x, const vector& y) { return !(x == y); } #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC template #endif inline bool operator> (const vector& x, const vector& y) { return y < x; } #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC template #endif inline bool operator>= (const vector& x, const vector& y) { return !(x < y); } #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC template #endif inline bool operator<= (const vector& x, const vector& y) { return !(y < x); } #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC template #endif inline void swap(vector& a, vector& 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 #endif #undef vector #endif /*__STD_VECTOR__*/ #ifndef __USING_STD_NAMES__ using namespace std; #endif #pragma option pop #endif /* __VECTOR_H */