From 72a54e5e8157508c87594d1a6b53de90b76524ce Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fran=C3=A7ois=20Dumont?= Date: Tue, 4 Feb 2020 19:07:06 +0100 Subject: [PATCH] libstdc++ std::fill overload for std::vector::iterator Extend the overload so that it is used even when _GLIBCXX_DEBUG mode is activated. * include/bits/stl_algobase.h (struct _Bit_iterator): New declaration. (std::__fill_a1(_Bit_iterator, _Bit_iterator, const bool&)): Likewise. * include/bits/stl_bvector.h (__fill_bvector): Move outside _GLIBCXX_STD_C namespace. (fill(_Bit_iterator, _Bit_iterator, const bool&)): Likewise and rename into... (__fill_a1): ...this. * testsuite/25_algorithms/fill/bvector/1.cc: New. --- libstdc++-v3/ChangeLog | 11 +++ libstdc++-v3/include/bits/stl_algobase.h | 20 +++-- libstdc++-v3/include/bits/stl_bvector.h | 81 +++++++++---------- .../testsuite/25_algorithms/fill/bvector/1.cc | 39 +++++++++ 4 files changed, 102 insertions(+), 49 deletions(-) create mode 100644 libstdc++-v3/testsuite/25_algorithms/fill/bvector/1.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 990af969b4b..76b6e3fe45f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2020-05-06 François Dumont + + * include/bits/stl_algobase.h (struct _Bit_iterator): New declaration. + (std::__fill_a1(_Bit_iterator, _Bit_iterator, const bool&)): Likewise. + * include/bits/stl_bvector.h (__fill_bvector): Move outside + _GLIBCXX_STD_C namespace. + (fill(_Bit_iterator, _Bit_iterator, const bool&)): Likewise and rename + into... + (__fill_a1): ...this. + * testsuite/25_algorithms/fill/bvector/1.cc: New. + 2020-05-06 H.J. Lu * config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt: Updated. diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index bed61fd9d00..089ec2903f6 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -428,6 +428,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } }; +_GLIBCXX_BEGIN_NAMESPACE_CONTAINER + + template + struct _Deque_iterator; + + struct _Bit_iterator; + +_GLIBCXX_END_NAMESPACE_CONTAINER + // Helpers for streambuf iterators (either istream or ostream). // NB: avoid including , relatively large. template @@ -472,13 +481,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Category>::__copy_m(__first, __last, __result); } -_GLIBCXX_BEGIN_NAMESPACE_CONTAINER - - template - struct _Deque_iterator; - -_GLIBCXX_END_NAMESPACE_CONTAINER - template _OI @@ -907,6 +909,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; +} -- 2.30.2