blob: 9b36a022b3d5e9da448fef8947abff940e4cb126 [file] [log] [blame]
/***************************************************************************
*
* vecbool.cpp - source for the C++ Standard Library vector<bool>
* specialization
*
* $Id$
*
***************************************************************************
*
* 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.
*
***************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the License); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* Copyright 1994-2006 Rogue Wave Software.
*
**************************************************************************/
#define _RWSTD_LIB_SRC
#include <vector>
#include <rw/_relops.h>
#include <rw/_defs.h>
#if !defined (_RWSTD_NO_BOOL) && !defined (_RWSTD_NO_VECTOR_BOOL)
# if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
// Duplicates of the following functions exist in include/vector.cc.
// Which set is used depends on the availability of partial specialization.
_RWSTD_NAMESPACE (std) {
void vector<bool, allocator<bool> >::flip ()
{
_USING (namespace rel_ops);
for (iterator __i = begin(); __i != end(); __i++)
*__i = !*__i;
}
void vector<bool, allocator<bool> >::
swap (vector<bool, allocator<bool> >::reference __x,
vector<bool, allocator<bool> >::reference __y)
{
const bool __tmp = __x;
__x = __y;
__y = __tmp;
}
void vector<bool, allocator<bool> >::
_C_insert (iterator pos, bool __x)
{
if (_C_end._C_p != _C_bufend) {
_C_copy_backward(pos, _C_end - 1, _C_end);
*pos = __x;
++_C_end;
}
else
{
size_type __len = size() ? 2 * size() : _RWSTD_WORD_BIT;
unsigned int* __q = _C_bit_alloc(__len);
iterator __i = _C_copy(begin(), pos, iterator(__q, 0));
*__i++ = __x;
_C_end = _C_copy(pos, end(), __i);
_C_value_alloc_type (*this).
deallocate(_C_begin._C_p,_C_bufend-_C_begin._C_p);
_C_bufend = __q + (__len + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
_C_begin = iterator(__q, 0);
}
}
void vector<bool, allocator<bool> >::
insert (iterator pos, size_type __n, const bool& __x)
{
if (__n == 0)
return;
if (capacity() - size() >= __n) {
_C_copy_backward(pos, end(), _C_end + __n);
_C_fill(pos, pos + __n, __x);
_C_end += __n;
}
else {
size_type __len = size() + max(size(), __n);
unsigned int* __q = _C_bit_alloc(__len);
iterator __i = _C_copy(begin(), pos, iterator(__q, 0));
_C_fill_n(__i, __n, __x);
_C_end = _C_copy(pos, end(), __i + __n);
_C_value_alloc_type (*this).
deallocate(_C_begin._C_p,_C_bufend-_C_begin._C_p);
_C_bufend = __q + (__n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
_C_begin = iterator(__q, 0);
}
}
# ifdef _RWSTD_NO_MEMBER_TEMPLATES
// The body of this function is duplicated in include/vector.cc
void vector<bool, allocator<bool> >::
insert (iterator pos, const_iterator __first, const_iterator __last)
{
if (__first == __last)
return;
size_type __n = _DISTANCE (__first, __last, size_type);
if (capacity() - size() >= __n) {
_C_copy_backward(pos, end(), _C_end + __n);
_C_copy(__first, __last, pos);
_C_end += __n;
}
else {
size_type __len = size() + max(size(), __n);
unsigned int* __q = _C_bit_alloc(__len);
iterator __i = _C_copy(begin(), pos, iterator(__q, 0));
__i = _C_copy(__first, __last, __i);
_C_end = _C_copy(pos, end(), __i);
_C_value_alloc_type (*this).
deallocate(_C_begin._C_p,_C_bufend-_C_begin._C_p);
_C_bufend = __q + (__len + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
_C_begin = iterator(__q, 0);
}
}
# endif // _RWSTD_NO_MEMBER_TEMPLATES
void vector<bool, allocator<bool> >::
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());
}
} // namespace std
# endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
#endif // !defined (_RWSTD_NO_BOOL) && !defined (_RWSTD_NO_VECTOR_BOOL)