diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index aca70bc1239..133507483a6 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -438,6 +438,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template struct _Deque_iterator; + struct _Bit_iterator; + _GLIBCXX_END_NAMESPACE_CONTAINER // Helpers for streambuf iterators (either istream or ostream). @@ -957,6 +959,10 @@ _GLIBCXX_END_NAMESPACE_CONTAINER const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&, const _VTp&); + void + __fill_a1(_GLIBCXX_STD_C::_Bit_iterator, _GLIBCXX_STD_C::_Bit_iterator, + const bool&); + template _GLIBCXX20_CONSTEXPR inline void diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h index f245e52b25d..a365e7182eb 100644 --- a/libstdc++-v3/include/bits/stl_bvector.h +++ b/libstdc++-v3/include/bits/stl_bvector.h @@ -416,39 +416,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { return __x + __n; } }; - inline void - __fill_bvector(_Bit_type * __v, - unsigned int __first, unsigned int __last, bool __x) - { - const _Bit_type __fmask = ~0ul << __first; - const _Bit_type __lmask = ~0ul >> (_S_word_bit - __last); - const _Bit_type __mask = __fmask & __lmask; - - if (__x) - *__v |= __mask; - else - *__v &= ~__mask; - } - - inline void - fill(_Bit_iterator __first, _Bit_iterator __last, const bool& __x) - { - if (__first._M_p != __last._M_p) - { - _Bit_type* __first_p = __first._M_p; - if (__first._M_offset != 0) - __fill_bvector(__first_p++, __first._M_offset, _S_word_bit, __x); - - __builtin_memset(__first_p, __x ? ~0 : 0, - (__last._M_p - __first_p) * sizeof(_Bit_type)); - - if (__last._M_offset != 0) - __fill_bvector(__last._M_p, 0, __last._M_offset, __x); - } - else if (__first._M_offset != __last._M_offset) - __fill_bvector(__first._M_p, __first._M_offset, __last._M_offset, __x); - } - template struct _Bvector_base { @@ -1336,15 +1303,46 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER }; _GLIBCXX_END_NAMESPACE_CONTAINER -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace std -#if __cplusplus >= 201103L + inline void + __fill_bvector(_GLIBCXX_STD_C::_Bit_type * __v, + unsigned int __first, unsigned int __last, bool __x) + { + using _GLIBCXX_STD_C::_Bit_type; + using _GLIBCXX_STD_C::_S_word_bit; + const _Bit_type __fmask = ~0ul << __first; + const _Bit_type __lmask = ~0ul >> (_S_word_bit - __last); + const _Bit_type __mask = __fmask & __lmask; -namespace std _GLIBCXX_VISIBILITY(default) -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION + if (__x) + *__v |= __mask; + else + *__v &= ~__mask; + } + inline void + __fill_a1(_GLIBCXX_STD_C::_Bit_iterator __first, + _GLIBCXX_STD_C::_Bit_iterator __last, const bool& __x) + { + using _GLIBCXX_STD_C::_Bit_type; + using _GLIBCXX_STD_C::_S_word_bit; + if (__first._M_p != __last._M_p) + { + _Bit_type* __first_p = __first._M_p; + if (__first._M_offset != 0) + __fill_bvector(__first_p++, __first._M_offset, _S_word_bit, __x); + + __builtin_memset(__first_p, __x ? ~0 : 0, + (__last._M_p - __first_p) * sizeof(_Bit_type)); + + if (__last._M_offset != 0) + __fill_bvector(__last._M_p, 0, __last._M_offset, __x); + } + else if (__first._M_offset != __last._M_offset) + __fill_bvector(__first._M_p, __first._M_offset, __last._M_offset, __x); + } + +#if __cplusplus >= 201103L // DR 1182. /// std::hash specialization for vector. template @@ -1354,10 +1352,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION size_t operator()(const _GLIBCXX_STD_C::vector&) const noexcept; }; +#endif // C++11 _GLIBCXX_END_NAMESPACE_VERSION -}// namespace std - -#endif // C++11 +} // namespace std #endif diff --git a/libstdc++-v3/testsuite/25_algorithms/fill/bvector/1.cc b/libstdc++-v3/testsuite/25_algorithms/fill/bvector/1.cc new file mode 100644 index 00000000000..22e4fca73b8 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/fill/bvector/1.cc @@ -0,0 +1,39 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +#include + +void test01() +{ + using namespace std; + + vector v1(100, false); + vector v2(100, true); + + fill(v1.begin(), v1.end(), true); + + VERIFY( equal(v1.begin(), v1.end(), v2.begin()) ); +} + +int main() +{ + test01(); + return 0; +}