// -*- 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 #include #include #include #include #include #include _RWSTD_NAMESPACE_BEGIN (std) template ) > 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 iterator; typedef _RW::__rw_debug_iter 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_reverse_iterator; typedef _STD::reverse_iterator reverse_iterator; #else typedef _STD::reverse_iterator const_reverse_iterator; typedef _STD::reverse_iterator 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 void _C_insert_aux (iterator __position, _InputIter __first, _InputIter __last, _RW_is_not_integer) { _C_insert_aux2 (__position, __first, __last); } template void _C_insert_aux (iterator __position, _InputIter __first, _InputIter __last, _RW_is_integer) { _C_insert_aux (__position, (size_type)__first, __last); } template void _C_insert_aux2 (iterator __position, _InputIter __first, _InputIter __last); template 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 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 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 void _C_init_aux (_InputIter __first, _InputIter __last, _RW_is_integer) { _C_initn((size_type)__first,__last); } template 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 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 void insert (iterator __pos, _InputIter __first, _InputIter __last) { insert (__pos, __first, __last, _RWSTD_DISPATCH (_InputIter)); } template 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 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 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 inline bool operator!= (const vector<_TypeT,_Allocator>& __x, const vector<_TypeT,_Allocator>& __y) { return !(__x == __y); } template inline bool operator> (const vector<_TypeT,_Allocator>& __x, const vector<_TypeT,_Allocator>& __y) { return __y < __x; } template inline bool operator>= (const vector<_TypeT,_Allocator>& __x, const vector<_TypeT,_Allocator>& __y) { return !(__x < __y); } template inline bool operator<= (const vector<_TypeT,_Allocator>& __x, const vector<_TypeT,_Allocator>& __y) { return !(__y < __x); } #ifndef _RWSTD_NO_PART_SPEC_OVERLOAD template 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 #else // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC) // use a macro to mutate _Allocator into allocator # define _Allocator allocator _RWSTD_SPECIALIZED_CLASS #endif // _RWSTD_NO_CLASS_PARTIAL_SPEC class _RWSTD_EXPORT vector : 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; #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 { 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 { 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_reverse_iterator; typedef _STD::reverse_iterator reverse_iterator; #else typedef _STD::reverse_iterator const_reverse_iterator; typedef _STD::reverse_iterator 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 iterator _C_copy (_Iterator __first, _Iterator __last, iterator __res) { while (__first != __last) *__res++ = *__first++; return __res; } template 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 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 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::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::[](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::[](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::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::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 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 #endif inline bool operator== (const vector& __x, const vector& __y) { if (__x.size() == __y.size()) { _TYPENAME vector::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 #endif inline bool operator< (const vector& __x, const vector& __y) { _TYPENAME vector::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 >& __x, const vector >& __y) { if (__x.size() == __y.size()) { vector >::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 >& __x, const vector >& __y) { vector >::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 #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_PART_SPEC_OVERLOAD #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC template #endif inline void swap(vector& __a, vector& __b) { __a.swap(__b); } #endif #else //_RWSTD_NO_FUNC_PART_SPEC _RWSTD_SPECIALIZED_FUNCTION inline bool operator!= (const vector >& __x, const vector >& __y) { return !(__x == __y); } _RWSTD_SPECIALIZED_FUNCTION inline bool operator> (const vector >& __x, const vector >& __y) { return __y < __x; } _RWSTD_SPECIALIZED_FUNCTION inline bool operator>= (const vector >& __x, const vector >& __y) { return !(__x < __y); } _RWSTD_SPECIALIZED_FUNCTION inline bool operator<= (const vector >& __x, const vector >& __y) { return !(__y < __x); } _RWSTD_SPECIALIZED_FUNCTION inline void swap (vector >& __a, vector >& __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 #endif #ifndef _RWSTD_NO_STL_SPECIALIZATION #include "vector_spec.h" #endif // _RWSTD_NO_STL_SPECIALIZATION #endif // _RWSTD_VECTOR_INCLUDED