mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 11:57:28 -03:00
Make fs.h C++20 compliant
Without the changes, the file will fail to compile under C++20 because char8_t can not be converted to char implicitly.
This commit is contained in:
parent
fae2220f4e
commit
fabb7c4ba6
1 changed files with 16 additions and 2 deletions
18
src/fs.h
18
src/fs.h
|
@ -51,12 +51,26 @@ public:
|
||||||
// Disallow std::string conversion method to avoid locale-dependent encoding on windows.
|
// Disallow std::string conversion method to avoid locale-dependent encoding on windows.
|
||||||
std::string string() const = delete;
|
std::string string() const = delete;
|
||||||
|
|
||||||
|
std::string u8string() const
|
||||||
|
{
|
||||||
|
const auto& utf8_str{std::filesystem::path::u8string()};
|
||||||
|
// utf8_str might either be std::string (C++17) or std::u8string
|
||||||
|
// (C++20). Convert both to std::string. This method can be removed
|
||||||
|
// after switching to C++20.
|
||||||
|
return std::string{utf8_str.begin(), utf8_str.end()};
|
||||||
|
}
|
||||||
|
|
||||||
// Required for path overloads in <fstream>.
|
// Required for path overloads in <fstream>.
|
||||||
// See https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=96e0367ead5d8dcac3bec2865582e76e2fbab190
|
// See https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=96e0367ead5d8dcac3bec2865582e76e2fbab190
|
||||||
path& make_preferred() { std::filesystem::path::make_preferred(); return *this; }
|
path& make_preferred() { std::filesystem::path::make_preferred(); return *this; }
|
||||||
path filename() const { return std::filesystem::path::filename(); }
|
path filename() const { return std::filesystem::path::filename(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline path u8path(const std::string& utf8_str)
|
||||||
|
{
|
||||||
|
return std::filesystem::u8path(utf8_str);
|
||||||
|
}
|
||||||
|
|
||||||
// Disallow implicit std::string conversion for absolute to avoid
|
// Disallow implicit std::string conversion for absolute to avoid
|
||||||
// locale-dependent encoding on windows.
|
// locale-dependent encoding on windows.
|
||||||
static inline path absolute(const path& p)
|
static inline path absolute(const path& p)
|
||||||
|
@ -116,8 +130,8 @@ static inline std::string PathToString(const path& path)
|
||||||
// use here, because these methods encode the path using C++'s narrow
|
// use here, because these methods encode the path using C++'s narrow
|
||||||
// multibyte encoding, which on Windows corresponds to the current "code
|
// multibyte encoding, which on Windows corresponds to the current "code
|
||||||
// page", which is unpredictable and typically not able to represent all
|
// page", which is unpredictable and typically not able to represent all
|
||||||
// valid paths. So std::filesystem::path::u8string() and
|
// valid paths. So fs::path::u8string() and
|
||||||
// std::filesystem::u8path() functions are used instead on Windows. On
|
// fs::u8path() functions are used instead on Windows. On
|
||||||
// POSIX, u8string/u8path functions are not safe to use because paths are
|
// POSIX, u8string/u8path functions are not safe to use because paths are
|
||||||
// not always valid UTF-8, so plain string methods which do not transform
|
// not always valid UTF-8, so plain string methods which do not transform
|
||||||
// the path there are used.
|
// the path there are used.
|
||||||
|
|
Loading…
Reference in a new issue