commit 44990ad8ae2cafab954b9e64556fc2ca0db97d7e Author: Jonathan Wakely Date: Fri May 1 13:41:42 2015 +0100 * include/experimental/fs_path.h (path::_List): Use vector instead of list. * python/libstdcxx/v6/printers.py (StdExpPathPrinter): Adapt. * src/filesystem/path.cc: Use std::prev instead of decrementing rvalues. Fix whitespace. * testsuite/experimental/filesystem/path/decompose/parent_path.cc: Do not decrement iterators before begin. diff --git a/libstdc++-v3/include/experimental/fs_path.h b/libstdc++-v3/include/experimental/fs_path.h index 11b0561..e57a08b 100644 --- a/libstdc++-v3/include/experimental/fs_path.h +++ b/libstdc++-v3/include/experimental/fs_path.h @@ -36,7 +36,7 @@ #include #include -#include +#include #include #include #include @@ -430,7 +430,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 string_type _M_pathname; struct _Cmpt; - using _List = std::list<_Cmpt>; + using _List = _GLIBCXX_STD_C::vector<_Cmpt>; _List _M_cmpts; // empty unless _M_type == _Type::_Multi _Type _M_type = _Type::_Multi; }; diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index 37c3b9b..c6f96d7 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -984,16 +984,51 @@ class StdExpPathPrinter: def __init__ (self, typename, val): self.val = val - self.list_visualizer = gdb.default_visualizer(val['_M_cmpts']) + start = self.val['_M_cmpts']['_M_impl']['_M_start'] + finish = self.val['_M_cmpts']['_M_impl']['_M_finish'] + self.num_cmpts = int (finish - start) + + def _path_type(self): + t = str(self.val['_M_type']) + if t[-9:] == '_Root_dir': + return "root-directory" + if t[-10:] == '_Root_name': + return "root-name" + return None def to_string (self): - path = self.val ['_M_pathname'] - if self.list_visualizer: - list_head = self.val['_M_cmpts']['_M_impl']['_M_node'] - if list_head.address != list_head['_M_next']: - cmpts = self.list_visualizer.to_string() - path = "%s [Components %s]" % (path, cmpts) - return path + path = "%s" % self.val ['_M_pathname'] + if self.num_cmpts == 0: + t = self._path_type() + if t: + path = '%s [%s]' % (path, t) + return "filesystem::path %s" % path + + class _iterator(Iterator): + def __init__(self, cmpts): + self.item = cmpts['_M_impl']['_M_start'] + self.finish = cmpts['_M_impl']['_M_finish'] + self.count = 0 + + def __iter__(self): + return self + + def __next__(self): + if self.item == self.finish: + raise StopIteration + item = self.item.dereference() + count = self.count + self.count = self.count + 1 + self.item = self.item + 1 + path = item['_M_pathname'] + t = StdExpPathPrinter(item.type.name, item)._path_type() + if not t: + t = count + return ('[%s]' % t, path) + + def children(self): + return self._iterator(self.val['_M_cmpts']) + # A "regular expression" printer which conforms to the # "SubPrettyPrinter" protocol from gdb.printing. @@ -1383,7 +1418,7 @@ def build_libstdcxx_dictionary (): # Filesystem TS components libstdcxx_printer.add_version('std::experimental::filesystem::v1::', 'path', StdExpPathPrinter) - libstdcxx_printer.add_version('std::experimental::filesystem::v1::__cxx11', + libstdcxx_printer.add_version('std::experimental::filesystem::v1::__cxx11::', 'path', StdExpPathPrinter) # Extensions. diff --git a/libstdc++-v3/src/filesystem/path.cc b/libstdc++-v3/src/filesystem/path.cc index db58f3b..cc5780f 100644 --- a/libstdc++-v3/src/filesystem/path.cc +++ b/libstdc++-v3/src/filesystem/path.cc @@ -35,7 +35,7 @@ path::remove_filename() { if (!_M_cmpts.empty()) { - auto cmpt = --_M_cmpts.end(); + auto cmpt = std::prev(_M_cmpts.end()); _M_pathname.erase(cmpt->_M_pos); _M_cmpts.erase(cmpt); _M_trim(); @@ -109,7 +109,7 @@ path::compare(const path& p) const noexcept { if (_M_type == _Type::_Multi && p._M_type == _Type::_Multi) return do_compare(_M_cmpts.begin(), _M_cmpts.end(), - p._M_cmpts.begin(), p._M_cmpts.end()); + p._M_cmpts.begin(), p._M_cmpts.end()); else if (_M_type == _Type::_Multi) { _Cmpt c[1] = { { p._M_pathname, p._M_type, 0 } }; @@ -130,8 +130,7 @@ path::root_name() const path __ret; if (_M_type == _Type::_Root_name) __ret = *this; - else if (_M_cmpts.size() - && _M_cmpts.begin()->_M_type == _Type::_Root_name) + else if (_M_cmpts.size() && _M_cmpts.begin()->_M_type == _Type::_Root_name) __ret = *_M_cmpts.begin(); return __ret; } @@ -203,8 +202,8 @@ path::parent_path() const path __ret; if (_M_cmpts.size() < 2) return __ret; - for (auto __it = _M_cmpts.begin(), __end = --_M_cmpts.end(); - __it != __end; ++__it) + for (auto __it = _M_cmpts.begin(), __end = std::prev(_M_cmpts.end()); + __it != __end; ++__it) { __ret /= *__it; } diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/decompose/parent_path.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/decompose/parent_path.cc index 2c21f6f..41df1bf 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/path/decompose/parent_path.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/decompose/parent_path.cc @@ -44,6 +44,8 @@ test02() { for (const path& p : __gnu_test::test_paths) { + if (p.begin() == p.end()) + continue; path pp; for (auto i = p.begin(), end = --p.end(); i != end; ++i) {