From 0f239203a890494b3f147c9060f039d7c2eb5c37 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <63189531+kwvg@users.noreply.github.com> Date: Thu, 17 Mar 2022 21:24:26 +0100 Subject: [PATCH] partial bitcoin#24169: Add --enable-c++20 option excludes: - fae679065e4ef0c6383bbdd1876aaed6c1e40104 --- configure.ac | 8 ++++---- src/fs.h | 18 ++++++++++++++++-- src/scheduler.cpp | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index 4ffa815080..c4ff64bef7 100644 --- a/configure.ac +++ b/configure.ac @@ -72,11 +72,11 @@ AC_ARG_ENABLE([c++20], [use_cxx20=$enableval], [use_cxx20=no]) -dnl Require C++17 or C++20 compiler (no GNU extensions) -if test "x$use_cxx20" = xyes; then - AX_CXX_COMPILE_STDCXX([20], [noext], [mandatory]) -else +dnl Require C++17 compiler (no GNU extensions) +if test "$use_cxx20" = "no"; then AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory]) +else + AX_CXX_COMPILE_STDCXX([20], [noext], [mandatory]) fi dnl Check if -latomic is required for diff --git a/src/fs.h b/src/fs.h index 7d24346848..e50e7ef187 100644 --- a/src/fs.h +++ b/src/fs.h @@ -51,12 +51,26 @@ public: // Disallow std::string conversion method to avoid locale-dependent encoding on windows. 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 . // See https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=96e0367ead5d8dcac3bec2865582e76e2fbab190 path& make_preferred() { std::filesystem::path::make_preferred(); return *this; } 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 // locale-dependent encoding on windows. 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 // multibyte encoding, which on Windows corresponds to the current "code // page", which is unpredictable and typically not able to represent all - // valid paths. So std::filesystem::path::u8string() and - // std::filesystem::u8path() functions are used instead on Windows. On + // valid paths. So fs::path::u8string() and + // fs::u8path() functions are used instead on Windows. On // 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 // the path there are used. diff --git a/src/scheduler.cpp b/src/scheduler.cpp index a80ad24433..933cf2138a 100644 --- a/src/scheduler.cpp +++ b/src/scheduler.cpp @@ -109,7 +109,7 @@ static void Repeat(CScheduler& s, CScheduler::Function f, std::chrono::milliseco void CScheduler::scheduleEvery(CScheduler::Function f, std::chrono::milliseconds delta) { - scheduleFromNow([=] { Repeat(*this, f, delta); }, delta); + scheduleFromNow([this, f, delta] { Repeat(*this, f, delta); }, delta); } size_t CScheduler::getQueueInfo(std::chrono::system_clock::time_point& first,