summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-01 19:47:55 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-01 19:47:55 +0000
commitd1eff9deca0ca0dfd0f1482ff1dab5970c49d9d7 (patch)
tree27fc9999afd8c9cdf4340b529b60b1eb0e1e7216 /libstdc++-v3
parent88e33e1262ad18df484a9ba29eec468279461bf0 (diff)
downloadgcc-d1eff9deca0ca0dfd0f1482ff1dab5970c49d9d7.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222702 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/experimental/fs_path.h4
-rw-r--r--libstdc++-v3/python/libstdcxx/v6/printers.py53
-rw-r--r--libstdc++-v3/src/filesystem/path.cc11
-rw-r--r--libstdc++-v3/testsuite/experimental/filesystem/path/decompose/parent_path.cc2
5 files changed, 61 insertions, 17 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 5428727a198..8d559eb0975 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,13 @@
2015-05-01 Jonathan Wakely <jwakely@redhat.com>
+ * 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.
+
* include/experimental/fs_dir.h: Fix use of non-reserved names.
* include/experimental/fs_ops.h: Likewise.
* include/experimental/fs_path.h: Likewise.
diff --git a/libstdc++-v3/include/experimental/fs_path.h b/libstdc++-v3/include/experimental/fs_path.h
index 11b05616150..e57a08bb35d 100644
--- a/libstdc++-v3/include/experimental/fs_path.h
+++ b/libstdc++-v3/include/experimental/fs_path.h
@@ -36,7 +36,7 @@
#include <utility>
#include <type_traits>
-#include <list>
+#include <vector>
#include <locale>
#include <iosfwd>
#include <codecvt>
@@ -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 37c3b9bf297..c6f96d737a4 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 db58f3bdb70..cc5780f1e14 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 2c21f6ff699..41df1bfb59c 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)
{