re PR libstdc++/48760 (std::complex constructor buggy in the face of NaN's)
[gcc.git] / libstdc++-v3 / include / parallel / losertree.h
index 425cf6d4b6f253a744d5d5cdebf9bf12071ae854..306fcd8856fa941252c5f374598e2a79e6657bd9 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
@@ -32,9 +32,8 @@
 #ifndef _GLIBCXX_PARALLEL_LOSERTREE_H
 #define _GLIBCXX_PARALLEL_LOSERTREE_H 1
 
-#include <functional>
-
 #include <bits/stl_algobase.h>
+#include <bits/stl_function.h>
 #include <parallel/features.h>
 #include <parallel/base.h>
 
@@ -117,7 +116,11 @@ namespace __gnu_parallel
        * @brief The destructor.
        */
       ~_LoserTreeBase()
-      { ::operator delete(_M_losers); }
+      {
+       for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
+         _M_losers[__i].~_Loser();
+       ::operator delete(_M_losers);
+      }
 
       /**
        * @brief Initializes the sequence "_M_source" with the element "__key".
@@ -132,15 +135,15 @@ namespace __gnu_parallel
       {
        unsigned int __pos = _M_k + __source;
 
-       if(_M_first_insert)
+       if (_M_first_insert)
          {
-           // Construct all keys, so we can easily deconstruct them.
+           // Construct all keys, so we can easily destruct them.
            for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
              new(&(_M_losers[__i]._M_key)) _Tp(__key);
            _M_first_insert = false;
          }
        else
-         new(&(_M_losers[__pos]._M_key)) _Tp(__key);
+         _M_losers[__pos]._M_key = __key;
 
        _M_losers[__pos]._M_sup = __sup;
        _M_losers[__pos]._M_source = __source;
@@ -217,6 +220,7 @@ namespace __gnu_parallel
       void
       __delete_min_insert(_Tp __key, bool __sup)
       {
+        using std::swap;
 #if _GLIBCXX_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -237,7 +241,7 @@ namespace __gnu_parallel
                // The other one is smaller.
                std::swap(_M_losers[__pos]._M_sup, __sup);
                std::swap(_M_losers[__pos]._M_source, __source);
-               std::swap(_M_losers[__pos]._M_key, __key);
+               swap(_M_losers[__pos]._M_key, __key);
              }
          }
 
@@ -317,6 +321,7 @@ namespace __gnu_parallel
       void
       __delete_min_insert(_Tp __key, bool __sup)
       {
+        using std::swap;
 #if _GLIBCXX_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -333,7 +338,7 @@ namespace __gnu_parallel
                // The other one is smaller.
                std::swap(_M_losers[__pos]._M_sup, __sup);
                std::swap(_M_losers[__pos]._M_source, __source);
-               std::swap(_M_losers[__pos]._M_key, __key);
+               swap(_M_losers[__pos]._M_key, __key);
              }
          }
 
@@ -378,7 +383,7 @@ namespace __gnu_parallel
       }
 
       ~_LoserTreePointerBase()
-      { ::operator delete[](_M_losers); }
+      { delete[] _M_losers; }
 
       int __get_min_source()
       { return _M_losers[0]._M_source; }
@@ -591,13 +596,17 @@ namespace __gnu_parallel
 
        for (unsigned int __i = _M_k + _M_ik - 1; __i < (2 * _M_k); ++__i)
          {
-           _M_losers[__i]._M_key = __sentinel;
+           ::new(&(_M_losers[__i]._M_key)) _Tp(__sentinel);
            _M_losers[__i]._M_source = -1;
          }
       }
 
       ~_LoserTreeUnguardedBase()
-      { ::operator delete(_M_losers); }
+      {
+       for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
+         _M_losers[__i].~_Loser();
+       ::operator delete(_M_losers);
+      }
 
       int
       __get_min_source()
@@ -614,7 +623,7 @@ namespace __gnu_parallel
       {
        unsigned int __pos = _M_k + __source;
 
-       new(&(_M_losers[__pos]._M_key)) _Tp(__key);
+       ::new(&(_M_losers[__pos]._M_key)) _Tp(__key);
        _M_losers[__pos]._M_source = __source;
       }
     };
@@ -680,6 +689,7 @@ namespace __gnu_parallel
       void
       __delete_min_insert(_Tp __key, bool)
       {
+        using std::swap;
 #if _GLIBCXX_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -696,7 +706,7 @@ namespace __gnu_parallel
              {
                // The other one is smaller.
                std::swap(_M_losers[__pos]._M_source, __source);
-               std::swap(_M_losers[__pos]._M_key, __key);
+               swap(_M_losers[__pos]._M_key, __key);
              }
          }
 
@@ -773,6 +783,7 @@ namespace __gnu_parallel
       void
       __delete_min_insert(_Tp __key, bool)
       {
+        using std::swap;
 #if _GLIBCXX_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -787,7 +798,7 @@ namespace __gnu_parallel
              {
                // The other one is smaller.
                std::swap(_M_losers[__pos]._M_source, __source);
-               std::swap(_M_losers[__pos]._M_key, __key);
+               swap(_M_losers[__pos]._M_key, __key);
              }
          }