From 6f2f38b3ed68b52eaa2bbba5f58a2b92a1e093f0 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 20 May 2023 11:46:46 +0200 Subject: [PATCH] Codechange: fmt (and std::format) do explicitly not support enums out-of-the-box That it works for the version we have packaged it pure coincidence, as that is one of the few versions that due to a bug allow it. So add the appropriate template specialisations to support it out-of-the-box within OpenTTD. --- CMakeLists.txt | 2 +- src/console_func.h | 2 +- src/core/CMakeLists.txt | 1 + src/core/format.hpp | 44 +++++++++++++++++++++++++++++++++++++++ src/debug.h | 2 +- src/misc_gui.cpp | 2 +- src/os/unix/font_unix.cpp | 2 +- 7 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/core/format.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ca0b261d85..f0f5ff1dce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -250,7 +250,7 @@ endif() target_precompile_headers(openttd_lib PRIVATE src/stdafx.h - src/3rdparty/fmt/format.h + src/core/format.hpp ) add_subdirectory(${CMAKE_SOURCE_DIR}/bin) diff --git a/src/console_func.h b/src/console_func.h index 36227bc56f..484a71573c 100644 --- a/src/console_func.h +++ b/src/console_func.h @@ -11,7 +11,7 @@ #define CONSOLE_FUNC_H #include "console_type.h" -#include "3rdparty/fmt/format.h" +#include "core/format.hpp" /* console modes */ extern IConsoleModes _iconsole_mode; diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index afe1112316..6dd7bbd69b 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -8,6 +8,7 @@ add_files( endian_func.hpp endian_type.hpp enum_type.hpp + format.hpp geometry_func.cpp geometry_func.hpp geometry_type.hpp diff --git a/src/core/format.hpp b/src/core/format.hpp new file mode 100644 index 0000000000..f701ea6dfe --- /dev/null +++ b/src/core/format.hpp @@ -0,0 +1,44 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file format.hpp String formatting functions and helpers. */ + +#ifndef FORMAT_HPP +#define FORMAT_HPP + +#include "../3rdparty/fmt/format.h" +#include "strong_typedef_type.hpp" + +template +struct fmt::formatter::value>> : fmt::formatter::type> { + using underlying_type = typename std::underlying_type::type; + using parent = typename fmt::formatter; + + constexpr fmt::format_parse_context::iterator parse(fmt::format_parse_context &ctx) { + return parent::parse(ctx); + } + + fmt::format_context::iterator format(const E &e, format_context &ctx) const { + return parent::format(underlying_type(e), ctx); + } +}; + +template +struct fmt::formatter::value>> : fmt::formatter { + using underlying_type = typename T::Type; + using parent = typename fmt::formatter; + + constexpr fmt::format_parse_context::iterator parse(fmt::format_parse_context &ctx) { + return parent::parse(ctx); + } + + fmt::format_context::iterator format(const T &t, format_context &ctx) const { + return parent::format(underlying_type(t), ctx); + } +}; + +#endif /* FORMAT_HPP */ diff --git a/src/debug.h b/src/debug.h index bb939ccc4c..2db1d1132b 100644 --- a/src/debug.h +++ b/src/debug.h @@ -12,7 +12,7 @@ #include "cpu.h" #include -#include "3rdparty/fmt/format.h" +#include "core/format.hpp" /* Debugging messages policy: * These should be the severities used for direct Debug() calls diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 49a46e5b1c..c130102bd4 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -117,7 +117,7 @@ public: #else # define LANDINFOD_LEVEL 1 #endif - Debug(misc, LANDINFOD_LEVEL, "TILE: 0x{:x} ({},{})", tile, TileX(tile), TileY(tile)); + Debug(misc, LANDINFOD_LEVEL, "TILE: 0x{:x} ({},{})", (TileIndex)tile, TileX(tile), TileY(tile)); Debug(misc, LANDINFOD_LEVEL, "type = 0x{:x}", tile.type()); Debug(misc, LANDINFOD_LEVEL, "height = 0x{:x}", tile.height()); Debug(misc, LANDINFOD_LEVEL, "m1 = 0x{:x}", tile.m1()); diff --git a/src/os/unix/font_unix.cpp b/src/os/unix/font_unix.cpp index 5027929be0..f5284f4ed9 100644 --- a/src/os/unix/font_unix.cpp +++ b/src/os/unix/font_unix.cpp @@ -148,7 +148,7 @@ bool SetFallbackFont(FontCacheSettings *settings, const char *language_isocode, callback->SetFontNames(settings, (const char *)file); bool missing = callback->FindMissingGlyphs(); - Debug(fontcache, 1, "Font \"{}\" misses{} glyphs", file, missing ? "" : " no"); + Debug(fontcache, 1, "Font \"{}\" misses{} glyphs", (char *)file, missing ? "" : " no"); if (!missing) { best_weight = value;