@@ -144,6 +144,7 @@ template <size_t N> struct hash<std::bitset<N>>;
144144# include < __cstddef/ptrdiff_t.h>
145145# include < __cstddef/size_t.h>
146146# include < __functional/hash.h>
147+ # include < __functional/identity.h>
147148# include < __functional/unary_function.h>
148149# include < __type_traits/is_char_like_type.h>
149150# include < climits>
@@ -226,8 +227,10 @@ protected:
226227 return to_ullong (integral_constant < bool , _Size< sizeof (unsigned long long ) * CHAR_BIT>());
227228 }
228229
229- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool all () const _NOEXCEPT;
230- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool any () const _NOEXCEPT;
230+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool all () const _NOEXCEPT { return !__scan_bits (__bit_not ()); }
231+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool any () const _NOEXCEPT {
232+ return __scan_bits (std::__identity ());
233+ }
231234 _LIBCPP_HIDE_FROM_ABI size_t __hash_code () const _NOEXCEPT;
232235
233236 template <bool _Sparse, class _CharT , class _Traits , class _Allocator >
@@ -246,6 +249,12 @@ protected:
246249 }
247250
248251private:
252+ struct __bit_not {
253+ template <class _Tp >
254+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp operator ()(const _Tp& __x) const _NOEXCEPT {
255+ return ~__x;
256+ }
257+ };
249258# ifdef _LIBCPP_CXX03_LANG
250259 void __init (unsigned long long __v, false_type) _NOEXCEPT;
251260 _LIBCPP_HIDE_FROM_ABI void __init (unsigned long long __v, true_type) _NOEXCEPT;
@@ -256,6 +265,23 @@ private:
256265 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong (true_type) const ;
257266 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong (true_type, false_type) const ;
258267 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong (true_type, true_type) const ;
268+
269+ template <typename _Proj>
270+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool __scan_bits (_Proj __proj) const _NOEXCEPT {
271+ size_t __n = _Size;
272+ __const_storage_pointer __p = __first_;
273+ // do middle whole words
274+ for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
275+ if (__proj (*__p))
276+ return true ;
277+ // do last partial word
278+ if (__n > 0 ) {
279+ __storage_type __m = ~__storage_type (0 ) >> (__bits_per_word - __n);
280+ if (__proj (*__p) & __m)
281+ return true ;
282+ }
283+ return false ;
284+ }
259285};
260286
261287template <size_t _N_words, size_t _Size>
@@ -395,40 +421,6 @@ __bitset<_N_words, _Size>::to_ullong(true_type, true_type) const {
395421 return __r;
396422}
397423
398- template <size_t _N_words, size_t _Size>
399- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool __bitset<_N_words, _Size>::all() const _NOEXCEPT {
400- // do middle whole words
401- size_t __n = _Size;
402- __const_storage_pointer __p = __first_;
403- for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
404- if (~*__p)
405- return false ;
406- // do last partial word
407- if (__n > 0 ) {
408- __storage_type __m = ~__storage_type (0 ) >> (__bits_per_word - __n);
409- if (~*__p & __m)
410- return false ;
411- }
412- return true ;
413- }
414-
415- template <size_t _N_words, size_t _Size>
416- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool __bitset<_N_words, _Size>::any() const _NOEXCEPT {
417- // do middle whole words
418- size_t __n = _Size;
419- __const_storage_pointer __p = __first_;
420- for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
421- if (*__p)
422- return true ;
423- // do last partial word
424- if (__n > 0 ) {
425- __storage_type __m = ~__storage_type (0 ) >> (__bits_per_word - __n);
426- if (*__p & __m)
427- return true ;
428- }
429- return false ;
430- }
431-
432424template <size_t _N_words, size_t _Size>
433425inline size_t __bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT {
434426 size_t __h = 0 ;
@@ -744,8 +736,8 @@ public:
744736 _LIBCPP_HIDE_FROM_ABI bool operator !=(const bitset& __rhs) const _NOEXCEPT;
745737# endif
746738 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool test (size_t __pos) const ;
747- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool all () const _NOEXCEPT;
748- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool any () const _NOEXCEPT;
739+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool all () const _NOEXCEPT { return __base::all (); }
740+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool any () const _NOEXCEPT { return __base::any (); }
749741 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool none () const _NOEXCEPT { return !any (); }
750742 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bitset operator <<(size_t __pos) const _NOEXCEPT;
751743 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bitset operator >>(size_t __pos) const _NOEXCEPT;
@@ -930,16 +922,6 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool bitset<_Size>::test(siz
930922 return (*this )[__pos];
931923}
932924
933- template <size_t _Size>
934- inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool bitset<_Size>::all() const _NOEXCEPT {
935- return __base::all ();
936- }
937-
938- template <size_t _Size>
939- inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool bitset<_Size>::any() const _NOEXCEPT {
940- return __base::any ();
941- }
942-
943925template <size_t _Size>
944926inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bitset<_Size>
945927bitset<_Size>::operator <<(size_t __pos) const _NOEXCEPT {
0 commit comments