xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/bits/fs_dir.h (revision 95059079af47f9a66a175f374f2da1a5020e3255)
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