NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
path.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_PATH_HPP__
2#define NEFORCE_CORE_FILE_PATH_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
22class NEFORCE_API path_tree;
23
24
36class NEFORCE_API path : public icommon<path>, public istringify<path> {
37public:
43 static constexpr size_t buffer_size = 8192;
44
50 static constexpr auto spliter =
51#ifdef NEFORCE_PLATFORM_WINDOWS
52 "\\/";
53#elif defined(NEFORCE_PLATFORM_LINUX)
54 "/";
55#endif
56
62 static constexpr char preferred_separator = spliter[0];
63
64
77 public:
80 using pointer = void;
83
84 private:
85 const string* path_ = nullptr;
86 size_t start_ = 0;
87 size_t end_ = 0;
88 bool done_ = true;
89 string current_part_;
90
96 void find_next();
97
98 public:
104 split_iterator() noexcept = default;
105
114 explicit split_iterator(const string* path, const size_t pos = 0) :
115 path_(path),
116 start_(pos),
117 done_(false) {
118 if (!path_ || path_->empty() || start_ >= path_->size()) {
119 done_ = true;
120 return;
121 }
122 find_next();
123 }
124
131 reference operator*() const noexcept { return current_part_.view(); }
132
140 if (done_) {
141 return *this;
142 }
143 start_ = end_ + 1;
144 if (start_ >= path_->size()) {
145 done_ = true;
146 current_part_ = {};
147 } else {
148 find_next();
149 }
150 return *this;
151 }
152
158 split_iterator tmp = *this;
159 ++*this;
160 return tmp;
161 }
162
172 NEFORCE_NODISCARD bool operator==(const split_iterator& b) const noexcept {
173 if (done_ && b.done_) {
174 return true;
175 }
176 if (path_ != b.path_) {
177 return false;
178 }
179 return start_ == b.start_;
180 }
181
187 NEFORCE_NODISCARD bool operator!=(const split_iterator& b) const noexcept { return !(*this == b); }
188 };
189
190private:
191 string path_{};
192
193public:
197 path() = default;
198
203 explicit path(string path) noexcept :
204 path_(_NEFORCE move(path)) {}
205
210 explicit path(const string_view path) :
211 path_(path) {}
212
217 explicit path(const char* path) :
218 path_(path) {}
219
220 path(const path&) = default;
221 path(path&&) noexcept = default;
222 path& operator=(const path&) = default;
223 path& operator=(path&&) noexcept = default;
224
229 NEFORCE_NODISCARD const string& str() const noexcept { return path_; }
230
235 NEFORCE_NODISCARD string_view view() const noexcept { return path_.view(); }
236
241 NEFORCE_NODISCARD const char* data() const noexcept { return path_.data(); }
242
247 NEFORCE_NODISCARD bool empty() const noexcept { return path_.empty(); }
248
253 NEFORCE_NODISCARD split_iterator begin() const { return split_iterator(&path_, 0); }
254
259 NEFORCE_NODISCARD split_iterator end() const { return split_iterator(); }
260
265 NEFORCE_NODISCARD path parent_path() const;
266
273 NEFORCE_NODISCARD string_view filename() const noexcept;
274
281 NEFORCE_NODISCARD string_view stem() const noexcept;
282
289 NEFORCE_NODISCARD string_view extension() const noexcept;
290
297 NEFORCE_NODISCARD path lexically_normal() const;
298
306 NEFORCE_NODISCARD path absolute(const path& base = current_path()) const;
307
315 NEFORCE_NODISCARD path relative(const path& base) const;
316
322
328
336 path& operator/=(const path& other);
337
343 path& operator/=(string_view other);
344
350 path operator/(const path& other) const;
351
357 path operator/(string_view pth) const;
358
363 NEFORCE_NODISCARD path_tree to_tree() const;
364
370 NEFORCE_NODISCARD vector<path> children(bool include_hidden = false) const;
371
377 NEFORCE_NODISCARD vector<path> child_files(bool include_hidden = false) const;
378
384 NEFORCE_NODISCARD vector<path> child_dirs(bool include_hidden = false) const;
385
390 NEFORCE_NODISCARD bool exists() const noexcept;
391
396 NEFORCE_NODISCARD bool is_directory() const noexcept;
397
402 NEFORCE_NODISCARD bool is_file() const noexcept;
403
409 NEFORCE_NODISCARD static bool exists(const string& path) noexcept;
410
416 NEFORCE_NODISCARD static bool is_directory(const string& path) noexcept;
417
423 NEFORCE_NODISCARD static bool is_file(const string& path) noexcept;
424
430 NEFORCE_NODISCARD static string_view extension(string_view path) noexcept;
431
435 explicit operator string_view() const noexcept { return path_.view(); }
436
442 NEFORCE_NODISCARD bool operator==(const path& rhs) const;
443
449 NEFORCE_NODISCARD bool operator<(const path& rhs) const;
450
455 NEFORCE_NODISCARD size_t to_hash() const;
456
461 NEFORCE_NODISCARD string to_string() const { return lexically_normal().str(); }
462
467 void swap(path& other) noexcept { path_.swap(other.path_); }
468};
469 // File
471
472NEFORCE_END_NAMESPACE__
473#endif // NEFORCE_CORE_FILE_PATH_HPP__
NEFORCE_NODISCARD constexpr basic_string_view view(const size_type off, size_type count=npos) const
获取子视图
路径分割迭代器
forward_iterator_tag iterator_category
迭代器类别
reference operator*() const noexcept
解引用操作符
split_iterator & operator++()
前置递增操作符
NEFORCE_NODISCARD bool operator==(const split_iterator &b) const noexcept
相等比较操作符
value_type reference
引用类型
split_iterator operator++(int)
后置递增操作符
split_iterator() noexcept=default
默认构造函数
void pointer
指针类型
string_view value_type
值类型
ptrdiff_t difference_type
差值类型
NEFORCE_NODISCARD bool operator!=(const split_iterator &b) const noexcept
不等比较操作符
文件路径树
文件路径类
path()=default
默认构造函数,创建空路径
path(string path) noexcept
从字符串构造路径
NEFORCE_NODISCARD bool operator==(const path &rhs) const
相等比较
NEFORCE_NODISCARD path absolute(const path &base=current_path()) const
获取绝对路径
NEFORCE_NODISCARD split_iterator begin() const
获取起始路径组件迭代器
NEFORCE_NODISCARD const char * data() const noexcept
获取C风格字符串
NEFORCE_NODISCARD path parent_path() const
获取父路径
NEFORCE_NODISCARD string_view stem() const noexcept
获取文件主名(不含扩展名)
NEFORCE_NODISCARD const string & str() const noexcept
获取路径字符串
NEFORCE_NODISCARD vector< path > child_dirs(bool include_hidden=false) const
获取直接子目录路径列表
static constexpr size_t buffer_size
文件操作缓冲区大小
NEFORCE_NODISCARD path_tree to_tree() const
扫描此路径(必须为目录)并返回路径树
path(const string_view path)
从字符串视图构造路径
NEFORCE_NODISCARD size_t to_hash() const
计算哈希值
static path current_path()
获取当前工作目录
NEFORCE_NODISCARD string to_string() const
转换为字符串
NEFORCE_NODISCARD split_iterator end() const
获取结束路径组件迭代器
NEFORCE_NODISCARD vector< path > children(bool include_hidden=false) const
获取直接子路径列表(非递归)
NEFORCE_NODISCARD path lexically_normal() const
规范化路径
NEFORCE_NODISCARD string_view view() const noexcept
获取路径字符串视图
NEFORCE_NODISCARD bool operator<(const path &rhs) const
小于比较
NEFORCE_NODISCARD string_view filename() const noexcept
获取文件名
NEFORCE_NODISCARD path relative(const path &base) const
获取相对于另一路径的路径
NEFORCE_NODISCARD bool is_directory() const noexcept
检查路径是否为目录
NEFORCE_NODISCARD bool is_file() const noexcept
检查路径是否为普通文件
void swap(path &other) noexcept
交换两个路径
static path temp_directory_path()
获取临时目录路径
path(const char *path)
从C风格字符串构造路径
NEFORCE_NODISCARD bool empty() const noexcept
检查路径是否为空
NEFORCE_NODISCARD string_view extension() const noexcept
获取文件扩展名
static constexpr auto spliter
路径分隔符集合
NEFORCE_NODISCARD vector< path > child_files(bool include_hidden=false) const
获取直接子文件路径列表
NEFORCE_NODISCARD bool exists() const noexcept
检查路径是否存在
动态大小数组容器
int64_t ptrdiff_t
指针差类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
可字符串化接口
前向迭代器标签
通用接口,同时具备可比较和可哈希功能
可字符串化接口
动态大小数组容器