NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
path_tree.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_PATH_TREE_HPP__
2#define NEFORCE_CORE_FILE_PATH_TREE_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
22
36class NEFORCE_API path_tree : public istringify<path_tree> {
37public:
41 enum class node_type : uint8_t {
42 unknown = 0,
43 directory = 1,
44 file = 2,
45 symlink = 3,
46 };
47
51 enum class visit_result : uint8_t {
52 proceed = 0,
53 skip = 1,
54 stop = 2,
55 };
56
64 class node : public enable_shared_from<node> {
65 friend class path_tree;
66
67 public:
69 using weak_ptr = _NEFORCE weak_ptr<node>;
71
72 private:
73 path path_;
74 node_type type_;
75 weak_ptr parent_;
76 children_list children_;
77 size_t depth_;
78
79 public:
80 node() = default;
81
88 explicit node(path p, node_type type, size_t depth = 0) :
89 path_(_NEFORCE move(p)),
90 type_(type),
91 depth_(depth) {}
92
93 node(const node&) = delete;
94 node& operator=(const node&) = delete;
95 node(node&&) noexcept = default;
96 node& operator=(node&&) noexcept = default;
97
99 NEFORCE_NODISCARD const path& get_path() const noexcept { return path_; }
100
102 NEFORCE_NODISCARD node_type type() const noexcept { return type_; }
103
105 NEFORCE_NODISCARD size_t depth() const noexcept { return depth_; }
106
108 NEFORCE_NODISCARD bool is_directory() const noexcept { return type_ == node_type::directory; }
109
111 NEFORCE_NODISCARD bool is_file() const noexcept {
112 return type_ == node_type::file || type_ == node_type::symlink;
113 }
114
116 NEFORCE_NODISCARD bool is_root() const noexcept { return parent_.expired(); }
117
119 NEFORCE_NODISCARD bool is_leaf() const noexcept { return children_.empty(); }
120
122 NEFORCE_NODISCARD ptr parent() const noexcept { return parent_.lock(); }
123
125 NEFORCE_NODISCARD const children_list& children() const noexcept { return children_; }
126
128 NEFORCE_NODISCARD size_t child_count() const noexcept { return children_.size(); }
129
135 NEFORCE_NODISCARD ptr find_child(string_view name) const noexcept;
136
141 void add_child(ptr child);
142
149 };
150
157
163 using filter = function<bool(const node&)>;
164
171 size_t max_depth = 0;
172
174 bool include_hidden = false;
175
177 bool follow_symlinks = false;
178
180 bool files_only = false;
181
183 bool dirs_only = false;
184
187
190 };
191
192private:
193 node::ptr root_;
194
195 static void scan_impl(const node::ptr& parent, const scan_options& options, size_t current_depth);
196 static void traverse_dfs_impl(const node::ptr& current, const visitor& v, bool& stopped);
197 static void collect_impl(const node::ptr& current, const filter& f, vector<node::ptr>& result);
198 static node::ptr clone_node(const node::ptr& src, const node::ptr& new_parent, size_t depth);
199
200 static node::ptr prune_impl(const node::ptr& src, const filter& f, const node::ptr& new_parent, size_t depth);
201
202 string to_string_impl(const node::ptr& n, string_view indent, size_t depth) const;
203
204public:
205 path_tree() = default;
206
211 explicit path_tree(path root_path) :
212 root_(make_shared<node>(_NEFORCE move(root_path), node_type::directory, 0)) {}
213
214 path_tree(const path_tree&) = default;
215 path_tree(path_tree&&) noexcept = default;
216 path_tree& operator=(const path_tree&) = default;
217 path_tree& operator=(path_tree&&) noexcept = default;
218
228 NEFORCE_NODISCARD static path_tree scan(const path& root, const scan_options& options);
229
231 NEFORCE_NODISCARD node::ptr root() const noexcept { return root_; }
232
234 NEFORCE_NODISCARD bool empty() const noexcept { return !root_; }
235
240 NEFORCE_NODISCARD size_t size() const;
241
246 NEFORCE_NODISCARD size_t max_depth() const;
247
253 NEFORCE_NODISCARD node::ptr find(const path& p) const;
254
260 NEFORCE_NODISCARD vector<node::ptr> find_all(string_view name) const;
261
267 NEFORCE_NODISCARD vector<node::ptr> find_if(const filter& f) const;
268
274 NEFORCE_NODISCARD vector<node::ptr> find_by_extension(string_view ext) const;
275
283 void traverse_dfs(const visitor& visitor) const;
284
289 void traverse_bfs(const visitor& visitor) const;
290
295 void traverse_files(const visitor& visitor) const;
296
301 void traverse_dirs(const visitor& visitor) const;
302
312
318 bool remove(const path& p);
319
326 void merge(const path_tree& other);
327
335 NEFORCE_NODISCARD path_tree subtree(const path& p) const;
336
344 NEFORCE_NODISCARD path_tree prune(const filter& f) const;
345
350 NEFORCE_NODISCARD vector<path> all_paths() const;
351
356 NEFORCE_NODISCARD vector<path> all_file_paths() const;
357
362 NEFORCE_NODISCARD vector<path> all_dir_paths() const;
363
368 NEFORCE_NODISCARD string to_string() const;
369
375 NEFORCE_NODISCARD string to_string(string_view indent) const;
376};
377 // File
379
380NEFORCE_END_NAMESPACE__
381#endif // NEFORCE_CORE_FILE_PATH_TREE_HPP__
文件操作类
函数包装器主模板声明
路径树节点
bool remove_child(string_view name) noexcept
移除指定子节点
vector< ptr > children_list
子节点列表
NEFORCE_NODISCARD bool is_leaf() const noexcept
是否为叶节点(无子节点)
NEFORCE_NODISCARD const children_list & children() const noexcept
获取子节点列表
_NEFORCE weak_ptr< node > weak_ptr
节点弱指针
shared_ptr< node > ptr
节点共享指针
NEFORCE_NODISCARD ptr find_child(string_view name) const noexcept
按名称查找直接子节点
NEFORCE_NODISCARD const path & get_path() const noexcept
获取路径
NEFORCE_NODISCARD size_t depth() const noexcept
获取节点深度
NEFORCE_NODISCARD bool is_root() const noexcept
是否为根节点
void add_child(ptr child)
添加子节点
NEFORCE_NODISCARD size_t child_count() const noexcept
获取子节点数量
NEFORCE_NODISCARD bool is_directory() const noexcept
是否为目录
NEFORCE_NODISCARD bool is_file() const noexcept
是否为文件
node(path p, node_type type, size_t depth=0)
构造节点
NEFORCE_NODISCARD ptr parent() const noexcept
获取父节点
NEFORCE_NODISCARD node_type type() const noexcept
获取节点类型
文件路径树
NEFORCE_NODISCARD string to_string() const
将树格式化为可读字符串
void traverse_files(const visitor &visitor) const
仅遍历文件节点(深度优先)
NEFORCE_NODISCARD node::ptr find(const path &p) const
通过绝对路径查找节点
NEFORCE_NODISCARD path_tree subtree(const path &p) const
获取以指定路径为根的子树
NEFORCE_NODISCARD node::ptr root() const noexcept
获取根节点
NEFORCE_NODISCARD vector< path > all_dir_paths() const
收集树中所有目录路径
NEFORCE_NODISCARD vector< node::ptr > find_if(const filter &f) const
通过过滤器查找所有匹配节点
function< visit_result(const node &)> visitor
节点访问回调类型
NEFORCE_NODISCARD vector< path > all_file_paths() const
收集树中所有文件路径
NEFORCE_NODISCARD bool empty() const noexcept
树是否为空
path_tree(path root_path)
从路径构造树
void traverse_dfs(const visitor &visitor) const
深度优先遍历(前序)
visit_result
遍历控制指令
NEFORCE_NODISCARD vector< node::ptr > find_all(string_view name) const
通过文件名查找所有匹配节点
function< bool(const node &)> filter
节点过滤器类型
NEFORCE_NODISCARD vector< node::ptr > find_by_extension(string_view ext) const
通过扩展名查找所有文件节点
NEFORCE_NODISCARD path_tree prune(const filter &f) const
按过滤器裁剪树,返回只含满足条件节点的新树
void traverse_bfs(const visitor &visitor) const
广度优先遍历
node_type
节点类型枚举
void traverse_dirs(const visitor &visitor) const
仅遍历目录节点(深度优先)
NEFORCE_NODISCARD string to_string(string_view indent) const
将树格式化为可读字符串
static NEFORCE_NODISCARD path_tree scan(const path &root, const scan_options &options)
从文件系统扫描构建路径树
NEFORCE_NODISCARD size_t max_depth() const
获取树的最大深度
void merge(const path_tree &other)
将另一棵树合并到当前树
NEFORCE_NODISCARD size_t size() const
获取树中节点总数
NEFORCE_NODISCARD vector< path > all_paths() const
收集树中所有路径
node::ptr insert(const path &p, node_type type=node_type::file)
手动插入路径节点
bool remove(const path &p)
移除指定路径的节点及其子树
文件路径类
共享智能指针类模板
动态大小数组容器
通用函数包装器
unsigned char uint8_t
8位无符号整数类型
enable_if_t<!is_unbounded_array_v< T > &&is_constructible_v< T, Args... >, shared_ptr< T > > make_shared(Args &&... args)
融合分配创建共享指针
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
NEFORCE_ALWAYS_INLINE_INLINE bool name(char *buffer, size_t size)
获取当前线程名称
文件路径类
可字符串化接口
文件系统扫描选项
filter custom_filter
自定义过滤器
size_t max_depth
最大扫描深度,0表示无限制
bool include_hidden
是否包含隐藏文件
vector< string > extensions
扩展名过滤
bool dirs_only
是否只包含目录
bool follow_symlinks
是否跟随符号链接
bool files_only
是否只包含文件(不包含目录节点)
弱智能指针实现