1#ifndef NEFORCE_CORE_FILE_PATH_TREE_HPP__
2#define NEFORCE_CORE_FILE_PATH_TREE_HPP__
15NEFORCE_BEGIN_NAMESPACE__
36class NEFORCE_API path_tree :
public istringify<path_tree> {
65 friend class path_tree;
89 path_(_NEFORCE
move(p)),
94 node& operator=(
const node&) =
delete;
96 node& operator=(
node&&) noexcept = default;
99 NEFORCE_NODISCARD const
path&
get_path() const noexcept {
return path_; }
105 NEFORCE_NODISCARD
size_t depth() const noexcept {
return depth_; }
111 NEFORCE_NODISCARD
bool is_file() const noexcept {
116 NEFORCE_NODISCARD
bool is_root() const noexcept {
return parent_.expired(); }
119 NEFORCE_NODISCARD
bool is_leaf() const noexcept {
return children_.empty(); }
122 NEFORCE_NODISCARD
ptr parent() const noexcept {
return parent_.lock(); }
128 NEFORCE_NODISCARD
size_t child_count() const noexcept {
return children_.size(); }
196 static void traverse_dfs_impl(
const node::ptr& current,
const visitor& v,
bool& stopped);
205 path_tree() =
default;
231 NEFORCE_NODISCARD
node::ptr
root() const noexcept {
return root_; }
234 NEFORCE_NODISCARD
bool empty() const noexcept {
return !root_; }
240 NEFORCE_NODISCARD
size_t size()
const;
380NEFORCE_END_NAMESPACE__
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
深度优先遍历(前序)
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
广度优先遍历
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)
获取当前线程名称
enable_shared_from() noexcept
filter custom_filter
自定义过滤器
size_t max_depth
最大扫描深度,0表示无限制
bool include_hidden
是否包含隐藏文件
vector< string > extensions
扩展名过滤
bool follow_symlinks
是否跟随符号链接
bool files_only
是否只包含文件(不包含目录节点)