]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/30416 (continued)
authorPaolo Carlini <pcarlini@suse.de>
Fri, 12 Jan 2007 13:34:47 +0000 (13:34 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 12 Jan 2007 13:34:47 +0000 (13:34 +0000)
2007-01-12  Paolo Carlini  <pcarlini@suse.de>

PR libstdc++/30416 (continued)
* include/std/valarray (valarray<>::shift, valarray<>::cshift):
Allways return the same variable, thus facilitating NRVO.

From-SVN: r120722

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/valarray

index 6bfbcc1db401b1b939f2456d741f66fc43840d83..4efc40cda95d7d07cd7c170940263802935e31bc 100644 (file)
@@ -1,3 +1,9 @@
+2007-01-12  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/30416 (continued)
+       * include/std/valarray (valarray<>::shift, valarray<>::cshift):
+       Allways return the same variable, thus facilitating NRVO.
+
 2007-01-12  Paolo Carlini  <pcarlini@suse.de>
 
        PR libstdc++/30416
index 95f27012eaf7792cf396de014338c31c5f16e773..6c828b685173220429d072b4728249bf8598928e 100644 (file)
@@ -782,14 +782,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
      inline valarray<_Tp>
      valarray<_Tp>::shift(int __n) const
      {
-       if (_M_size == 0 || __n == 0)
-        return *this;
-     
        valarray<_Tp> __ret;
+
+       if (_M_size == 0)
+        return __ret;
+
        _Tp* __restrict__ __tmp_M_data =
         std::__valarray_get_storage<_Tp>(_M_size);
 
-       if (__n > 0)      // shift left
+       if (__n == 0)
+        std::__valarray_copy_construct(_M_data,
+                                       _M_data + _M_size, __tmp_M_data);
+       else if (__n > 0)      // shift left
         {
           if (size_t(__n) > _M_size)
             __n = _M_size;
@@ -799,7 +803,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
           std::__valarray_default_construct(__tmp_M_data + _M_size - __n,
                                             __tmp_M_data + _M_size);
         }
-       else              // shift right
+       else                   // shift right
         {
           if (size_t(-__n) > _M_size)
             __n = -_M_size;
@@ -819,14 +823,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
      inline valarray<_Tp>
      valarray<_Tp>::cshift(int __n) const
      {
-       if (_M_size == 0 || __n == 0)
-        return *this;
-
        valarray<_Tp> __ret;
+
+       if (_M_size == 0)
+        return __ret;
+
        _Tp* __restrict__ __tmp_M_data =
         std::__valarray_get_storage<_Tp>(_M_size);
-       
-       if (__n > 0)      // cshift left
+
+       if (__n == 0)
+        std::__valarray_copy_construct(_M_data,
+                                       _M_data + _M_size, __tmp_M_data);
+       else if (__n > 0)      // cshift left
         {
           if (size_t(__n) > _M_size)
             __n = __n % _M_size;
@@ -836,7 +844,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
           std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size,
                                          __tmp_M_data);
         }
-       else              // cshift right
+       else                   // cshift right
         {
           if (size_t(-__n) > _M_size)
             __n = -(-__n % _M_size);