Iros
 
Loading...
Searching...
No Matches
directory_iterator.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/util/prelude.h"
6#include "dius/error.h"
9#include "dius/sync_file.h"
10
11namespace dius::filesystem {
13 : public di::container::IteratorBase<DirectoryIterator, di::InputIteratorTag,
14 di::Expected<DirectoryEntry, di::GenericCode>, i64>
15 , public di::meta::EnableBorrowedContainer<DirectoryIterator>
16 , public di::meta::EnableView<DirectoryIterator> {
18
19public:
20 static auto create(di::Path path, DirectoryOptions options = DirectoryOptions::None)
22
23 DirectoryIterator() = default;
24
27
30
31 auto operator*() const -> di::Expected<DirectoryEntry const&, di::GenericCode> {
32 return m_current.transform([](auto const& value) {
33 return di::cref(value);
34 });
35 }
36
37 auto begin() -> DirectoryIterator { return di::move(*this); }
38 auto end() const -> DirectoryIterator { return {}; }
39
40 void advance_one();
41
42private:
43 void advance();
44
45 explicit DirectoryIterator(di::Path&& path, di::Vector<di::Byte>&& buffer, SyncFile&& directory_handle)
46 : m_path(di::move(path))
47 , m_buffer(di::move(buffer))
48 , m_directory_handle(di::move(directory_handle))
49 , m_at_end(false) {}
50
51 constexpr friend auto operator==(DirectoryIterator const& a, DirectoryIterator const& b) -> bool {
52 return a.m_at_end == b.m_at_end;
53 }
54
55 di::Path m_path;
56 di::Vector<di::Byte> m_buffer;
57 SyncFile m_directory_handle;
58 di::Expected<DirectoryEntry, di::GenericCode> m_current { di::unexpect, PosixError::Success };
59 usize m_current_offset { 0 };
60 bool m_at_end { true };
61};
62}
Definition vector_forward_declaration.h:8
Definition enable_borrowed_container.h:7
Definition enable_view.h:7
Definition expected_forward_declaration.h:8
Definition sync_file.h:40
Definition directory_entry.h:13
auto operator*() const -> di::Expected< DirectoryEntry const &, di::GenericCode >
Definition directory_iterator.h:31
auto operator=(DirectoryIterator const &) -> DirectoryIterator &=delete
auto operator=(DirectoryIterator &&) -> DirectoryIterator &=default
auto begin() -> DirectoryIterator
Definition directory_iterator.h:37
DirectoryIterator(DirectoryIterator &&)=default
static auto create(di::Path path, DirectoryOptions options=DirectoryOptions::None) -> di::Expected< DirectoryIterator, di::GenericCode >
Definition directory_iterator.cpp:16
DirectoryIterator(DirectoryIterator const &)=delete
void advance_one()
Definition directory_iterator.cpp:32
constexpr friend auto operator==(DirectoryIterator const &a, DirectoryIterator const &b) -> bool
Definition directory_iterator.h:51
auto end() const -> DirectoryIterator
Definition directory_iterator.h:38
friend class RecursiveDirectoryIterator
Definition directory_iterator.h:17
PathImpl< TransparentString > Path
Definition path.h:10
size_t usize
Definition integers.h:33
StatusCode< platform::GenericDomain > GenericCode
Definition status_code_forward_declaration.h:13
Definition zstring_parser.h:9
constexpr auto cref
Definition reference_wrapper.h:99
constexpr auto unexpect
Definition unexpect.h:8
Definition directory_entry.h:11
DirectoryOptions
Definition directory_options.h:6
@ None
Definition directory_options.h:7
Definition iterator_base.h:14