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 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