5 # ifndef VCCC_DIRECTORY_DIRECTORY_H_
6 # define VCCC_DIRECTORY_DIRECTORY_H_
19 using iterator = std::filesystem::directory_iterator;
21 using entry = std::filesystem::directory_entry;
22 using path = std::filesystem::path;
23 using options = std::filesystem::directory_options;
27 virtual void for_each(std::function<
void(
const entry&)> f)
const = 0;
31 template<
typename DirectoryIterator>
32 struct di_concrete :
public di_base {
33 static_assert(!std::is_reference_v<DirectoryIterator>);
34 static_assert(!std::is_volatile_v<DirectoryIterator>);
35 static_assert(!std::is_const_v<DirectoryIterator>);
37 explicit di_concrete(DirectoryIterator it) : it_(
std::move(it)) {};
39 void for_each(std::function<
void(
const entry&)> f)
const override {
40 for(
const auto&
entry : it_) {
46 return std::is_same_v<DirectoryIterator, recursive_iterator>;
49 DirectoryIterator it_;
52 std::shared_ptr<di_base> ptr;
59 reset(recursive, path_);
63 bool recursive =
false) {
64 reset(recursive, path_, options_);
68 bool recursive =
false) {
69 reset(recursive, path_, ec);
73 std::error_code& ec,
bool recursive =
false) {
74 reset(recursive, path_, options_, ec);
77 template<
typename DirectoryIterator,
79 std::is_same_v<DirectoryIterator, iterator> ||
80 std::is_same_v<DirectoryIterator, recursive_iterator>,
83 : ptr(
std::make_shared<di_concrete<
std::decay_t<DirectoryIterator>>>(
std::move(it)))
86 template<
typename DirectoryIterator,
88 std::is_same_v<std::decay_t<DirectoryIterator>,
iterator> ||
92 ptr = std::make_shared<di_concrete<std::decay_t<DirectoryIterator>>>(std::move(it));
105 return ptr->is_recursive();
109 template<
typename ...Args>
110 static std::shared_ptr<di_concrete<iterator>> make_di(Args&&... args) {
111 return std::make_shared<di_concrete<iterator>>(
iterator(std::forward<Args>(args)...));
114 template<
typename ...Args>
115 static std::shared_ptr<di_concrete<recursive_iterator>> make_rdi(Args&&... args) {
116 return std::make_shared<di_concrete<recursive_iterator>>(
recursive_iterator(std::forward<Args>(args)...));
119 template<
typename ...Args>
120 void reset(
bool recursive, Args&&... args) {
122 ptr = make_rdi(std::forward<Args>(args)...);
124 ptr = make_di(std::forward<Args>(args)...);
Definition: directory.h:17
directory(const path &path_, options options_, bool recursive=false)
Definition: directory.h:62
std::filesystem::directory_options options
Definition: directory.h:23
directory(DirectoryIterator it)
Definition: directory.h:82
directory()
Definition: directory.h:55
void for_each(F func) const
Definition: directory.h:97
std::filesystem::recursive_directory_iterator recursive_iterator
Definition: directory.h:20
directory(const path &path_, bool recursive=false)
Definition: directory.h:58
std::filesystem::directory_iterator iterator
Definition: directory.h:19
bool is_recursive() const
Definition: directory.h:104
directory(const path &path_, options options_, std::error_code &ec, bool recursive=false)
Definition: directory.h:72
std::filesystem::path path
Definition: directory.h:22
directory(const path &path_, std::error_code &ec, bool recursive=false)
Definition: directory.h:67
directory & operator=(DirectoryIterator it)
Definition: directory.h:91
std::filesystem::directory_entry entry
Definition: directory.h:21
Definition: matrix.hpp:495
Definition: directory.h:12