re PR libstdc++/48760 (std::complex constructor buggy in the face of NaN's)
[gcc.git] / libstdc++-v3 / include / parallel / multiway_mergesort.h
index f2bb6fbc30dfe640597fed26906457ebd0987da1..80267f923b5554a4f54fae70c8fdd42a4f2060af 100644 (file)
@@ -1,6 +1,6 @@
 // -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009, 2010, 2011 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
@@ -105,8 +105,8 @@ namespace __gnu_parallel
 
       _DifferenceType* __es = new _DifferenceType[__num_samples + 2];
 
-      equally_split(__sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam], 
-                   __num_samples + 1, __es);
+      __equally_split(__sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam], 
+                     __num_samples + 1, __es);
 
       for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
        ::new(&(__sd->_M_samples[__iam * __num_samples + __i]))
@@ -154,7 +154,7 @@ namespace __gnu_parallel
                             __sd->_M_starts[__iam + 1], __offsets.begin(),
                             __comp);
 
-       for (int __seq = 0; __seq < __sd->_M_num_threads; __seq++)
+       for (_ThreadIndex __seq = 0; __seq < __sd->_M_num_threads; __seq++)
          {
            // for each sequence
            if (__iam < (__sd->_M_num_threads - 1))
@@ -361,7 +361,7 @@ namespace __gnu_parallel
         _SeqVector;
       _SeqVector __seqs(__sd->_M_num_threads);
 
-      for (int __s = 0; __s < __sd->_M_num_threads; ++__s)
+      for (_ThreadIndex __s = 0; __s < __sd->_M_num_threads; ++__s)
        {
          __seqs[__s] =
            std::make_pair(__sd->_M_temporary[__s]
@@ -378,6 +378,8 @@ namespace __gnu_parallel
 
 #     pragma omp barrier
 
+      for (_DifferenceType __i = 0; __i < __length_local; ++__i)
+       __sd->_M_temporary[__iam][__i].~_ValueType();
       ::operator delete(__sd->_M_temporary[__iam]);
     }
 
@@ -413,6 +415,7 @@ namespace __gnu_parallel
       // shared variables
       _PMWMSSortingData<_RAIter> __sd;
       _DifferenceType* __starts;
+      _DifferenceType __size;
 
 #     pragma omp parallel num_threads(__num_threads)
       {
@@ -427,26 +430,26 @@ namespace __gnu_parallel
 
          if (!__exact)
            {
-             _DifferenceType __size =
+             __size =
                (_Settings::get().sort_mwms_oversampling * __num_threads - 1)
                * __num_threads;
              __sd._M_samples = static_cast<_ValueType*>
                (::operator new(__size * sizeof(_ValueType)));
            }
          else
-           __sd._M_samples = NULL;
+           __sd._M_samples = 0;
 
          __sd._M_offsets = new _DifferenceType[__num_threads - 1];
          __sd._M_pieces
            = new std::vector<_Piece<_DifferenceType> >[__num_threads];
-         for (int __s = 0; __s < __num_threads; ++__s)
+         for (_ThreadIndex __s = 0; __s < __num_threads; ++__s)
            __sd._M_pieces[__s].resize(__num_threads);
          __starts = __sd._M_starts = new _DifferenceType[__num_threads + 1];
 
          _DifferenceType __chunk_length = __n / __num_threads;
          _DifferenceType __split = __n % __num_threads;
          _DifferenceType __pos = 0;
-         for (int __i = 0; __i < __num_threads; ++__i)
+         for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
            {
              __starts[__i] = __pos;
              __pos += ((__i < __split)
@@ -463,7 +466,11 @@ namespace __gnu_parallel
       delete[] __sd._M_temporary;
 
       if (!__exact)
-       ::operator delete(__sd._M_samples);
+       {
+         for (_DifferenceType __i = 0; __i < __size; ++__i)
+           __sd._M_samples[__i].~_ValueType();
+         ::operator delete(__sd._M_samples);
+       }
 
       delete[] __sd._M_offsets;
       delete[] __sd._M_pieces;