3#include "di/container/queue/prelude.h"
4#include "dius/filesystem/directory_iterator.h"
8 :
public di::container::IteratorBase<RecursiveDirectoryIterator, di::InputIteratorTag,
9 di::Expected<DirectoryEntry, di::GenericCode>, i64>
10 ,
public di::meta::EnableBorrowedContainer<RecursiveDirectoryIterator>
11 ,
public di::meta::EnableView<RecursiveDirectoryIterator> {
14 -> di::Result<RecursiveDirectoryIterator> {
18 result.m_stack.push(di::move(base));
19 result.m_recursion_pending =
true;
38 constexpr auto depth() const -> i32 {
return static_cast<i32
>(m_stack.size()) - 1; }
42 auto& top = *m_stack.top();
47 auto const& current = **top;
51 if (di::exchange(m_recursion_pending,
true)) {
52 auto is_directory_result = current.is_non_symlink_directory();
53 if (!is_directory_result) {
54 top.m_current = di::Unexpected(is_directory_result.error());
59 if (*is_directory_result) {
62 top.m_current = di::Unexpected(new_iterator.error());
68 m_stack.push(*di::move(new_iterator));
85 if (!m_stack.empty()) {
86 auto& top = *m_stack.top();
101 return a.m_stack.empty() && b.m_stack.empty();
104 di::Stack<DirectoryIterator> m_stack;
106 bool m_recursion_pending {
false };
Definition directory_entry.h:13
Definition directory_iterator.h:24
static auto create(di::Path path, DirectoryOptions options=DirectoryOptions::None) -> di::Expected< DirectoryIterator, di::GenericCode >
auto end() const -> RecursiveDirectoryIterator
Definition recursive_directory_iterator.h:35
constexpr void disable_recursion_pending()
Definition recursive_directory_iterator.h:95
constexpr auto recursion_pending() const -> bool
Definition recursive_directory_iterator.h:39
auto begin() -> RecursiveDirectoryIterator
Definition recursive_directory_iterator.h:34
constexpr friend auto operator==(RecursiveDirectoryIterator const &a, RecursiveDirectoryIterator const &b) -> bool
Definition recursive_directory_iterator.h:100
RecursiveDirectoryIterator(RecursiveDirectoryIterator &&)=default
auto operator=(RecursiveDirectoryIterator &&) -> RecursiveDirectoryIterator &=default
void advance_one()
Definition recursive_directory_iterator.h:41
auto operator*() const -> di::Expected< DirectoryEntry const &, di::GenericCode >
Definition recursive_directory_iterator.h:32
auto operator=(RecursiveDirectoryIterator const &) -> RecursiveDirectoryIterator &=delete
RecursiveDirectoryIterator(RecursiveDirectoryIterator const &)=delete
constexpr auto depth() const -> i32
Definition recursive_directory_iterator.h:38
static auto create(di::Path path, DirectoryOptions options=DirectoryOptions::None) -> di::Result< RecursiveDirectoryIterator >
Definition recursive_directory_iterator.h:13
RecursiveDirectoryIterator()=default
constexpr auto options() const -> DirectoryOptions
Definition recursive_directory_iterator.h:37
void pop()
Definition recursive_directory_iterator.h:81
Definition directory_entry.h:11
DirectoryOptions
Definition directory_options.h:6
@ None
Definition directory_options.h:7