mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-13 15:59:23 +01:00
Work around C++20 std::filesystem changes related to u8string
This commit is contained in:
parent
f08aa2d842
commit
c0a6fa5dcc
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "Common/CommonPaths.h"
|
#include "Common/CommonPaths.h"
|
||||||
#include "Common/FileSearch.h"
|
#include "Common/FileSearch.h"
|
||||||
|
#include "Common/StringUtil.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
@ -74,7 +75,7 @@ std::vector<std::string> DoFileSearch(const std::vector<std::string>& directorie
|
|||||||
|
|
||||||
std::vector<fs::path> native_exts;
|
std::vector<fs::path> native_exts;
|
||||||
for (const auto& ext : exts)
|
for (const auto& ext : exts)
|
||||||
native_exts.push_back(fs::u8path(ext));
|
native_exts.push_back(StringToPath(ext));
|
||||||
|
|
||||||
// N.B. This avoids doing any copies
|
// N.B. This avoids doing any copies
|
||||||
auto ext_matches = [&native_exts](const fs::path& path) {
|
auto ext_matches = [&native_exts](const fs::path& path) {
|
||||||
@ -93,11 +94,11 @@ std::vector<std::string> DoFileSearch(const std::vector<std::string>& directorie
|
|||||||
auto add_filtered = [&](const fs::directory_entry& entry) {
|
auto add_filtered = [&](const fs::directory_entry& entry) {
|
||||||
auto& path = entry.path();
|
auto& path = entry.path();
|
||||||
if (accept_all || (ext_matches(path) && !fs::is_directory(path)))
|
if (accept_all || (ext_matches(path) && !fs::is_directory(path)))
|
||||||
result.emplace_back(path.u8string());
|
result.emplace_back(PathToString(path));
|
||||||
};
|
};
|
||||||
for (const auto& directory : directories)
|
for (const auto& directory : directories)
|
||||||
{
|
{
|
||||||
const fs::path directory_path = fs::u8path(directory);
|
const fs::path directory_path = StringToPath(directory);
|
||||||
if (fs::is_directory(directory_path)) // Can't create iterators for non-existant directories
|
if (fs::is_directory(directory_path)) // Can't create iterators for non-existant directories
|
||||||
{
|
{
|
||||||
if (recursive)
|
if (recursive)
|
||||||
|
@ -623,3 +623,26 @@ std::string UTF16BEToUTF8(const char16_t* str, size_t max_size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_STD_FILESYSTEM
|
||||||
|
// This is a replacement for path::u8path, which is deprecated starting with C++20.
|
||||||
|
std::filesystem::path StringToPath(std::string_view path)
|
||||||
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
return std::filesystem::path(UTF8ToUTF16(std::string(path)));
|
||||||
|
#else
|
||||||
|
return std::filesystem::path(path);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a replacement for path::u8string that always has the return type std::string.
|
||||||
|
// path::u8string returns std::u8string starting with C++20, which is annoying to convert.
|
||||||
|
std::string PathToString(const std::filesystem::path& path)
|
||||||
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
return UTF16ToUTF8(path.native());
|
||||||
|
#else
|
||||||
|
return path.native();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -14,6 +14,11 @@
|
|||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <filesystem>
|
||||||
|
#define HAS_STD_FILESYSTEM
|
||||||
|
#endif
|
||||||
|
|
||||||
std::string StringFromFormatV(const char* format, va_list args);
|
std::string StringFromFormatV(const char* format, va_list args);
|
||||||
|
|
||||||
std::string StringFromFormat(const char* format, ...)
|
std::string StringFromFormat(const char* format, ...)
|
||||||
@ -153,6 +158,11 @@ inline std::string UTF8ToTStr(const std::string& str)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_STD_FILESYSTEM
|
||||||
|
std::filesystem::path StringToPath(std::string_view path);
|
||||||
|
std::string PathToString(const std::filesystem::path& path);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Thousand separator. Turns 12345678 into 12,345,678
|
// Thousand separator. Turns 12345678 into 12,345,678
|
||||||
template <typename I>
|
template <typename I>
|
||||||
std::string ThousandSeparate(I value, int spaces = 0)
|
std::string ThousandSeparate(I value, int spaces = 0)
|
||||||
|
@ -88,7 +88,7 @@ static std::vector<std::string> ReadM3UFile(const std::string& m3u_path,
|
|||||||
if (!line.empty() && line.front() != '#') // Comments start with #
|
if (!line.empty() && line.front() != '#') // Comments start with #
|
||||||
{
|
{
|
||||||
#ifdef HAS_STD_FILESYSTEM
|
#ifdef HAS_STD_FILESYSTEM
|
||||||
const std::string path_to_add = (fs::u8path(folder_path) / fs::u8path(line)).u8string();
|
const std::string path_to_add = PathToString(StringToPath(folder_path) / StringToPath(line));
|
||||||
#else
|
#else
|
||||||
const std::string path_to_add = line.front() != '/' ? folder_path + line : line;
|
const std::string path_to_add = line.front() != '/' ? folder_path + line : line;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user