1#ifndef MSTL_CORE_FILE_PATH_HPP__
2#define MSTL_CORE_FILE_PATH_HPP__
3#include "MSTL/core/interface/istringify.hpp"
4#include "MSTL/core/iterator/path_iterator.hpp"
7class MSTL_API path :
public icommon<path>,
public istringify<path> {
13 explicit path(
string p) : path_(
_MSTL move(p)) {}
14 explicit path(
const string_view p) : path_(p) {}
15 explicit path(
const char* p) : path_(p) {}
17 path(
const path&) =
default;
18 path(path&&) noexcept = default;
19 path& operator =(const path&) = default;
20 path& operator =(path&&) noexcept = default;
22 MSTL_NODISCARD const
string& str() const noexcept {
return path_; }
23 MSTL_NODISCARD string_view view() const noexcept {
return path_.view(); }
24 MSTL_NODISCARD
const char* c_str() const noexcept {
return path_.c_str(); }
25 MSTL_NODISCARD
bool empty() const noexcept {
return path_.empty(); }
27 MSTL_NODISCARD path_iterator
begin() const noexcept {
return path_iterator(&path_, 0); }
28 MSTL_NODISCARD path_iterator
end() const noexcept {
return path_iterator(); }
30 MSTL_NODISCARD path parent_path()
const;
31 MSTL_NODISCARD string_view filename() const noexcept;
32 MSTL_NODISCARD string_view stem() const noexcept;
33 MSTL_NODISCARD string_view extension() const noexcept;
35 MSTL_NODISCARD path lexically_normal() const noexcept;
36 MSTL_NODISCARD path
absolute(const path& base = current_path()) const;
37 MSTL_NODISCARD path relative(const path& base) const;
39 static path current_path();
40 static path temp_directory_path();
42 path& operator /=(const path& p);
43 path& operator /=(string_view p);
44 path operator /(const path& p) const;
45 path operator /(string_view p) const;
47 MSTL_NODISCARD
bool exists() const noexcept;
48 MSTL_NODISCARD
bool is_directory() const noexcept;
49 MSTL_NODISCARD
bool is_file() const noexcept;
51 bool create_directories() const;
52 bool remove() const noexcept;
53 bool remove_directory() const noexcept;
54 bool remove_all_in_directory(
bool recursive = true) const noexcept;
55 bool remove_all() const noexcept;
57 bool copy(const path& to,
bool overwrite = true) const;
58 bool copy_directory(const path& destination,
bool overwrite = true) const;
59 bool move(const path& to,
bool overwrite = true) const noexcept;
60 bool rename(const path& new_name) const;
62 MSTL_NODISCARD static
bool exists(const
string& path) noexcept;
63 MSTL_NODISCARD static
bool is_directory(const
string& path) noexcept;
64 MSTL_NODISCARD static
bool is_file(const
string& path) noexcept;
65 MSTL_NODISCARD static string_view extension(string_view path) noexcept;
67 static
bool create_directories(const
string& path);
68 static
bool remove(const
string& path) noexcept;
69 static
bool remove_directory(const
string& path) noexcept;
70 static
bool remove_all_in_directory(const
string& directory_path,
bool recursive = true) noexcept;
71 static
bool remove_all(const
string& path) noexcept;
73 static
bool copy(const path& from, const path& to,
bool overwrite = true);
74 static
bool copy_directory(const path& source, const path& destination,
bool overwrite = true);
75 static
bool move(const path& from, const path& to,
bool overwrite = true) noexcept;
76 static
bool rename(const path& old_name, const path& new_name);
78 operator string_view() const noexcept {
return path_.view(); }
80 MSTL_NODISCARD
bool operator ==(
const path& rhs)
const noexcept;
81 MSTL_NODISCARD
bool operator <(
const path& rhs)
const noexcept;
83 MSTL_NODISCARD
size_t to_hash()
const;
84 MSTL_NODISCARD
string to_string()
const {
return lexically_normal().str(); }
86 void swap(path& rhs)
noexcept { path_.swap(rhs.path_); }
MSTL_CONST_FUNCTION constexpr enable_if_t< is_signed_v< T >, T > absolute(const T x) noexcept
取绝对值(有符号数版本)
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr Iterator remove(Iterator first, Iterator last, const T &value)
移除范围中等于指定值的元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
constexpr Iterator2 copy(Iterator1 first, Iterator1 last, Iterator2 result)
复制范围元素
void swap()=delete
删除无参数的swap重载
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr bool empty(const Container &cont) noexcept(noexcept(cont.empty()))
检查容器是否为空
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
MSTL_NODISCARD constexpr bool operator==(const T &rhs) const noexcept(noexcept(derived()==rhs))
相等比较运算符
MSTL_NODISCARD constexpr bool operator<(const T &rhs) const noexcept(noexcept(derived()< rhs))
小于比较运算符
MSTL_NODISCARD constexpr size_t to_hash() const noexcept(noexcept(derived().to_hash()))
获取对象的哈希值