diff mbox

[v3] Improve std::bitset::all

Message ID 4E60DACE.3070302@oracle.com
State New
Headers show

Commit Message

Paolo Carlini Sept. 2, 2011, 1:31 p.m. UTC
Hi,

tested x86_64-linux multilib, a nice improvement joint work with Marc. 
Mainline only of course.

Thanks,
Paolo.

/////////////////////////
2011-09-02  Paolo Carlini  <paolo.carlini@oracle.com>
	    Marc Glisse  <marc.glisse@normalesup.org>

	* include/std/bitset (_Base_bitset<>::_M_are_all_aux): Remove.
	(_Base_bitset<>::_M_are_all): Add.
	(bitset<>::all): Use the latter, improve implementation.
diff mbox

Patch

Index: include/std/bitset
===================================================================
--- include/std/bitset	(revision 178463)
+++ include/std/bitset	(working copy)
@@ -185,15 +185,17 @@ 
 	return true;
       }
 
-      size_t
-      _M_are_all_aux() const _GLIBCXX_NOEXCEPT
-      {
-	for (size_t __i = 0; __i < _Nw - 1; __i++)
-	  if (_M_w[__i] != ~static_cast<_WordT>(0))
-	    return 0;
-	return ((_Nw - 1) * _GLIBCXX_BITSET_BITS_PER_WORD
-		+ __builtin_popcountl(_M_hiword()));
-      }
+      template<size_t _Nb>
+        bool
+        _M_are_all() const _GLIBCXX_NOEXCEPT
+        {
+	  for (size_t __i = 0; __i < _Nw - 1; __i++)
+	    if (_M_w[__i] != ~static_cast<_WordT>(0))
+	      return false;
+	  return _M_hiword() == (~static_cast<_WordT>(0)
+				 >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD
+				     - _Nb));
+	}
 
       bool
       _M_is_any() const _GLIBCXX_NOEXCEPT
@@ -460,9 +462,11 @@ 
       _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT
       { return _M_w == __x._M_w; }
 
-      size_t
-      _M_are_all_aux() const _GLIBCXX_NOEXCEPT
-      { return __builtin_popcountl(_M_w); }
+      template<size_t _Nb>
+        bool
+        _M_are_all() const _GLIBCXX_NOEXCEPT
+        { return _M_w == (~static_cast<_WordT>(0)
+			  >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); }
 
       bool
       _M_is_any() const _GLIBCXX_NOEXCEPT
@@ -605,9 +609,10 @@ 
       _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT
       { return true; }
 
-      size_t
-      _M_are_all_aux() const _GLIBCXX_NOEXCEPT
-      { return 0; }
+      template<size_t _Nb>
+        bool
+        _M_are_all() const _GLIBCXX_NOEXCEPT
+        { return true; }
 
       bool
       _M_is_any() const _GLIBCXX_NOEXCEPT
@@ -1312,7 +1317,7 @@ 
        */
       bool
       all() const _GLIBCXX_NOEXCEPT
-      { return this->_M_are_all_aux() == _Nb; }
+      { return this->template _M_are_all<_Nb>(); }
 
       /**
        *  @brief Tests whether any of the bits are on.