aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-04-05 17:56:31 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2019-04-05 17:56:31 +0100
commitdd4a309e05dc2ccde33e8e639aa063dc0c3b176f (patch)
treefcb73eaf3b2bdb495b2dcd5d39e0b1e79f9ab829
parent67087c7e53b64dc58a2440903275bd0b9db110df (diff)
downloadgcc-dd4a309e05dc2ccde33e8e639aa063dc0c3b176f.zip
gcc-dd4a309e05dc2ccde33e8e639aa063dc0c3b176f.tar.gz
gcc-dd4a309e05dc2ccde33e8e639aa063dc0c3b176f.tar.bz2
Use hidden friends for directory iterator comparisons
The equality operators for directory iterators are not explicitly specified in the standard, they're only required to meet the iterator requirements. This means we don't need to declare them at namespace scope and can implement them as hidden friends. Also add 'noexcept' to directory_iterator's dereference operators. * include/bits/fs_dir.h (directory_iterator::operator*) (directory_iterator::operator->): Add noexcept. (operator==, operator!=): Replace namespace-scope equality operators for directory iterators with hidden friends. From-SVN: r270175
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/include/bits/fs_dir.h50
2 files changed, 27 insertions, 28 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 655c3d0..65b16d8 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,10 @@
2019-04-05 Jonathan Wakely <jwakely@redhat.com>
+ * include/bits/fs_dir.h (directory_iterator::operator*)
+ (directory_iterator::operator->): Add noexcept.
+ (operator==, operator!=): Replace namespace-scope equality operators
+ for directory iterators with hidden friends.
+
PR libstdc++/89986
* config/abi/pre/gnu.ver: Add missing exports.
* testsuite/27_io/filesystem/iterators/directory_iterator.cc: Test
diff --git a/libstdc++-v3/include/bits/fs_dir.h b/libstdc++-v3/include/bits/fs_dir.h
index a5947b3..69f0eb8 100644
--- a/libstdc++-v3/include/bits/fs_dir.h
+++ b/libstdc++-v3/include/bits/fs_dir.h
@@ -390,8 +390,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
directory_iterator&
operator=(directory_iterator&& __rhs) noexcept = default;
- const directory_entry& operator*() const;
- const directory_entry* operator->() const { return &**this; }
+ const directory_entry& operator*() const noexcept;
+ const directory_entry* operator->() const noexcept { return &**this; }
directory_iterator& operator++();
directory_iterator& increment(error_code& __ec);
@@ -407,7 +407,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
friend bool
operator==(const directory_iterator& __lhs,
- const directory_iterator& __rhs);
+ const directory_iterator& __rhs) noexcept
+ {
+ return !__rhs._M_dir.owner_before(__lhs._M_dir)
+ && !__lhs._M_dir.owner_before(__rhs._M_dir);
+ }
+
+ friend bool
+ operator!=(const directory_iterator& __lhs,
+ const directory_iterator& __rhs) noexcept
+ { return !(__lhs == __rhs); }
friend class recursive_directory_iterator;
@@ -422,17 +431,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
end(directory_iterator) noexcept
{ return directory_iterator(); }
- inline bool
- operator==(const directory_iterator& __lhs, const directory_iterator& __rhs)
- {
- return !__rhs._M_dir.owner_before(__lhs._M_dir)
- && !__lhs._M_dir.owner_before(__rhs._M_dir);
- }
-
- inline bool
- operator!=(const directory_iterator& __lhs, const directory_iterator& __rhs)
- { return !(__lhs == __rhs); }
-
class recursive_directory_iterator
{
public:
@@ -499,7 +497,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
friend bool
operator==(const recursive_directory_iterator& __lhs,
- const recursive_directory_iterator& __rhs);
+ const recursive_directory_iterator& __rhs) noexcept
+ {
+ return !__rhs._M_dirs.owner_before(__lhs._M_dirs)
+ && !__lhs._M_dirs.owner_before(__rhs._M_dirs);
+ }
+
+ friend bool
+ operator!=(const recursive_directory_iterator& __lhs,
+ const recursive_directory_iterator& __rhs) noexcept
+ { return !(__lhs == __rhs); }
struct _Dir_stack;
std::__shared_ptr<_Dir_stack> _M_dirs;
@@ -513,19 +520,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
end(recursive_directory_iterator) noexcept
{ return recursive_directory_iterator(); }
- inline bool
- operator==(const recursive_directory_iterator& __lhs,
- const recursive_directory_iterator& __rhs)
- {
- return !__rhs._M_dirs.owner_before(__lhs._M_dirs)
- && !__lhs._M_dirs.owner_before(__rhs._M_dirs);
- }
-
- inline bool
- operator!=(const recursive_directory_iterator& __lhs,
- const recursive_directory_iterator& __rhs)
- { return !(__lhs == __rhs); }
-
_GLIBCXX_END_NAMESPACE_CXX11
// @} group filesystem