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.cc

430 lines
14 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_CC
#define __VECTOR_CC
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
/***************************************************************************
*
* vector.cc - Non-inline definitions 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.
*
**************************************************************************/
#include <stdcomp.h>
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
//
// This requires that T have a default constructor.
//
template <class T, class Allocator>
void vector<T,Allocator>::resize (size_type new_size)
{
// T value; // RW_BUG: bts-78526
if (new_size > size())
insert(end(), new_size - size(), T() ); // RW_BUG: bts-78526
else if (new_size < size())
erase(begin() + new_size, end());
}
template <class T, class Allocator>
void vector<T,Allocator>::resize (size_type new_size, T value)
{
if (new_size > size())
insert(end(), new_size - size(), value);
else if (new_size < size())
erase(begin() + new_size, end());
}
template <class T, class Allocator>
vector<T,Allocator>& vector<T,Allocator>::operator= (const vector<T,Allocator>& x)
{
if (&x == this) return *this;
if (x.size() > capacity())
{
__value_alloc_type va(__end_of_storage);
iterator tmp = va.allocate(x.end() - x.begin(),0);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
__end_of_storage = uninitialized_copy(x.begin(), x.end(), tmp);
} catch(...) {
va.deallocate(tmp,x.end()-x.begin());
throw;
}
#else
__end_of_storage = uninitialized_copy(x.begin(), x.end(), tmp);
#endif // _RWSTD_NO_EXCEPTIONS
__destroy(__start, __finish);
va.deallocate(__start,__end_of_storage.data()-__start);
__start = tmp;
}
else if (size() >= x.size())
{
iterator i = copy(x.begin(), x.end(), begin());
__destroy(i, __finish);
}
else
{
copy(x.begin(), x.begin() + size(), begin());
uninitialized_copy(x.begin() + size(), x.end(), begin() + size());
}
__finish = begin() + x.size();
return *this;
}
template <class T, class Allocator>
void vector<T,Allocator>::__insert_aux (
iterator position, const T& x)
{
if (__finish != __end_of_storage.data())
{
__value_alloc_type(__end_of_storage).construct(__finish, *(__finish - 1));
copy_backward(position, __finish - 1, __finish);
*position = x;
++__finish;
}
else
{
//
// We always allocate enough space for a number of additional
// elements in the vector, unless the size of each element is
// very large. See definition of __rw_allocation_size in
// memory.
//
__value_alloc_type va(__end_of_storage);
size_type len = __RWSTD::__rw_allocation_size((value_type*)0,size(),__buffer_size);
iterator tmp = va.allocate(len,__start);
uninitialized_copy(begin(), position, tmp);
va.construct((tmp + (position - begin())), x);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
uninitialized_copy(position, end(), tmp + (position - begin()) + 1);
} catch(...) {
va.deallocate(tmp,len);
throw;
}
#else
uninitialized_copy(position, end(), tmp + (position - begin()) + 1);
#endif // _RWSTD_NO_EXCEPTIONS
int tmp_size = size(); // RW_BUG: Fix for bts-78394
__destroy(begin(), end());
va.deallocate(begin(),__end_of_storage.data() - begin());
__end_of_storage = tmp + len;
__finish = tmp + tmp_size + 1; // RW_BUG: Fix for bts-78394
__start = tmp;
}
}
template <class T, class Allocator>
void vector<T,Allocator>::__insert_aux (
iterator position, size_type n, const T& x)
{
if (n == 0) return;
if ((size_type)(__end_of_storage.data() - __finish) >= n)
{
iterator old_end = end();
if ((size_type)(end() - position) > n)
{
uninitialized_copy(old_end - n, old_end, old_end);
__finish += n;
copy_backward(position, old_end - n, old_end);
fill(position, position + n, x);
}
else
{
size_type first_part = n - (old_end - position);
uninitialized_fill_n(old_end, first_part, x);
__finish += first_part;
uninitialized_copy(position, old_end, position + n);
__finish += n - first_part;
fill(position, old_end, x);
}
}
else
{
__value_alloc_type va(__end_of_storage);
size_type len = size() + max(size(), n);
iterator tmp = va.allocate(len,__start);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
uninitialized_copy(begin(), position, tmp);
uninitialized_fill_n(tmp + (position - begin()), n, x);
uninitialized_copy(position, end(), tmp + (position - begin() + n));
} catch(...) {
va.deallocate(tmp,len);
throw;
}
#else
uninitialized_copy(begin(), position, tmp);
uninitialized_fill_n(tmp + (position - begin()), n, x);
uninitialized_copy(position, end(), tmp + (position - begin() + n));
#endif // _RWSTD_NO_EXCEPTIONS
int tmp_size = size(); // RW_BUG: Fix for bts-78394
__destroy(begin(), end());
va.deallocate(begin(),__end_of_storage.data() - begin());
__end_of_storage = tmp + len;
__finish = tmp + tmp_size + n; // RW_BUG: Fix for bts-78394
__start = tmp;
}
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class T, class Allocator>
template<class InputIterator>
void vector<T,Allocator>::__insert_aux2 (iterator position,
InputIterator first,
InputIterator last)
#else
template<class T, class Allocator>
void vector<T,Allocator>::__insert_aux2 (iterator position,
const_iterator first,
const_iterator last)
#endif
{
if (first == last) return;
size_type n;
__initialize(n, size_type(0));
distance(first, last, n);
if ((size_type)(__end_of_storage.data() - __finish) >= n)
{
iterator old_end = end();
if ((size_type)(old_end - position) > n)
{
uninitialized_copy(old_end - n, old_end, old_end);
__finish += n;
copy_backward(position, old_end - n, old_end);
copy(first, last, position);
}
else
{
size_type first_part = (old_end - position);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
InputIterator iter(first);
#else
const_iterator iter(first);
#endif
advance(iter, first_part);
uninitialized_copy(iter, last, old_end);
// uninitialized_copy(first + first_part, last, old_end);
__finish += n - first_part;
uninitialized_copy(position, old_end, position + n);
__finish += first_part;
copy(first, iter, position);
// copy(first, first + (old_end - position), position);
}
}
else
{
__value_alloc_type va(__end_of_storage);
size_type len = size() + max(size(), n);
iterator tmp = va.allocate(len,__start);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
uninitialized_copy(begin(), position, tmp);
uninitialized_copy(first, last, tmp + (position - begin()));
uninitialized_copy(position, end(), tmp + (position - begin() + n));
} catch(...) {
va.deallocate(tmp,len);
throw;
}
#else
uninitialized_copy(begin(), position, tmp);
uninitialized_copy(first, last, tmp + (position - begin()));
uninitialized_copy(position, end(), tmp + (position - begin() + n));
#endif // _RWSTD_NO_EXCEPTIONS
int tmp_size = size(); // RW_BUG: Fix for bts-78394
__destroy(begin(), end());
va.deallocate(begin(),__end_of_storage.data() - begin());
__end_of_storage = tmp + len;
__finish = tmp + tmp_size + n; // RW_BUG: Fix for bts-78394
__start = tmp;
}
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
// The body of this function is duplicated in src/vecbool.cpp and
// further down in this file as well.
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class Allocator>
template<class InputIterator>
void vector<bool, Allocator >::insert
#else
template<class InputIterator>
void vector<bool, allocator<bool> >::insert
#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
(iterator position,
InputIterator first,
InputIterator last)
{
if (first == last) return;
size_type n;
__initialize(n, size_type(0));
distance(first, last, n);
if (capacity() - size() >= n)
{
copy_backward(position, end(), __finish + n);
copy(first, last, position);
__finish += n;
}
else
{
size_type len = size() + max(size(), n);
unsigned int* q = __bit_alloc(len);
iterator i = copy(begin(), position, iterator(q, 0));
i = copy(first, last, i);
__finish = copy(position, end(), i);
__value_alloc_type(__end_of_storage).deallocate(__start.p,__end_of_storage.data() - __start.p);
__end_of_storage = q + (len + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
__start = iterator(q, 0);
}
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
// Duplicates of the followign functions exist in src/stl/vecbool.cpp.
// Which set is used depends on the availability of partial specialization.
template <class Allocator>
void vector<bool,Allocator >::flip ()
{
for (iterator i = begin(); !(i == end()); i++)
*i = !(*i);
}
template <class Allocator>
void vector<bool,Allocator >::swap (reference x, reference y)
{
bool tmp = x; x = y; y = tmp;
}
template <class Allocator>
void vector<bool,Allocator >::__insert_aux (iterator position, bool x)
{
if (__finish.p != __end_of_storage.data())
{
__copy_backward(position, __finish - 1, __finish);
*position = x;
++__finish;
}
else
{
size_type len = size() ? 2 * size() : _RWSTD_WORD_BIT;
unsigned int* q = __bit_alloc(len);
iterator i = __copy(begin(), position, iterator(q, 0));
*i++ = x;
__finish = __copy(position, end(), i);
__value_alloc_type(__end_of_storage).deallocate(__start.p,__end_of_storage.data() - __start.p);
__end_of_storage = q + (len + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
__start = iterator(q, 0);
}
}
template <class Allocator>
void vector<bool,Allocator >::insert (iterator position, size_type n, const bool& x)
{
if (n == 0) return;
if (capacity() - size() >= n)
{
__copy_backward(position, end(), __finish + n);
__fill(position, position + n, x);
__finish += n;
}
else
{
size_type len = size() + max(size(), n);
unsigned int* q = __bit_alloc(len);
iterator i = __copy(begin(), position, iterator(q, 0));
__fill_n(i, n, x);
__finish = __copy(position, end(), i + n);
__value_alloc_type(__end_of_storage).deallocate(__start.p,__end_of_storage.data() - __start.p);
__end_of_storage = q + (len + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
__start = iterator(q, 0);
}
}
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
template <class Allocator>
void vector<bool,Allocator >::insert (iterator position, const_iterator first,
const_iterator last)
{
if (first == last) return;
size_type n;
__initialize(n, size_type(0));
distance(first, last, n);
if (capacity() - size() >= n)
{
__copy_backward(position, end(), __finish + n);
__copy(first, last, position);
__finish += n;
}
else
{
size_type len = size() + max(size(), n);
unsigned int* q = __bit_alloc(len);
iterator i = __copy(begin(), position, iterator(q, 0));
i = __copy(first, last, i);
__finish = __copy(position, end(), i);
__value_alloc_type(__end_of_storage).deallocate(__start.p,__end_of_storage.data() - __start.p);
__end_of_storage = q + (len + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
__start = iterator(q, 0);
}
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
template <class Allocator>
void vector<bool,Allocator >::resize (size_type new_size, bool c)
{
if (new_size > size())
insert(end(), new_size - size(), c);
else if (new_size < size())
erase(begin() + new_size, end());
}
#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#pragma option pop
#endif /* __VECTOR_CC */