fs_path.h (path::_List): Use vector instead of list.
* 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. From-SVN: r222702
This commit is contained in:
parent
d532ea9181
commit
a00d74c490
5 changed files with 61 additions and 17 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
|
@ -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,7 +202,7 @@ path::parent_path() const
|
|||
path __ret;
|
||||
if (_M_cmpts.size() < 2)
|
||||
return __ret;
|
||||
for (auto __it = _M_cmpts.begin(), __end = --_M_cmpts.end();
|
||||
for (auto __it = _M_cmpts.begin(), __end = std::prev(_M_cmpts.end());
|
||||
__it != __end; ++__it)
|
||||
{
|
||||
__ret /= *__it;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue