VCCC  2024.05
VisualCamp Common C++ library
directory.h
Go to the documentation of this file.
1 # /*
2 # * Created by YongGyu Lee on 2021/06/02.
3 # */
4 #
5 # ifndef VCCC_DIRECTORY_DIRECTORY_H_
6 # define VCCC_DIRECTORY_DIRECTORY_H_
7 #
8 # include <filesystem>
9 # include <functional>
10 # include <memory>
11 
12 namespace vccc {
13 
16 
17 class directory {
18  public:
19  using iterator = std::filesystem::directory_iterator;
20  using recursive_iterator = std::filesystem::recursive_directory_iterator;
21  using entry = std::filesystem::directory_entry;
22  using path = std::filesystem::path;
23  using options = std::filesystem::directory_options;
24 
25  private:
26  struct di_base {
27  virtual void for_each(std::function<void(const entry&)> f) const = 0;
28  [[nodiscard]] virtual bool is_recursive() const = 0;
29  };
30 
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>);
36 
37  explicit di_concrete(DirectoryIterator it) : it_(std::move(it)) {};
38 
39  void for_each(std::function<void(const entry&)> f) const override {
40  for(const auto& entry : it_) {
41  f(entry);
42  }
43  }
44 
45  [[nodiscard]] bool is_recursive() const override {
46  return std::is_same_v<DirectoryIterator, recursive_iterator>;
47  }
48 
49  DirectoryIterator it_;
50  };
51 
52  std::shared_ptr<di_base> ptr;
53 
54  public:
56  : ptr(make_di()) {}
57 
58  explicit directory(const path& path_, bool recursive = false) {
59  reset(recursive, path_);
60  }
61 
62  directory(const path& path_, options options_,
63  bool recursive = false) {
64  reset(recursive, path_, options_);
65  }
66 
67  directory(const path& path_, std::error_code& ec,
68  bool recursive = false) {
69  reset(recursive, path_, ec);
70  }
71 
72  directory(const path& path_, options options_,
73  std::error_code& ec, bool recursive = false) {
74  reset(recursive, path_, options_, ec);
75  }
76 
77  template<typename DirectoryIterator,
78  std::enable_if_t<
79  std::is_same_v<DirectoryIterator, iterator> ||
80  std::is_same_v<DirectoryIterator, recursive_iterator>,
81  int> = 0>
82  explicit directory(DirectoryIterator it)
83  : ptr(std::make_shared<di_concrete<std::decay_t<DirectoryIterator>>>(std::move(it)))
84  {}
85 
86  template<typename DirectoryIterator,
87  std::enable_if_t<
88  std::is_same_v<std::decay_t<DirectoryIterator>, iterator> ||
89  std::is_same_v<std::decay_t<DirectoryIterator>, recursive_iterator>,
90  int> = 0>
91  directory& operator=(DirectoryIterator it) {
92  ptr = std::make_shared<di_concrete<std::decay_t<DirectoryIterator>>>(std::move(it));
93  return *this;
94  }
95 
96  template<typename F>
97  void for_each(F func) const {
98  ptr->for_each([&](const entry& entry) {
99  func(entry);
100  });
101  }
102 
103  [[nodiscard]]
104  bool is_recursive() const {
105  return ptr->is_recursive();
106  }
107 
108  private:
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)...));
112  }
113 
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)...));
117  }
118 
119  template<typename ...Args>
120  void reset(bool recursive, Args&&... args) {
121  if (recursive)
122  ptr = make_rdi(std::forward<Args>(args)...);
123  else
124  ptr = make_di(std::forward<Args>(args)...);
125  }
126 
127 };
128 
130 
131 } // namespace vccc
132 
133 #endif // VCCC_DIRECTORY_DIRECTORY_H_
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