]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Optimize filesystem::path::parent_path()
authorJonathan Wakely <jwakely@redhat.com>
Fri, 14 Jun 2019 18:11:17 +0000 (19:11 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 14 Jun 2019 18:11:17 +0000 (19:11 +0100)
Parsing a complete string is more efficient than appending each
component one-by-one.

Backport from mainline
2019-05-29  Jonathan Wakely  <jwakely@redhat.com>

* src/c++17/fs_path.cc (path::parent_path()): Create whole path at
once instead of building it iteratively.

From-SVN: r272303

libstdc++-v3/ChangeLog
libstdc++-v3/src/c++17/fs_path.cc

index 7b46e22eca02954810c1d4c60164610b97aff0a5..d4cb3be5e2997c158a7243301aadc74ce005ee8b 100644 (file)
@@ -1,3 +1,11 @@
+2019-06-14  Jonathan Wakely  <jwakely@redhat.com>
+
+       Backport from mainline
+       2019-05-29  Jonathan Wakely  <jwakely@redhat.com>
+
+       * src/c++17/fs_path.cc (path::parent_path()): Create whole path at
+       once instead of building it iteratively.
+
 2019-06-14  Jonathan Wakely  <jwakely@redhat.com>
 
        Backport from mainline
index 8e01bf510d3edf847c4a22f444211f58e5b76010..c438ddc61fd839030b2802e5ec9d7d08a39be68d 100644 (file)
@@ -1523,11 +1523,9 @@ path::parent_path() const
     __ret = *this;
   else if (_M_cmpts.size() >= 2)
     {
-      for (auto __it = _M_cmpts.begin(), __end = std::prev(_M_cmpts.end());
-          __it != __end; ++__it)
-       {
-         __ret /= *__it;
-       }
+      const auto parent = std::prev(_M_cmpts.end(), 2);
+      const auto len = parent->_M_pos + parent->_M_pathname.length();
+      __ret.assign(_M_pathname.substr(0, len));
     }
   return __ret;
 }