Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:48

0001 // -*- C++ -*-
0002 //===----------------------------------------------------------------------===//
0003 //
0004 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0005 // See https://llvm.org/LICENSE.txt for license information.
0006 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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   // constructors and destructor
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     // non-default implementation provided to support self-move assign.
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 }; // class recursive_directory_iterator
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 // enable recursive_directory_iterator range-based for statements
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 // _LIBCPP_STD_VER >= 20
0158 
0159 #endif // _LIBCPP_STD_VER >= 17 && _LIBCPP_HAS_FILESYSTEM
0160 
0161 _LIBCPP_POP_MACROS
0162 
0163 #endif // _LIBCPP___FILESYSTEM_RECURSIVE_DIRECTORY_ITERATOR_H