dius 0.1.0
Loading...
Searching...
No Matches
directory_iterator.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/container/path/prelude.h"
4#include "di/util/prelude.h"
5#include "di/vocab/error/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> {
17 friend class RecursiveDirectoryIterator;
18
19public:
20 static auto create(di::Path path, DirectoryOptions options = DirectoryOptions::None)
21 -> di::Expected<DirectoryIterator, di::GenericCode>;
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
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 sync_file.h:40
Definition directory_entry.h:13
Definition directory_iterator.h:24
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
friend class RecursiveDirectoryIterator
Definition directory_iterator.h:25
DirectoryIterator(DirectoryIterator &&)=default
static auto create(di::Path path, DirectoryOptions options=DirectoryOptions::None) -> di::Expected< DirectoryIterator, di::GenericCode >
DirectoryIterator(DirectoryIterator const &)=delete
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
Definition error.h:7
Definition directory_entry.h:11
DirectoryOptions
Definition directory_options.h:6
@ None
Definition directory_options.h:7