From 8cecc421f38e55ef46eb8828884d801e2528300c Mon Sep 17 00:00:00 2001 From: Reupen Shah Date: Sat, 4 Dec 2021 21:22:23 +0000 Subject: [PATCH] Migrate to C++20 This migrates from C++17 to C++20. --- README.md | 2 ++ fbh | 2 +- foo_ui_columns/.clang-format | 2 +- foo_ui_columns/artwork.cpp | 4 +-- foo_ui_columns/artwork_helpers.cpp | 4 +-- foo_ui_columns/buttons_button_image.cpp | 2 +- foo_ui_columns/commandline.cpp | 36 +++++++++---------- foo_ui_columns/config_vars.cpp | 10 +++--- foo_ui_columns/file_info_reader.cpp | 6 ++-- foo_ui_columns/foo_ui_columns.vcxproj | 8 ++--- foo_ui_columns/main_window.cpp | 4 +-- .../ng_playlist/ng_playlist_artwork.cpp | 6 ++-- foo_ui_columns/rebar_band.h | 20 ++--------- foo_ui_columns/splitter_utils.cpp | 4 +-- foo_ui_columns/splitter_utils.h | 4 +-- foo_ui_columns/stdafx.h | 2 ++ foo_ui_columns/title_formatting.cpp | 2 +- foo_ui_columns/version.h.template | 2 +- mmh | 2 +- ui_helpers | 2 +- 20 files changed, 56 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index a09e687b6..148a5af95 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,8 @@ msbuild /m /p:Platform=Win32 /p:Configuration=Release /t:Rebuild vc16\columns_ui #### Using the Clang compiler (experimental) +Note: Currently not functional out of the box – should be functional again when the LLVM bundled with Visual Studio is updated to version 13. + Columns UI can be also compiled using the version of Clang distributed with Visual Studio. (Note that Clang is not installed by default – in the Visual Studio 2019 installer, you will need to select the Clang compiler and the Clang build tools components.) diff --git a/fbh b/fbh index fb6f85d14..05f033d15 160000 --- a/fbh +++ b/fbh @@ -1 +1 @@ -Subproject commit fb6f85d143da42c5206715c627ea54724cc1524d +Subproject commit 05f033d15dd8c00cf1c97462e2e1e7dcfcbbde32 diff --git a/foo_ui_columns/.clang-format b/foo_ui_columns/.clang-format index 48ed1a161..1f833e1f5 100644 --- a/foo_ui_columns/.clang-format +++ b/foo_ui_columns/.clang-format @@ -152,7 +152,7 @@ SpacesInParentheses: false SpacesInSquareBrackets: false SpaceBeforeSquareBrackets: false BitFieldColonSpacing: Both -Standard: c++17 +Standard: c++20 StatementMacros: - Q_UNUSED - QT_REQUIRE_VERSION diff --git a/foo_ui_columns/artwork.cpp b/foo_ui_columns/artwork.cpp index b24f74c68..a72cdb072 100644 --- a/foo_ui_columns/artwork.cpp +++ b/foo_ui_columns/artwork.cpp @@ -417,7 +417,7 @@ void ArtworkPanel::show_stub_image() const auto bitmap_data = cui::wic::decode_image_data(data->get_ptr(), data->get_size()); m_image = cui::gdip::create_bitmap_from_wic_data(bitmap_data); } catch (const std::exception& ex) { - fbh::print_to_console(u8"Artwork panel – loading stub image failed: ", ex.what()); + fbh::print_to_console(u8"Artwork panel – loading stub image failed: "_pcc, ex.what()); } } @@ -444,7 +444,7 @@ bool ArtworkPanel::refresh_image(std::optional artwork_type_index_overri const auto bitmap_data = cui::wic::decode_image_data(data->get_ptr(), data->get_size()); m_image = cui::gdip::create_bitmap_from_wic_data(bitmap_data); } catch (const std::exception& ex) { - fbh::print_to_console(u8"Artwork panel – loading image failed: ", ex.what()); + fbh::print_to_console(u8"Artwork panel – loading image failed: "_pcc, ex.what()); return false; } diff --git a/foo_ui_columns/artwork_helpers.cpp b/foo_ui_columns/artwork_helpers.cpp index b7fb66e90..15f4d6601 100644 --- a/foo_ui_columns/artwork_helpers.cpp +++ b/foo_ui_columns/artwork_helpers.cpp @@ -233,7 +233,7 @@ DWORD ArtworkReader::on_thread() } catch (pfc::exception const& e) { m_content.clear(); console::formatter formatter; - formatter << u8"Artwork view – unhandled error reading artwork: " << e.what(); + formatter << u8"Artwork view – unhandled error reading artwork: "_pcc << e.what(); ret = -1; } ArtworkReaderNotification::g_run(m_manager, b_aborted, ret, this); @@ -252,7 +252,7 @@ album_art_data_ptr query_artwork_data( throw; } catch (exception_album_art_not_found const&) { } catch (exception_io const& ex) { - fbh::print_to_console(u8"Artwork view – error loading artwork: ", ex.what()); + fbh::print_to_console(u8"Artwork view – error loading artwork: "_pcc, ex.what()); } return {}; diff --git a/foo_ui_columns/buttons_button_image.cpp b/foo_ui_columns/buttons_button_image.cpp index 4f17b8860..24cfaad4b 100644 --- a/foo_ui_columns/buttons_button_image.cpp +++ b/foo_ui_columns/buttons_button_image.cpp @@ -38,7 +38,7 @@ void ButtonsToolbar::ButtonImage::load(const Button::CustomImage& p_image) try { m_bm = cui::wic::create_hbitmap_from_path(fullPath).release(); } catch (const std::exception& ex) { - fbh::print_to_console(u8"Buttons toolbar – loading image failed: ", ex.what()); + fbh::print_to_console(u8"Buttons toolbar – loading image failed: "_pcc, ex.what()); m_bm = nullptr; } } diff --git a/foo_ui_columns/commandline.cpp b/foo_ui_columns/commandline.cpp index d9f78f22c..655bd6279 100644 --- a/foo_ui_columns/commandline.cpp +++ b/foo_ui_columns/commandline.cpp @@ -1,17 +1,17 @@ #include "stdafx.h" #include "fcl.h" -static const char* g_help_text = u8"syntax: foobar2000 /columnsui: \"\"\n\n" - "Available commands:\n" - "help, ? – displays this command-line help\n" - "import – imports an fcl file\n" - "import-quiet – imports an fcl file without confirmation dialog boxes"; +static const char8_t* g_help_text = u8"syntax: foobar2000 /columnsui: \"\"\n\n" + u8"Available commands:\n" + u8"help, ? – displays this command-line help\n" + u8"import – imports an fcl file\n" + u8"import-quiet – imports an fcl file without confirmation dialog boxes"; class HelpCommandLineHandler : public commandline_handler { public: result on_token(const char* token) override { - if (stricmp_utf8_partial(token, u8"/columnsui:help") != 0 && stricmp_utf8_partial(token, u8"/columnsui:?") != 0) + if (stricmp_utf8_partial(token, "/columnsui:help") != 0 && stricmp_utf8_partial(token, "/columnsui:?") != 0) return RESULT_NOT_OURS; execute(); @@ -21,7 +21,7 @@ class HelpCommandLineHandler : public commandline_handler { { HWND parent = core_api::get_main_window(); static_api_ptr_t()->activate(); - uMessageBox(parent, g_help_text, u8"Columns UI command-line help", 0); + uMessageBox(parent, reinterpret_cast(g_help_text), "Columns UI command-line help", 0); } }; @@ -63,16 +63,16 @@ class ImportCommandLineHandler : public commandline_handler { CommandLineSingleFileHelper m_single_file_helper; ImportCommandLineHandler() - : m_single_file_helper{u8"Import configuration – Columns UI", u8"No file to import specified.", - u8"Too many files to import specified. You can only import one file at a time, " + : m_single_file_helper{u8"Import configuration – Columns UI"_pcc, "No file to import specified.", + "Too many files to import specified. You can only import one file at a time, " "and should use double quotes around paths containing spaces."} { } result on_token(const char* token) override { - m_is_quiet = !stricmp_utf8(token, u8"/columnsui:import-quiet"); - const auto is_import = m_is_quiet || !stricmp_utf8(token, u8"/columnsui:import"); + m_is_quiet = !stricmp_utf8(token, "/columnsui:import-quiet"); + const auto is_import = m_is_quiet || !stricmp_utf8(token, "/columnsui:import"); if (!is_import) return RESULT_NOT_OURS; @@ -98,9 +98,9 @@ class ImportCommandLineHandler : public commandline_handler { if (!is_quiet) { static_api_ptr_t()->activate(); if (uMessageBox(main_window, - formatter << u8"Are you sure you want to import " << pfc::string_filename_ext(path) - << u8"? Your current Columns UI configuration will be lost.", - u8"Import configuration", MB_YESNO) + formatter << "Are you sure you want to import " << pfc::string_filename_ext(path) + << "? Your current Columns UI configuration will be lost.", + "Import configuration", MB_YESNO) == IDNO) { return; } @@ -115,16 +115,16 @@ class ExportCommandLineHandler : public commandline_handler { CommandLineSingleFileHelper m_single_file_helper; ExportCommandLineHandler() - : m_single_file_helper{u8"Export configuration – Columns UI", u8"No file to export to specified.", - u8"Too many destination files specified. You must specify only one destination path, " + : m_single_file_helper{u8"Export configuration – Columns UI"_pcc, "No file to export to specified.", + "Too many destination files specified. You must specify only one destination path, " "and should use double quotes around paths containing spaces."} { } result on_token(const char* token) override { - m_is_quiet = !stricmp_utf8(token, u8"/columnsui:export-quiet"); - const auto is_import = m_is_quiet || !stricmp_utf8(token, u8"/columnsui:export"); + m_is_quiet = !stricmp_utf8(token, "/columnsui:export-quiet"); + const auto is_import = m_is_quiet || !stricmp_utf8(token, "/columnsui:export"); if (!is_import) return RESULT_NOT_OURS; diff --git a/foo_ui_columns/config_vars.cpp b/foo_ui_columns/config_vars.cpp index 05ff60663..f744fbba7 100644 --- a/foo_ui_columns/config_vars.cpp +++ b/foo_ui_columns/config_vars.cpp @@ -143,11 +143,11 @@ cfg_string cfg_colour( ConfigMenuItem cfg_playlist_double(GUID{0xffc47d9d, 0xb43d, 0x8fad, {0x8f, 0xb3, 0x42, 0x84, 0xbf, 0x9a, 0x22, 0x2a}}); cfg_string cfg_playlist_switcher_tagz( GUID{0x13f4b9ae, 0x5db5, 0xb083, {0x15, 0x36, 0x08, 0x4d, 0x55, 0xe3, 0xb5, 0x64}}, - u8"%title%\r\n" - u8"\r\n" - u8"$tab()\r\n" - u8"\r\n" - u8"$if(%is_playing%,🔉)"); + reinterpret_cast(u8"%title%\r\n" + u8"\r\n" + u8"$tab()\r\n" + u8"\r\n" + u8"$if(%is_playing%,🔉)")); // {F006EC50-7F52-4037-9D48-7447BBF742AA} static const GUID guid_columns = {0xf006ec50, 0x7f52, 0x4037, {0x9d, 0x48, 0x74, 0x47, 0xbb, 0xf7, 0x42, 0xaa}}; diff --git a/foo_ui_columns/file_info_reader.cpp b/foo_ui_columns/file_info_reader.cpp index 3c21ff102..919657edc 100644 --- a/foo_ui_columns/file_info_reader.cpp +++ b/foo_ui_columns/file_info_reader.cpp @@ -62,12 +62,12 @@ std::shared_ptr FullFileInfoRequest::get_safe(const char* reques if (error_message == nullptr) { error_message = "Unknown error"; } - formatter << requester_name << u8": Error reading file info for track \"" << display_path << u8"\": " - << error_message; + formatter << requester_name << ": Error reading file info for track \"" << display_path + << "\": " << error_message; } catch (...) { pfc::string8 display_path; filesystem::g_get_display_path(m_track->get_path(), display_path); - formatter << requester_name << u8": Unknown error reading file info for track \"" << display_path << u8"\""; + formatter << requester_name << ": Unknown error reading file info for track \"" << display_path << "\""; } return nullptr; } diff --git a/foo_ui_columns/foo_ui_columns.vcxproj b/foo_ui_columns/foo_ui_columns.vcxproj index 4b80c89b0..9d1482153 100644 --- a/foo_ui_columns/foo_ui_columns.vcxproj +++ b/foo_ui_columns/foo_ui_columns.vcxproj @@ -108,7 +108,7 @@ /Zc:preprocessor /source-charset:utf-8 %(AdditionalOptions) true false - stdcpp17 + stdcpp20 MultiThreaded true Caret @@ -154,7 +154,7 @@ /Zc:preprocessor /source-charset:utf-8 %(AdditionalOptions) true false - stdcpp17 + stdcpp20 MultiThreaded true Caret @@ -203,7 +203,7 @@ Level3 true EditAndContinue - stdcpp17 + stdcpp20 true Caret @@ -248,7 +248,7 @@ Level3 true EditAndContinue - stdcpp17 + stdcpp20 true Caret diff --git a/foo_ui_columns/main_window.cpp b/foo_ui_columns/main_window.cpp index 5c7ed541d..846dc1ca3 100644 --- a/foo_ui_columns/main_window.cpp +++ b/foo_ui_columns/main_window.cpp @@ -217,8 +217,8 @@ void cui::MainWindow::queue_taskbar_button_update(bool update) void cui::MainWindow::warn_if_ui_hacks_installed() { constexpr auto ui_hacks_warning - = u8"Columns UI detected that the UI Hacks (foo_ui_hacks) component is installed. UI Hacks " - u8"interferes with normal Columns UI operation and should be uninstalled to avoid problems."; + = "Columns UI detected that the UI Hacks (foo_ui_hacks) component is installed. UI Hacks " + "interferes with normal Columns UI operation and should be uninstalled to avoid problems."; HMODULE ui_hacks_module = nullptr; const auto is_ui_hacks_installed diff --git a/foo_ui_columns/ng_playlist/ng_playlist_artwork.cpp b/foo_ui_columns/ng_playlist/ng_playlist_artwork.cpp index 0bf8ef2b6..f173c7a32 100644 --- a/foo_ui_columns/ng_playlist/ng_playlist_artwork.cpp +++ b/foo_ui_columns/ng_playlist/ng_playlist_artwork.cpp @@ -112,7 +112,7 @@ DWORD ArtworkReader::on_thread() } catch (pfc::exception const& e) { m_bitmaps.clear(); console::formatter formatter; - formatter << u8"Playlist view – unhandled error loading artwork: " << e.what(); + formatter << u8"Playlist view – unhandled error loading artwork: "_pcc << e.what(); ret = -1; } // send this first so thread gets closed first @@ -148,7 +148,7 @@ unsigned ArtworkReader::read_artwork(abort_callback& p_abort) } catch (exception_io_not_found const&) { } catch (pfc::exception const& e) { console::formatter formatter; - formatter << u8"Playlist view – error loading artwork: " << e.what(); + formatter << u8"Playlist view – error loading artwork: "_pcc << e.what(); } // Warning: Broken input components can intitialise COM as apartment-threaded. Hence, COM intialisation @@ -284,7 +284,7 @@ wil::unique_hbitmap g_create_hbitmap_from_data( const auto bitmap_data = cui::wic::decode_image_data(data->get_ptr(), data->get_size()); bitmap = cui::gdip::create_bitmap_from_wic_data(bitmap_data); } catch (const std::exception& ex) { - fbh::print_to_console(u8"Playlist view – loading image failed: ", ex.what()); + fbh::print_to_console(u8"Playlist view – loading image failed: "_pcc, ex.what()); return nullptr; } diff --git a/foo_ui_columns/rebar_band.h b/foo_ui_columns/rebar_band.h index a414d6cde..e0414ebd7 100644 --- a/foo_ui_columns/rebar_band.h +++ b/foo_ui_columns/rebar_band.h @@ -2,8 +2,7 @@ namespace cui::rebar { -class RebarBandState { -public: +struct RebarBandState { GUID m_guid{}; // Although we store the DPI, this does virtually nothing as remaining space is automatically // distributed among the remaining bands. @@ -17,27 +16,12 @@ class RebarBandState { void read_from_stream(stream_reader* reader, abort_callback& aborter); void write_extra(stream_writer* writer, abort_callback& aborter) const; void read_extra(stream_reader* reader, abort_callback& aborter); - - RebarBandState& operator=(RebarBandState&&) = default; - RebarBandState& operator=(const RebarBandState& band_state) = default; - RebarBandState() = default; - - RebarBandState(RebarBandState&&) = default; - RebarBandState(const RebarBandState& band_state) = default; }; -class RebarBand { -public: +struct RebarBand { RebarBandState m_state; ui_extension::window_ptr m_window{}; HWND m_wnd{}; - - RebarBand& operator=(RebarBand&&) = default; - RebarBand& operator=(const RebarBand& band) = default; - RebarBand() = default; - - RebarBand(RebarBand&&) = default; - RebarBand(const RebarBand& band) = default; }; } // namespace cui::rebar diff --git a/foo_ui_columns/splitter_utils.cpp b/foo_ui_columns/splitter_utils.cpp index c293aa02c..e88a9622d 100644 --- a/foo_ui_columns/splitter_utils.cpp +++ b/foo_ui_columns/splitter_utils.cpp @@ -86,7 +86,7 @@ pfc::array_t serialise_splitter_item(const uie::splitter_item_t* item) return serialise_splitter_item(normalised_item.get()); } -std::unique_ptr deserialise_splitter_item(gsl::span data) +std::unique_ptr deserialise_splitter_item(std::span data) { auto item = std::make_unique(); stream_reader_memblock_ref reader(data.data(), data.size()); @@ -161,7 +161,7 @@ std::unique_ptr get_splitter_item_from_clipbo try { return get_splitter_item_from_clipboard(); } catch (const exception_io& ex) { - uMessageBox(wnd, ex.what(), u8"Error – Paste Panel", MB_OK | MB_ICONERROR); + uMessageBox(wnd, ex.what(), u8"Error – Paste Panel"_pcc, MB_OK | MB_ICONERROR); } return {}; } diff --git a/foo_ui_columns/splitter_utils.h b/foo_ui_columns/splitter_utils.h index fc5f89db0..ac10d1acc 100644 --- a/foo_ui_columns/splitter_utils.h +++ b/foo_ui_columns/splitter_utils.h @@ -6,7 +6,7 @@ namespace cui::splitter_utils { pfc::array_t serialise_splitter_item(const uie::splitter_item_full_v3_impl_t* item); pfc::array_t serialise_splitter_item(const uie::splitter_item_t* item); -std::unique_ptr deserialise_splitter_item(gsl::span data); +std::unique_ptr deserialise_splitter_item(std::span data); CLIPFORMAT get_splitter_item_clipboard_format(); @@ -26,7 +26,7 @@ void copy_splitter_item_to_clipboard_safe(HWND wnd, const SplitterItem* item) try { copy_splitter_item_to_clipboard(item); } catch (const exception_io& ex) { - uMessageBox(wnd, ex.what(), u8"Error – Copy Panel", MB_OK | MB_ICONERROR); + uMessageBox(wnd, ex.what(), u8"Error – Copy Panel"_pcc, MB_OK | MB_ICONERROR); } } diff --git a/foo_ui_columns/stdafx.h b/foo_ui_columns/stdafx.h index 103ac0b13..40658eb25 100644 --- a/foo_ui_columns/stdafx.h +++ b/foo_ui_columns/stdafx.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -60,6 +61,7 @@ #include "../fbh/stdafx.h" #include "../pfc/range_based_for.h" +using namespace mmh::literals::pcc; using namespace uih::literals::spx; #include "functional.h" diff --git a/foo_ui_columns/title_formatting.cpp b/foo_ui_columns/title_formatting.cpp index 792014ce9..ed3cc4a76 100644 --- a/foo_ui_columns/title_formatting.cpp +++ b/foo_ui_columns/title_formatting.cpp @@ -10,7 +10,7 @@ class ValueVisitor { bool operator()(const internal::ExplicitBool& value) const { if (value) { - m_out->write(titleformat_inputtypes::unknown, u8"1"); + m_out->write(titleformat_inputtypes::unknown, "1"); } return value; } diff --git a/foo_ui_columns/version.h.template b/foo_ui_columns/version.h.template index 40561a1a4..6109bf8e1 100644 --- a/foo_ui_columns/version.h.template +++ b/foo_ui_columns/version.h.template @@ -7,6 +7,6 @@ namespace cui { -constexpr auto version = u8"${{ Version }}"; +constexpr auto version = "${{ Version }}"; } diff --git a/mmh b/mmh index 6a3240db5..51e5ac2b1 160000 --- a/mmh +++ b/mmh @@ -1 +1 @@ -Subproject commit 6a3240db5043e10dcf9c1b58356d3450dfa65e6c +Subproject commit 51e5ac2b1815b6d963a16c0ae3c57f1304b248c8 diff --git a/ui_helpers b/ui_helpers index b8ab9af97..0bb13a690 160000 --- a/ui_helpers +++ b/ui_helpers @@ -1 +1 @@ -Subproject commit b8ab9af978b074f9165a464c306a406eaf2b8b17 +Subproject commit 0bb13a6902c7d097a90371360ecf9e15692984fd