Changeset - r27415:cd7d225c26b7
[Not reviewed]
master
0 6 1
Rubidium - 13 months ago 2023-05-20 09:46:46
rubidium@openttd.org
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.
7 files changed with 50 insertions and 5 deletions:
0 comments (0 inline, 0 general)
CMakeLists.txt
Show inline comments
 
@@ -247,13 +247,13 @@ if(MSVC)
 
    target_sources(openttd PRIVATE "${CMAKE_SOURCE_DIR}/os/windows/openttd.manifest")
 
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)
 
add_subdirectory(${CMAKE_SOURCE_DIR}/src)
 
add_subdirectory(${CMAKE_SOURCE_DIR}/media)
 

	
src/console_func.h
Show inline comments
 
@@ -8,13 +8,13 @@
 
/** @file console_func.h Console functions used outside of the console code. */
 

	
 
#ifndef CONSOLE_FUNC_H
 
#define CONSOLE_FUNC_H
 

	
 
#include "console_type.h"
 
#include "3rdparty/fmt/format.h"
 
#include "core/format.hpp"
 

	
 
/* console modes */
 
extern IConsoleModes _iconsole_mode;
 

	
 
/* console functions */
 
void IConsoleInit();
src/core/CMakeLists.txt
Show inline comments
 
@@ -5,12 +5,13 @@ add_files(
 
    backup_type.hpp
 
    bitmath_func.cpp
 
    bitmath_func.hpp
 
    endian_func.hpp
 
    endian_type.hpp
 
    enum_type.hpp
 
    format.hpp
 
    geometry_func.cpp
 
    geometry_func.hpp
 
    geometry_type.hpp
 
    kdtree.hpp
 
    math_func.cpp
 
    math_func.hpp
src/core/format.hpp
Show inline comments
 
new file 100644
 
/*
 
 * 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 <http://www.gnu.org/licenses/>.
 
 */
 

	
 
/** @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 <typename E, typename Char>
 
struct fmt::formatter<E, Char, std::enable_if_t<std::is_enum<E>::value>> : fmt::formatter<typename std::underlying_type<E>::type> {
 
	using underlying_type = typename std::underlying_type<E>::type;
 
	using parent = typename fmt::formatter<underlying_type>;
 

	
 
	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 <typename T, typename Char>
 
struct fmt::formatter<T, Char, std::enable_if_t<std::is_base_of<StrongTypedefBase, T>::value>> : fmt::formatter<typename T::Type> {
 
	using underlying_type = typename T::Type;
 
	using parent = typename fmt::formatter<underlying_type>;
 

	
 
	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 */
src/debug.h
Show inline comments
 
@@ -9,13 +9,13 @@
 

	
 
#ifndef DEBUG_H
 
#define DEBUG_H
 

	
 
#include "cpu.h"
 
#include <chrono>
 
#include "3rdparty/fmt/format.h"
 
#include "core/format.hpp"
 

	
 
/* Debugging messages policy:
 
 * These should be the severities used for direct Debug() calls
 
 * maximum debugging level should be 10 if really deep, deep
 
 * debugging is needed.
 
 * (there is room for exceptions, but you have to have a good cause):
src/misc_gui.cpp
Show inline comments
 
@@ -114,13 +114,13 @@ public:
 

	
 
#if defined(_DEBUG)
 
#	define LANDINFOD_LEVEL 0
 
#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());
 
		Debug(misc, LANDINFOD_LEVEL, "m2     = 0x{:x}", tile.m2());
 
		Debug(misc, LANDINFOD_LEVEL, "m3     = 0x{:x}", tile.m3());
 
		Debug(misc, LANDINFOD_LEVEL, "m4     = 0x{:x}", tile.m4());
src/os/unix/font_unix.cpp
Show inline comments
 
@@ -145,13 +145,13 @@ bool SetFallbackFont(FontCacheSettings *
 
			FcPatternGetInteger(font, FC_WEIGHT, 0, &value);
 
			if (value <= best_weight) continue;
 

	
 
			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;
 
				best_font = (const char *)file;
 
			}
 
		}
0 comments (0 inline, 0 general)