138fd1498Szrj // Filesystem directory utilities -*- C++ -*-
238fd1498Szrj
338fd1498Szrj // Copyright (C) 2014-2018 Free Software Foundation, Inc.
438fd1498Szrj //
538fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free
638fd1498Szrj // software; you can redistribute it and/or modify it under the
738fd1498Szrj // terms of the GNU General Public License as published by the
838fd1498Szrj // Free Software Foundation; either version 3, or (at your option)
938fd1498Szrj // any later version.
1038fd1498Szrj
1138fd1498Szrj // This library is distributed in the hope that it will be useful,
1238fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of
1338fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1438fd1498Szrj // GNU General Public License for more details.
1538fd1498Szrj
1638fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
1738fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
1838fd1498Szrj // 3.1, as published by the Free Software Foundation.
1938fd1498Szrj
2038fd1498Szrj // You should have received a copy of the GNU General Public License and
2138fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
2238fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
2338fd1498Szrj // <http://www.gnu.org/licenses/>.
2438fd1498Szrj
2538fd1498Szrj /** @file include/bits/fs_dir.h
2638fd1498Szrj * This is an internal header file, included by other library headers.
2738fd1498Szrj * Do not attempt to use it directly. @headername{filesystem}
2838fd1498Szrj */
2938fd1498Szrj
3038fd1498Szrj #ifndef _GLIBCXX_FS_DIR_H
3138fd1498Szrj #define _GLIBCXX_FS_DIR_H 1
3238fd1498Szrj
3338fd1498Szrj #if __cplusplus >= 201703L
3438fd1498Szrj # include <typeinfo>
3538fd1498Szrj # include <ext/concurrence.h>
3638fd1498Szrj # include <bits/unique_ptr.h>
3738fd1498Szrj # include <bits/shared_ptr.h>
3838fd1498Szrj
_GLIBCXX_VISIBILITY(default)3938fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
4038fd1498Szrj {
4138fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
4238fd1498Szrj
4338fd1498Szrj namespace filesystem
4438fd1498Szrj {
4538fd1498Szrj /**
4638fd1498Szrj * @ingroup filesystem
4738fd1498Szrj * @{
4838fd1498Szrj */
4938fd1498Szrj
5038fd1498Szrj class file_status
5138fd1498Szrj {
5238fd1498Szrj public:
5338fd1498Szrj // constructors and destructor
5438fd1498Szrj file_status() noexcept : file_status(file_type::none) {}
5538fd1498Szrj
5638fd1498Szrj explicit
5738fd1498Szrj file_status(file_type __ft, perms __prms = perms::unknown) noexcept
5838fd1498Szrj : _M_type(__ft), _M_perms(__prms) { }
5938fd1498Szrj
6038fd1498Szrj file_status(const file_status&) noexcept = default;
6138fd1498Szrj file_status(file_status&&) noexcept = default;
6238fd1498Szrj ~file_status() = default;
6338fd1498Szrj
6438fd1498Szrj file_status& operator=(const file_status&) noexcept = default;
6538fd1498Szrj file_status& operator=(file_status&&) noexcept = default;
6638fd1498Szrj
6738fd1498Szrj // observers
6838fd1498Szrj file_type type() const noexcept { return _M_type; }
6938fd1498Szrj perms permissions() const noexcept { return _M_perms; }
7038fd1498Szrj
7138fd1498Szrj // modifiers
7238fd1498Szrj void type(file_type __ft) noexcept { _M_type = __ft; }
7338fd1498Szrj void permissions(perms __prms) noexcept { _M_perms = __prms; }
7438fd1498Szrj
7538fd1498Szrj private:
7638fd1498Szrj file_type _M_type;
7738fd1498Szrj perms _M_perms;
7838fd1498Szrj };
7938fd1498Szrj
8038fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_CXX11
8138fd1498Szrj
8238fd1498Szrj struct _Dir;
8338fd1498Szrj class directory_iterator;
8438fd1498Szrj class recursive_directory_iterator;
8538fd1498Szrj
8638fd1498Szrj class directory_entry
8738fd1498Szrj {
8838fd1498Szrj public:
8938fd1498Szrj // constructors and destructor
9038fd1498Szrj directory_entry() noexcept = default;
9138fd1498Szrj directory_entry(const directory_entry&) = default;
9238fd1498Szrj directory_entry(directory_entry&&) noexcept = default;
9338fd1498Szrj
9438fd1498Szrj explicit
9538fd1498Szrj directory_entry(const filesystem::path& __p)
9638fd1498Szrj : _M_path(__p)
9738fd1498Szrj { refresh(); }
9838fd1498Szrj
9938fd1498Szrj directory_entry(const filesystem::path& __p, error_code& __ec)
10038fd1498Szrj : _M_path(__p)
10138fd1498Szrj {
10238fd1498Szrj refresh(__ec);
10338fd1498Szrj if (__ec)
10438fd1498Szrj _M_path.clear();
10538fd1498Szrj }
10638fd1498Szrj
10738fd1498Szrj ~directory_entry() = default;
10838fd1498Szrj
10938fd1498Szrj // modifiers
11038fd1498Szrj directory_entry& operator=(const directory_entry&) = default;
11138fd1498Szrj directory_entry& operator=(directory_entry&&) noexcept = default;
11238fd1498Szrj
11338fd1498Szrj void
11438fd1498Szrj assign(const filesystem::path& __p)
11538fd1498Szrj {
11638fd1498Szrj _M_path = __p;
11738fd1498Szrj refresh();
11838fd1498Szrj }
11938fd1498Szrj
12038fd1498Szrj void
12138fd1498Szrj assign(const filesystem::path& __p, error_code& __ec)
12238fd1498Szrj {
12338fd1498Szrj _M_path = __p;
12438fd1498Szrj refresh(__ec);
12538fd1498Szrj }
12638fd1498Szrj
12738fd1498Szrj void
12838fd1498Szrj replace_filename(const filesystem::path& __p)
12938fd1498Szrj {
13038fd1498Szrj _M_path.replace_filename(__p);
13138fd1498Szrj refresh();
13238fd1498Szrj }
13338fd1498Szrj
13438fd1498Szrj void
13538fd1498Szrj replace_filename(const filesystem::path& __p, error_code& __ec)
13638fd1498Szrj {
13738fd1498Szrj _M_path.replace_filename(__p);
13838fd1498Szrj refresh(__ec);
13938fd1498Szrj }
14038fd1498Szrj
141*58e805e6Szrj void
142*58e805e6Szrj refresh()
143*58e805e6Szrj { _M_type = symlink_status().type(); }
144*58e805e6Szrj
145*58e805e6Szrj void
146*58e805e6Szrj refresh(error_code& __ec) noexcept
147*58e805e6Szrj { _M_type = symlink_status(__ec).type(); }
14838fd1498Szrj
14938fd1498Szrj // observers
15038fd1498Szrj const filesystem::path& path() const noexcept { return _M_path; }
15138fd1498Szrj operator const filesystem::path& () const noexcept { return _M_path; }
15238fd1498Szrj
15338fd1498Szrj bool
15438fd1498Szrj exists() const
15538fd1498Szrj { return filesystem::exists(file_status{_M_file_type()}); }
15638fd1498Szrj
15738fd1498Szrj bool
15838fd1498Szrj exists(error_code& __ec) const noexcept
15938fd1498Szrj { return filesystem::exists(file_status{_M_file_type(__ec)}); }
16038fd1498Szrj
16138fd1498Szrj bool
16238fd1498Szrj is_block_file() const
16338fd1498Szrj { return _M_file_type() == file_type::block; }
16438fd1498Szrj
16538fd1498Szrj bool
16638fd1498Szrj is_block_file(error_code& __ec) const noexcept
16738fd1498Szrj { return _M_file_type(__ec) == file_type::block; }
16838fd1498Szrj
16938fd1498Szrj bool
17038fd1498Szrj is_character_file() const
17138fd1498Szrj { return _M_file_type() == file_type::character; }
17238fd1498Szrj
17338fd1498Szrj bool
17438fd1498Szrj is_character_file(error_code& __ec) const noexcept
17538fd1498Szrj { return _M_file_type(__ec) == file_type::character; }
17638fd1498Szrj
17738fd1498Szrj bool
17838fd1498Szrj is_directory() const
17938fd1498Szrj { return _M_file_type() == file_type::directory; }
18038fd1498Szrj
18138fd1498Szrj bool
18238fd1498Szrj is_directory(error_code& __ec) const noexcept
18338fd1498Szrj { return _M_file_type(__ec) == file_type::directory; }
18438fd1498Szrj
18538fd1498Szrj bool
18638fd1498Szrj is_fifo() const
18738fd1498Szrj { return _M_file_type() == file_type::fifo; }
18838fd1498Szrj
18938fd1498Szrj bool
19038fd1498Szrj is_fifo(error_code& __ec) const noexcept
19138fd1498Szrj { return _M_file_type(__ec) == file_type::fifo; }
19238fd1498Szrj
19338fd1498Szrj bool
19438fd1498Szrj is_other() const
19538fd1498Szrj { return filesystem::is_other(file_status{_M_file_type()}); }
19638fd1498Szrj
19738fd1498Szrj bool
19838fd1498Szrj is_other(error_code& __ec) const noexcept
19938fd1498Szrj { return filesystem::is_other(file_status{_M_file_type(__ec)}); }
20038fd1498Szrj
20138fd1498Szrj bool
20238fd1498Szrj is_regular_file() const
20338fd1498Szrj { return _M_file_type() == file_type::regular; }
20438fd1498Szrj
20538fd1498Szrj bool
20638fd1498Szrj is_regular_file(error_code& __ec) const noexcept
20738fd1498Szrj { return _M_file_type(__ec) == file_type::regular; }
20838fd1498Szrj
20938fd1498Szrj bool
21038fd1498Szrj is_socket() const
21138fd1498Szrj { return _M_file_type() == file_type::socket; }
21238fd1498Szrj
21338fd1498Szrj bool
21438fd1498Szrj is_socket(error_code& __ec) const noexcept
21538fd1498Szrj { return _M_file_type(__ec) == file_type::socket; }
21638fd1498Szrj
21738fd1498Szrj bool
21838fd1498Szrj is_symlink() const
21938fd1498Szrj {
22038fd1498Szrj if (_M_type != file_type::none)
22138fd1498Szrj return _M_type == file_type::symlink;
22238fd1498Szrj return symlink_status().type() == file_type::symlink;
22338fd1498Szrj }
22438fd1498Szrj
22538fd1498Szrj bool
22638fd1498Szrj is_symlink(error_code& __ec) const noexcept
22738fd1498Szrj {
22838fd1498Szrj if (_M_type != file_type::none)
22938fd1498Szrj return _M_type == file_type::symlink;
23038fd1498Szrj return symlink_status(__ec).type() == file_type::symlink;
23138fd1498Szrj }
23238fd1498Szrj
23338fd1498Szrj uintmax_t
23438fd1498Szrj file_size() const
23538fd1498Szrj { return filesystem::file_size(_M_path); }
23638fd1498Szrj
23738fd1498Szrj uintmax_t
23838fd1498Szrj file_size(error_code& __ec) const noexcept
23938fd1498Szrj { return filesystem::file_size(_M_path, __ec); }
24038fd1498Szrj
24138fd1498Szrj uintmax_t
24238fd1498Szrj hard_link_count() const
24338fd1498Szrj { return filesystem::hard_link_count(_M_path); }
24438fd1498Szrj
24538fd1498Szrj uintmax_t
24638fd1498Szrj hard_link_count(error_code& __ec) const noexcept
24738fd1498Szrj { return filesystem::hard_link_count(_M_path, __ec); }
24838fd1498Szrj
24938fd1498Szrj file_time_type
25038fd1498Szrj last_write_time() const
25138fd1498Szrj { return filesystem::last_write_time(_M_path); }
25238fd1498Szrj
25338fd1498Szrj
25438fd1498Szrj file_time_type
25538fd1498Szrj last_write_time(error_code& __ec) const noexcept
25638fd1498Szrj { return filesystem::last_write_time(_M_path, __ec); }
25738fd1498Szrj
25838fd1498Szrj file_status
25938fd1498Szrj status() const
26038fd1498Szrj { return filesystem::status(_M_path); }
26138fd1498Szrj
26238fd1498Szrj file_status
26338fd1498Szrj status(error_code& __ec) const noexcept
26438fd1498Szrj { return filesystem::status(_M_path, __ec); }
26538fd1498Szrj
26638fd1498Szrj file_status
26738fd1498Szrj symlink_status() const
26838fd1498Szrj { return filesystem::symlink_status(_M_path); }
26938fd1498Szrj
27038fd1498Szrj file_status
27138fd1498Szrj symlink_status(error_code& __ec) const noexcept
27238fd1498Szrj { return filesystem::symlink_status(_M_path, __ec); }
27338fd1498Szrj
27438fd1498Szrj bool
27538fd1498Szrj operator< (const directory_entry& __rhs) const noexcept
27638fd1498Szrj { return _M_path < __rhs._M_path; }
27738fd1498Szrj
27838fd1498Szrj bool
27938fd1498Szrj operator==(const directory_entry& __rhs) const noexcept
28038fd1498Szrj { return _M_path == __rhs._M_path; }
28138fd1498Szrj
28238fd1498Szrj bool
28338fd1498Szrj operator!=(const directory_entry& __rhs) const noexcept
28438fd1498Szrj { return _M_path != __rhs._M_path; }
28538fd1498Szrj
28638fd1498Szrj bool
28738fd1498Szrj operator<=(const directory_entry& __rhs) const noexcept
28838fd1498Szrj { return _M_path <= __rhs._M_path; }
28938fd1498Szrj
29038fd1498Szrj bool
29138fd1498Szrj operator> (const directory_entry& __rhs) const noexcept
29238fd1498Szrj { return _M_path > __rhs._M_path; }
29338fd1498Szrj
29438fd1498Szrj bool
29538fd1498Szrj operator>=(const directory_entry& __rhs) const noexcept
29638fd1498Szrj { return _M_path >= __rhs._M_path; }
29738fd1498Szrj
29838fd1498Szrj private:
29938fd1498Szrj friend class _Dir;
30038fd1498Szrj friend class directory_iterator;
30138fd1498Szrj friend class recursive_directory_iterator;
30238fd1498Szrj
30338fd1498Szrj directory_entry(const filesystem::path& __p, file_type __t)
30438fd1498Szrj : _M_path(__p), _M_type(__t)
30538fd1498Szrj { }
30638fd1498Szrj
30738fd1498Szrj // Equivalent to status().type() but uses cached value, if any.
30838fd1498Szrj file_type
30938fd1498Szrj _M_file_type() const
31038fd1498Szrj {
31138fd1498Szrj if (_M_type != file_type::none && _M_type != file_type::symlink)
31238fd1498Szrj return _M_type;
31338fd1498Szrj return status().type();
31438fd1498Szrj }
31538fd1498Szrj
31638fd1498Szrj // Equivalent to status(__ec).type() but uses cached value, if any.
31738fd1498Szrj file_type
31838fd1498Szrj _M_file_type(error_code& __ec) const noexcept
31938fd1498Szrj {
32038fd1498Szrj if (_M_type != file_type::none && _M_type != file_type::symlink)
321*58e805e6Szrj {
322*58e805e6Szrj __ec.clear();
32338fd1498Szrj return _M_type;
324*58e805e6Szrj }
32538fd1498Szrj return status(__ec).type();
32638fd1498Szrj }
32738fd1498Szrj
32838fd1498Szrj filesystem::path _M_path;
32938fd1498Szrj file_type _M_type = file_type::none;
33038fd1498Szrj };
33138fd1498Szrj
33238fd1498Szrj struct __directory_iterator_proxy
33338fd1498Szrj {
33438fd1498Szrj const directory_entry& operator*() const& noexcept { return _M_entry; }
33538fd1498Szrj
33638fd1498Szrj directory_entry operator*() && noexcept { return std::move(_M_entry); }
33738fd1498Szrj
33838fd1498Szrj private:
33938fd1498Szrj friend class directory_iterator;
34038fd1498Szrj friend class recursive_directory_iterator;
34138fd1498Szrj
34238fd1498Szrj explicit
34338fd1498Szrj __directory_iterator_proxy(const directory_entry& __e) : _M_entry(__e) { }
34438fd1498Szrj
34538fd1498Szrj directory_entry _M_entry;
34638fd1498Szrj };
34738fd1498Szrj
34838fd1498Szrj class directory_iterator
34938fd1498Szrj {
35038fd1498Szrj public:
35138fd1498Szrj typedef directory_entry value_type;
35238fd1498Szrj typedef ptrdiff_t difference_type;
35338fd1498Szrj typedef const directory_entry* pointer;
35438fd1498Szrj typedef const directory_entry& reference;
35538fd1498Szrj typedef input_iterator_tag iterator_category;
35638fd1498Szrj
35738fd1498Szrj directory_iterator() = default;
35838fd1498Szrj
35938fd1498Szrj explicit
36038fd1498Szrj directory_iterator(const path& __p)
36138fd1498Szrj : directory_iterator(__p, directory_options::none, nullptr) { }
36238fd1498Szrj
36338fd1498Szrj directory_iterator(const path& __p, directory_options __options)
36438fd1498Szrj : directory_iterator(__p, __options, nullptr) { }
36538fd1498Szrj
36638fd1498Szrj directory_iterator(const path& __p, error_code& __ec)
36738fd1498Szrj : directory_iterator(__p, directory_options::none, __ec) { }
36838fd1498Szrj
36938fd1498Szrj directory_iterator(const path& __p, directory_options __options,
37038fd1498Szrj error_code& __ec)
37138fd1498Szrj : directory_iterator(__p, __options, &__ec) { }
37238fd1498Szrj
37338fd1498Szrj directory_iterator(const directory_iterator& __rhs) = default;
37438fd1498Szrj
37538fd1498Szrj directory_iterator(directory_iterator&& __rhs) noexcept = default;
37638fd1498Szrj
37738fd1498Szrj ~directory_iterator() = default;
37838fd1498Szrj
37938fd1498Szrj directory_iterator&
38038fd1498Szrj operator=(const directory_iterator& __rhs) = default;
38138fd1498Szrj
38238fd1498Szrj directory_iterator&
38338fd1498Szrj operator=(directory_iterator&& __rhs) noexcept = default;
38438fd1498Szrj
38538fd1498Szrj const directory_entry& operator*() const;
38638fd1498Szrj const directory_entry* operator->() const { return &**this; }
38738fd1498Szrj directory_iterator& operator++();
38838fd1498Szrj directory_iterator& increment(error_code& __ec);
38938fd1498Szrj
39038fd1498Szrj __directory_iterator_proxy operator++(int)
39138fd1498Szrj {
39238fd1498Szrj __directory_iterator_proxy __pr{**this};
39338fd1498Szrj ++*this;
39438fd1498Szrj return __pr;
39538fd1498Szrj }
39638fd1498Szrj
39738fd1498Szrj private:
39838fd1498Szrj directory_iterator(const path&, directory_options, error_code*);
39938fd1498Szrj
40038fd1498Szrj friend bool
40138fd1498Szrj operator==(const directory_iterator& __lhs,
40238fd1498Szrj const directory_iterator& __rhs);
40338fd1498Szrj
40438fd1498Szrj friend class recursive_directory_iterator;
40538fd1498Szrj
40638fd1498Szrj std::shared_ptr<_Dir> _M_dir;
40738fd1498Szrj };
40838fd1498Szrj
40938fd1498Szrj inline directory_iterator
41038fd1498Szrj begin(directory_iterator __iter) noexcept
41138fd1498Szrj { return __iter; }
41238fd1498Szrj
41338fd1498Szrj inline directory_iterator
41438fd1498Szrj end(directory_iterator) noexcept
41538fd1498Szrj { return directory_iterator(); }
41638fd1498Szrj
41738fd1498Szrj inline bool
41838fd1498Szrj operator==(const directory_iterator& __lhs, const directory_iterator& __rhs)
41938fd1498Szrj {
42038fd1498Szrj return !__rhs._M_dir.owner_before(__lhs._M_dir)
42138fd1498Szrj && !__lhs._M_dir.owner_before(__rhs._M_dir);
42238fd1498Szrj }
42338fd1498Szrj
42438fd1498Szrj inline bool
42538fd1498Szrj operator!=(const directory_iterator& __lhs, const directory_iterator& __rhs)
42638fd1498Szrj { return !(__lhs == __rhs); }
42738fd1498Szrj
42838fd1498Szrj class recursive_directory_iterator
42938fd1498Szrj {
43038fd1498Szrj public:
43138fd1498Szrj typedef directory_entry value_type;
43238fd1498Szrj typedef ptrdiff_t difference_type;
43338fd1498Szrj typedef const directory_entry* pointer;
43438fd1498Szrj typedef const directory_entry& reference;
43538fd1498Szrj typedef input_iterator_tag iterator_category;
43638fd1498Szrj
43738fd1498Szrj recursive_directory_iterator() = default;
43838fd1498Szrj
43938fd1498Szrj explicit
44038fd1498Szrj recursive_directory_iterator(const path& __p)
44138fd1498Szrj : recursive_directory_iterator(__p, directory_options::none, nullptr) { }
44238fd1498Szrj
44338fd1498Szrj recursive_directory_iterator(const path& __p, directory_options __options)
44438fd1498Szrj : recursive_directory_iterator(__p, __options, nullptr) { }
44538fd1498Szrj
44638fd1498Szrj recursive_directory_iterator(const path& __p, directory_options __options,
44738fd1498Szrj error_code& __ec)
44838fd1498Szrj : recursive_directory_iterator(__p, __options, &__ec) { }
44938fd1498Szrj
45038fd1498Szrj recursive_directory_iterator(const path& __p, error_code& __ec)
45138fd1498Szrj : recursive_directory_iterator(__p, directory_options::none, &__ec) { }
45238fd1498Szrj
45338fd1498Szrj recursive_directory_iterator(
45438fd1498Szrj const recursive_directory_iterator&) = default;
45538fd1498Szrj
45638fd1498Szrj recursive_directory_iterator(recursive_directory_iterator&&) = default;
45738fd1498Szrj
45838fd1498Szrj ~recursive_directory_iterator();
45938fd1498Szrj
46038fd1498Szrj // observers
46138fd1498Szrj directory_options options() const { return _M_options; }
46238fd1498Szrj int depth() const;
46338fd1498Szrj bool recursion_pending() const { return _M_pending; }
46438fd1498Szrj
46538fd1498Szrj const directory_entry& operator*() const;
46638fd1498Szrj const directory_entry* operator->() const { return &**this; }
46738fd1498Szrj
46838fd1498Szrj // modifiers
46938fd1498Szrj recursive_directory_iterator&
47038fd1498Szrj operator=(const recursive_directory_iterator& __rhs) noexcept;
47138fd1498Szrj recursive_directory_iterator&
47238fd1498Szrj operator=(recursive_directory_iterator&& __rhs) noexcept;
47338fd1498Szrj
47438fd1498Szrj recursive_directory_iterator& operator++();
47538fd1498Szrj recursive_directory_iterator& increment(error_code& __ec);
47638fd1498Szrj
47738fd1498Szrj __directory_iterator_proxy operator++(int)
47838fd1498Szrj {
47938fd1498Szrj __directory_iterator_proxy __pr{**this};
48038fd1498Szrj ++*this;
48138fd1498Szrj return __pr;
48238fd1498Szrj }
48338fd1498Szrj
48438fd1498Szrj void pop();
48538fd1498Szrj void pop(error_code&);
48638fd1498Szrj
48738fd1498Szrj void disable_recursion_pending() { _M_pending = false; }
48838fd1498Szrj
48938fd1498Szrj private:
49038fd1498Szrj recursive_directory_iterator(const path&, directory_options, error_code*);
49138fd1498Szrj
49238fd1498Szrj friend bool
49338fd1498Szrj operator==(const recursive_directory_iterator& __lhs,
49438fd1498Szrj const recursive_directory_iterator& __rhs);
49538fd1498Szrj
49638fd1498Szrj struct _Dir_stack;
49738fd1498Szrj std::shared_ptr<_Dir_stack> _M_dirs;
49838fd1498Szrj directory_options _M_options = {};
49938fd1498Szrj bool _M_pending = false;
50038fd1498Szrj };
50138fd1498Szrj
50238fd1498Szrj inline recursive_directory_iterator
50338fd1498Szrj begin(recursive_directory_iterator __iter) noexcept
50438fd1498Szrj { return __iter; }
50538fd1498Szrj
50638fd1498Szrj inline recursive_directory_iterator
50738fd1498Szrj end(recursive_directory_iterator) noexcept
50838fd1498Szrj { return recursive_directory_iterator(); }
50938fd1498Szrj
51038fd1498Szrj inline bool
51138fd1498Szrj operator==(const recursive_directory_iterator& __lhs,
51238fd1498Szrj const recursive_directory_iterator& __rhs)
51338fd1498Szrj {
51438fd1498Szrj return !__rhs._M_dirs.owner_before(__lhs._M_dirs)
51538fd1498Szrj && !__lhs._M_dirs.owner_before(__rhs._M_dirs);
51638fd1498Szrj }
51738fd1498Szrj
51838fd1498Szrj inline bool
51938fd1498Szrj operator!=(const recursive_directory_iterator& __lhs,
52038fd1498Szrj const recursive_directory_iterator& __rhs)
52138fd1498Szrj { return !(__lhs == __rhs); }
52238fd1498Szrj
52338fd1498Szrj _GLIBCXX_END_NAMESPACE_CXX11
52438fd1498Szrj
52538fd1498Szrj // @} group filesystem
52638fd1498Szrj } // namespace filesystem
52738fd1498Szrj
52838fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
52938fd1498Szrj } // namespace std
53038fd1498Szrj
53138fd1498Szrj #endif // C++17
53238fd1498Szrj
53338fd1498Szrj #endif // _GLIBCXX_FS_DIR_H
534