stl_algo.h (__lg<>(_Size)): Slightly tweak.
authorPaolo Carlini <pcarlini@suse.de>
Thu, 25 Oct 2007 10:11:58 +0000 (10:11 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 25 Oct 2007 10:11:58 +0000 (10:11 +0000)
2007-10-25  Paolo Carlini  <pcarlini@suse.de>

* include/bits/stl_algo.h (__lg<>(_Size)): Slightly tweak.
(__lg(int), __lg(long), __lg(long long)): Add, overloads
exploiting __builtin_clz*.

From-SVN: r129624

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algo.h

index 3616d367d6af58a1272aad0eda41695ffb654748..fabbe8ace7a486b1e6825d5f8ff1ff123678ede9 100644 (file)
@@ -1,3 +1,9 @@
+2007-10-25  Paolo Carlini  <pcarlini@suse.de>
+
+       * include/bits/stl_algo.h (__lg<>(_Size)): Slightly tweak.
+       (__lg(int), __lg(long), __lg(long long)): Add, overloads
+       exploiting __builtin_clz*.
+
 2007-10-24  Paolo Carlini  <pcarlini@suse.de>
 
        * include/tr1_impl/array (_M_instance): Align naturally.
index dd6d7f338c430994f94f39f6dacc1892b7b0b651..d254ec6dc6ec395acac8c7deec3192424a7c05d5 100644 (file)
@@ -2085,7 +2085,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 
   /**
    *  @if maint
-   *  This is a helper function for the sort routines.
+   *  This is a helper function for the sort routines.  Precondition: __n > 0.
    *  @endif
   */
   template<typename _Size>
@@ -2093,11 +2093,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     __lg(_Size __n)
     {
       _Size __k;
-      for (__k = 0; __n != 1; __n >>= 1)
+      for (__k = 0; __n != 0; __n >>= 1)
        ++__k;
-      return __k;
+      return __k - 1;
     }
 
+  inline int
+  __lg(int __n)
+  { return sizeof(int) * __CHAR_BIT__  - 1 - __builtin_clz(__n); }
+
+  inline long
+  __lg(long __n)
+  { return sizeof(long) * __CHAR_BIT__ - 1 - __builtin_clzl(__n); }
+
+  inline long long
+  __lg(long long __n)
+  { return sizeof(long long) * __CHAR_BIT__ - 1 - __builtin_clzll(__n); }
+
   // sort
 
   template<typename _RandomAccessIterator, typename _Size>