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 {
12namespace detail {
13 struct DirDeleter {
14 static void operator()(DIR* dir);
15 };
16
17 using Dir = di::Box<::DIR, DirDeleter>;
18}
19
21 : public di::container::IteratorBase<DirectoryIterator, di::InputIteratorTag,
22 di::Expected<DirectoryEntry, di::GenericCode>, i64>
23 , public di::meta::EnableBorrowedContainer<DirectoryIterator>
24 , public di::meta::EnableView<DirectoryIterator> {
26
27public:
28 static auto create(di::Path path, DirectoryOptions options = DirectoryOptions::None)
29 -> di::Expected<DirectoryIterator, di::GenericCode>;
30
31 DirectoryIterator() = default;
32
35
38
39 auto operator*() const -> di::Expected<DirectoryEntry const&, di::GenericCode> {
40 return m_current.transform([](auto const& value) {
41 return di::cref(value);
42 });
43 }
44
45 auto begin() -> DirectoryIterator { return di::move(*this); }
46 auto end() const -> DirectoryIterator { return {}; }
47
49
50private:
51 void advance();
52
53 explicit DirectoryIterator(di::Path&& path, detail::Dir dir)
54 : m_path(di::move(path)), m_dir(di::move(dir)), m_at_end(false) {}
55
56 constexpr friend auto operator==(DirectoryIterator const& a, DirectoryIterator const& b) -> bool {
57 return a.m_at_end == b.m_at_end;
58 }
59
60 di::Path m_path;
61 di::Expected<DirectoryEntry, di::GenericCode> m_current { di::unexpect, PosixError::Success };
62 detail::Dir m_dir { nullptr };
63 bool m_at_end { true };
64};
65}
Definition directory_entry.h:13
auto operator*() const -> di::Expected< DirectoryEntry const &, di::GenericCode >
Definition directory_iterator.h:39
auto operator=(DirectoryIterator const &) -> DirectoryIterator &=delete
auto operator=(DirectoryIterator &&) -> DirectoryIterator &=default
auto begin() -> DirectoryIterator
Definition directory_iterator.h:45
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:56
auto end() const -> DirectoryIterator
Definition directory_iterator.h:46
Definition error.h:7
Definition operations.h:6
di::Box<::DIR, DirDeleter > Dir
Definition directory_iterator.h:17
Definition directory_entry.h:11
DirectoryOptions
Definition directory_options.h:6
@ None
Definition directory_options.h:7
Definition directory_iterator.h:13
static void operator()(DIR *dir)