File indexing completed on 2026-05-03 08:13:48
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___FILESYSTEM_RECURSIVE_DIRECTORY_ITERATOR_H
0011 #define _LIBCPP___FILESYSTEM_RECURSIVE_DIRECTORY_ITERATOR_H
0012
0013 #include <__config>
0014 #include <__filesystem/directory_entry.h>
0015 #include <__filesystem/directory_options.h>
0016 #include <__filesystem/path.h>
0017 #include <__iterator/default_sentinel.h>
0018 #include <__iterator/iterator_traits.h>
0019 #include <__memory/shared_ptr.h>
0020 #include <__ranges/enable_borrowed_range.h>
0021 #include <__ranges/enable_view.h>
0022 #include <__system_error/error_code.h>
0023 #include <__utility/move.h>
0024
0025 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0026 # pragma GCC system_header
0027 #endif
0028
0029 _LIBCPP_PUSH_MACROS
0030 #include <__undef_macros>
0031
0032 #if _LIBCPP_STD_VER >= 17 && _LIBCPP_HAS_FILESYSTEM
0033
0034 _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
0035
0036 _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH
0037
0038 class recursive_directory_iterator {
0039 public:
0040 using value_type = directory_entry;
0041 using difference_type = ptrdiff_t;
0042 using pointer = directory_entry const*;
0043 using reference = directory_entry const&;
0044 using iterator_category = input_iterator_tag;
0045
0046 public:
0047
0048 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator() noexcept : __rec_(false) {}
0049
0050 _LIBCPP_HIDE_FROM_ABI explicit recursive_directory_iterator(
0051 const path& __p, directory_options __xoptions = directory_options::none)
0052 : recursive_directory_iterator(__p, __xoptions, nullptr) {}
0053
0054 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator(const path& __p, directory_options __xoptions, error_code& __ec)
0055 : recursive_directory_iterator(__p, __xoptions, &__ec) {}
0056
0057 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator(const path& __p, error_code& __ec)
0058 : recursive_directory_iterator(__p, directory_options::none, &__ec) {}
0059
0060 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator(const recursive_directory_iterator&) = default;
0061 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator(recursive_directory_iterator&&) = default;
0062
0063 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator& operator=(const recursive_directory_iterator&) = default;
0064
0065 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator& operator=(recursive_directory_iterator&& __o) noexcept {
0066
0067 if (this != &__o) {
0068 __imp_ = std::move(__o.__imp_);
0069 __rec_ = __o.__rec_;
0070 }
0071 return *this;
0072 }
0073
0074 _LIBCPP_HIDE_FROM_ABI ~recursive_directory_iterator() = default;
0075
0076 _LIBCPP_HIDE_FROM_ABI const directory_entry& operator*() const { return __dereference(); }
0077
0078 _LIBCPP_HIDE_FROM_ABI const directory_entry* operator->() const { return &__dereference(); }
0079
0080 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator& operator++() { return __increment(); }
0081
0082 _LIBCPP_HIDE_FROM_ABI __dir_element_proxy operator++(int) {
0083 __dir_element_proxy __p(**this);
0084 __increment();
0085 return __p;
0086 }
0087
0088 _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator& increment(error_code& __ec) { return __increment(&__ec); }
0089
0090 _LIBCPP_EXPORTED_FROM_ABI directory_options options() const;
0091 _LIBCPP_EXPORTED_FROM_ABI int depth() const;
0092
0093 _LIBCPP_HIDE_FROM_ABI void pop() { __pop(); }
0094
0095 _LIBCPP_HIDE_FROM_ABI void pop(error_code& __ec) { __pop(&__ec); }
0096
0097 _LIBCPP_HIDE_FROM_ABI bool recursion_pending() const { return __rec_; }
0098
0099 _LIBCPP_HIDE_FROM_ABI void disable_recursion_pending() { __rec_ = false; }
0100
0101 # if _LIBCPP_STD_VER >= 20
0102
0103 _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const noexcept {
0104 return *this == recursive_directory_iterator();
0105 }
0106
0107 # endif
0108
0109 private:
0110 _LIBCPP_EXPORTED_FROM_ABI recursive_directory_iterator(const path& __p, directory_options __opt, error_code* __ec);
0111 _LIBCPP_EXPORTED_FROM_ABI const directory_entry& __dereference() const;
0112 _LIBCPP_EXPORTED_FROM_ABI bool __try_recursion(error_code* __ec);
0113 _LIBCPP_EXPORTED_FROM_ABI void __advance(error_code* __ec = nullptr);
0114 _LIBCPP_EXPORTED_FROM_ABI recursive_directory_iterator& __increment(error_code* __ec = nullptr);
0115 _LIBCPP_EXPORTED_FROM_ABI void __pop(error_code* __ec = nullptr);
0116
0117 inline _LIBCPP_HIDE_FROM_ABI friend bool
0118 operator==(const recursive_directory_iterator&, const recursive_directory_iterator&) noexcept;
0119
0120 struct _LIBCPP_HIDDEN __shared_imp;
0121 shared_ptr<__shared_imp> __imp_;
0122 bool __rec_;
0123 };
0124
0125 inline _LIBCPP_HIDE_FROM_ABI bool
0126 operator==(const recursive_directory_iterator& __lhs, const recursive_directory_iterator& __rhs) noexcept {
0127 return __lhs.__imp_ == __rhs.__imp_;
0128 }
0129
0130 _LIBCPP_HIDE_FROM_ABI inline bool
0131 operator!=(const recursive_directory_iterator& __lhs, const recursive_directory_iterator& __rhs) noexcept {
0132 return !(__lhs == __rhs);
0133 }
0134
0135 inline _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator begin(recursive_directory_iterator __iter) noexcept {
0136 return __iter;
0137 }
0138
0139 inline _LIBCPP_HIDE_FROM_ABI recursive_directory_iterator end(recursive_directory_iterator) noexcept {
0140 return recursive_directory_iterator();
0141 }
0142
0143 _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP
0144
0145 _LIBCPP_END_NAMESPACE_FILESYSTEM
0146
0147 # if _LIBCPP_STD_VER >= 20
0148
0149 template <>
0150 _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline constexpr bool
0151 std::ranges::enable_borrowed_range<std::filesystem::recursive_directory_iterator> = true;
0152
0153 template <>
0154 _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY inline constexpr bool
0155 std::ranges::enable_view<std::filesystem::recursive_directory_iterator> = true;
0156
0157 # endif
0158
0159 #endif
0160
0161 _LIBCPP_POP_MACROS
0162
0163 #endif