Optimize filesystem::path::parent_path()
authorJonathan Wakely <jwakely@redhat.com>
Wed, 29 May 2019 22:00:45 +0000 (23:00 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 29 May 2019 22:00:45 +0000 (23:00 +0100)
Parsing a complete string is more efficient than appending each
component one-by-one.

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

From-SVN: r271754

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

index b209460b21f66a5f50cea827410bf4a84b9b69f2..b6b7a056b33e898dc171388f76dbc37ade57aa1c 100644 (file)
@@ -1,5 +1,8 @@
 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.
+
        * testsuite/util/testsuite_api.h: Remove names of unused parameters.
 
        PR libstdc++/85494 use rdseed and rand_s in std::random_device
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;
 }