| /*************************************************************************** |
| * |
| * 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) |