]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/include/parallel/random_shuffle.h
Licensing changes to GPLv3 resp. GPLv3 with GCC Runtime Exception.
[thirdparty/gcc.git] / libstdc++-v3 / include / parallel / random_shuffle.h
index 75d9e18d23af3d9f7a45c76c69584ca253d8609d..6e0ebef1523e8dab39d924418e4e99ec97c23f82 100644 (file)
@@ -1,11 +1,11 @@
 // -*- C++ -*-
 
-// Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009 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 2, or (at your option) any later
+// Foundation; either version 3, or (at your option) any later
 // version.
 
 // This library is distributed in the hope that it will be useful, but
 // 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 COPYING.  If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
-// MA 02111-1307, USA.
-
-// As a special exception, you may use this file as part of a free
-// software library without restriction.  Specifically, if other files
-// instantiate templates or use macros or inline functions from this
-// file, or you compile this file and link it with other files to
-// produce an executable, this file does not by itself cause the
-// resulting executable to be covered by the GNU General Public
-// License.  This exception does not however invalidate any other
-// reasons why the executable file might be covered by the GNU General
-// Public License.
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
 
 /** @file parallel/random_shuffle.h
  *  @brief Parallel implementation of std::random_shuffle().
@@ -249,7 +243,7 @@ template<typename T>
     if (x <= 1)
       return 1;
     else
-      return (T)1 << (log2(x - 1) + 1);
+      return (T)1 << (__log2(x - 1) + 1);
   }
 
 /** @brief Main parallel random shuffle step.
@@ -333,6 +327,7 @@ template<typename RandomAccessIterator, typename RandomNumberGenerator>
 
 #   pragma omp parallel num_threads(num_threads)
       {
+        thread_index_t num_threads = omp_get_num_threads();
 #       pragma omp single
           {
             pus = new DRSSorterPU<RandomAccessIterator, random_number>
@@ -351,7 +346,7 @@ template<typename RandomAccessIterator, typename RandomNumberGenerator>
             starts = sd.starts = new difference_type[num_threads + 1];
             int bin_cursor = 0;
             sd.num_bins = num_bins;
-            sd.num_bits = log2(num_bins);
+            sd.num_bits = __log2(num_bins);
 
             difference_type chunk_length = n / num_threads,
                             split = n % num_threads, start = 0;
@@ -375,9 +370,9 @@ template<typename RandomAccessIterator, typename RandomNumberGenerator>
               }
             starts[num_threads] = start;
           } //single
-      // Now shuffle in parallel.
-      parallel_random_shuffle_drs_pu(pus);
-    }
+        // Now shuffle in parallel.
+        parallel_random_shuffle_drs_pu(pus);
+      }  // parallel
 
     delete[] starts;
     delete[] sd.bin_proc;
@@ -449,7 +444,7 @@ template<typename RandomAccessIterator, typename RandomNumberGenerator>
       }
 #endif
 
-    int num_bits = log2(num_bins);
+    int num_bits = __log2(num_bins);
 
     if (num_bins > 1)
       {
@@ -490,6 +485,9 @@ template<typename RandomAccessIterator, typename RandomNumberGenerator>
                                       rng);
           }
 
+        // Copy elements back.
+        std::copy(target, target + n, begin);
+
         delete[] dist0;
         delete[] dist1;
         delete[] oracles;
@@ -518,4 +516,4 @@ template<typename RandomAccessIterator, typename RandomNumberGenerator>
 
 }
 
-#endif
+#endif /* _GLIBCXX_PARALLEL_RANDOM_SHUFFLE_H */