From a59f8aea6ef7dd5ff04eda5835617caf2b774c35 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 2 Nov 2022 16:27:49 +0100 Subject: [PATCH] Follow-up https://github.com/Prusa-Development/PrusaSlicerPrivate/commit/ba22eb600e62ddaee0a83f2037c4bc0c3ccd3cdd - Fix for string formatting (by @bubnikv) --- src/slic3r/GUI/format.hpp | 69 ++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/src/slic3r/GUI/format.hpp b/src/slic3r/GUI/format.hpp index 51beafff1..15a3f04c3 100644 --- a/src/slic3r/GUI/format.hpp +++ b/src/slic3r/GUI/format.hpp @@ -7,12 +7,35 @@ // though C++20 format uses a different template pattern for position independent parameters. // This wrapper also manages implicit conversion from wxString to UTF8 and format_wxstr() variants are provided to format into wxString. -#include - #include -namespace Slic3r { -namespace GUI { +namespace Slic3r::internal::format { + // Wrapper around wxScopedCharBuffer to indicate that the content is UTF8 formatted. + struct utf8_buffer { + // wxScopedCharBuffer is reference counted, therefore copying by value is cheap. + wxScopedCharBuffer data; + }; + inline std::ostream& operator<<(std::ostream& os, const utf8_buffer &v) { + os << v.data.data(); + return os; + } + // Accept wxString and convert it to UTF8 to be processed by Slic3r::format(). + inline const utf8_buffer cook(const wxString& arg) { + return utf8_buffer{ arg.ToUTF8() }; + } + // Vojtech seemingly does not understand perfect forwarding: + // Why Slic3r::internal::format::cook(T&& arg) is taken for non-const wxString reference? + inline const utf8_buffer cook(wxString& arg) { + return utf8_buffer{ arg.ToUTF8() }; + } + inline const utf8_buffer cook(wxString&& arg) { + return utf8_buffer{ arg.ToUTF8() }; + } +} + +#include + +namespace Slic3r::GUI { // Format input mixing UTF8 encoded strings (const char*, std::string) and wxStrings, return a wxString. template @@ -42,42 +65,6 @@ inline std::string format(const wxString& fmt, TArgs&&... args) { return Slic3r::format(fmt.ToUTF8().data(), std::forward(args)...); } -} // namespace GUI - -namespace internal { - namespace format { - // Wrapper around wxScopedCharBuffer to indicate that the content is UTF8 formatted. - struct utf8_buffer { - // wxScopedCharBuffer is reference counted, therefore copying by value is cheap. - wxScopedCharBuffer data; - }; - // Accept wxString and convert it to UTF8 to be processed by Slic3r::format(). - inline const utf8_buffer cook(const wxString &arg) { - return utf8_buffer { arg.ToUTF8() }; - } - // Vojtech seemingly does not understand perfect forwarding: - // Why Slic3r::internal::format::cook(T&& arg) is taken for non-const wxString reference? - inline const utf8_buffer cook(wxString &arg) { - return utf8_buffer { arg.ToUTF8() }; - } - inline const utf8_buffer cook(wxString &&arg) { - return utf8_buffer{ arg.ToUTF8() }; - } - } -} - -} // namespace Slic3r - -namespace boost { - namespace io { - namespace detail { - // Adaptor for boost::format to accept wxString converted to UTF8. - inline std::ostream& operator<<(std::ostream& os, const Slic3r::internal::format::utf8_buffer& str) { - os << str.data.data(); - return os; - } - } - } -} +} // namespace Slic3r::GUI #endif /* slic3r_GUI_format_hpp_ */