mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 22:28:56 +00:00
Fix #9386: compilers failing to compile with LTO by using variants instead of new + unique_ptr
With std::variant all memory can be figured out at compile time, so the compiler needs to keep track of fewer elements. It also saves out a unique_ptr and its memory management, over a slight impact for resolving a setting.
This commit is contained in:
parent
f35e6c1c7f
commit
98e653dacc
2
.github/workflows/ci-build.yml
vendored
2
.github/workflows/ci-build.yml
vendored
@ -157,7 +157,7 @@ jobs:
|
|||||||
|
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
env:
|
env:
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.9
|
MACOSX_DEPLOYMENT_TARGET: 10.14
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@ -470,7 +470,7 @@ jobs:
|
|||||||
|
|
||||||
runs-on: macos-10.15
|
runs-on: macos-10.15
|
||||||
env:
|
env:
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.9
|
MACOSX_DEPLOYMENT_TARGET: 10.14
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download source
|
- name: Download source
|
||||||
|
@ -22,7 +22,7 @@ if (EMSCRIPTEN)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14)
|
||||||
|
|
||||||
# Use GNUInstallDirs to allow customisation
|
# Use GNUInstallDirs to allow customisation
|
||||||
# but set our own default data and bin dir
|
# but set our own default data and bin dir
|
||||||
|
@ -87,6 +87,7 @@ std::string _config_file; ///< Configuration file of OpenTTD
|
|||||||
typedef std::list<ErrorMessageData> ErrorList;
|
typedef std::list<ErrorMessageData> ErrorList;
|
||||||
static ErrorList _settings_error_list; ///< Errors while loading minimal settings.
|
static ErrorList _settings_error_list; ///< Errors while loading minimal settings.
|
||||||
|
|
||||||
|
typedef span<const SettingVariant> SettingTable;
|
||||||
|
|
||||||
typedef void SettingDescProc(IniFile *ini, const SettingTable &desc, const char *grpname, void *object, bool only_startup);
|
typedef void SettingDescProc(IniFile *ini, const SettingTable &desc, const char *grpname, void *object, bool only_startup);
|
||||||
typedef void SettingDescProcList(IniFile *ini, const char *grpname, StringList &list);
|
typedef void SettingDescProcList(IniFile *ini, const char *grpname, StringList &list);
|
||||||
@ -98,9 +99,9 @@ static bool IsSignedVarMemType(VarType vt);
|
|||||||
* @param desc The type of the iterator of the value in SettingTable.
|
* @param desc The type of the iterator of the value in SettingTable.
|
||||||
* @return The actual pointer to SettingDesc.
|
* @return The actual pointer to SettingDesc.
|
||||||
*/
|
*/
|
||||||
static const SettingDesc *GetSettingDesc(const std::unique_ptr<const SettingDesc> &desc)
|
static constexpr const SettingDesc *GetSettingDesc(const SettingVariant &desc)
|
||||||
{
|
{
|
||||||
return desc.get();
|
return std::visit([](auto&& arg) -> const SettingDesc * { return &arg; }, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#ifndef SETTINGS_INTERNAL_H
|
#ifndef SETTINGS_INTERNAL_H
|
||||||
#define SETTINGS_INTERNAL_H
|
#define SETTINGS_INTERNAL_H
|
||||||
|
|
||||||
|
#include <variant>
|
||||||
#include "saveload/saveload.h"
|
#include "saveload/saveload.h"
|
||||||
|
|
||||||
enum SettingFlag : uint16 {
|
enum SettingFlag : uint16 {
|
||||||
@ -299,7 +300,7 @@ struct NullSettingDesc : SettingDesc {
|
|||||||
bool IsSameValue(const IniItem *item, void *object) const override { NOT_REACHED(); }
|
bool IsSameValue(const IniItem *item, void *object) const override { NOT_REACHED(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::initializer_list<std::unique_ptr<const SettingDesc>> SettingTable;
|
typedef std::variant<IntSettingDesc, BoolSettingDesc, OneOfManySettingDesc, ManyOfManySettingDesc, StringSettingDesc, ListSettingDesc, NullSettingDesc> SettingVariant;
|
||||||
|
|
||||||
const SettingDesc *GetSettingFromName(const std::string_view name);
|
const SettingDesc *GetSettingFromName(const std::string_view name);
|
||||||
void GetSettingSaveLoadByPrefix(const std::string_view prefix, std::vector<SaveLoad> &saveloads);
|
void GetSettingSaveLoadByPrefix(const std::string_view prefix, std::vector<SaveLoad> &saveloads);
|
||||||
|
@ -54,7 +54,7 @@ static size_t ConvertLandscape(const char *value);
|
|||||||
* on the appropriate macro.
|
* on the appropriate macro.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define NSD(type, ...) std::unique_ptr<const SettingDesc>(new type##SettingDesc(__VA_ARGS__))
|
#define NSD(type, ...) SettingVariant { std::in_place_type<type##SettingDesc>, __VA_ARGS__ }
|
||||||
|
|
||||||
/* Macros for various objects to go in the configuration file.
|
/* Macros for various objects to go in the configuration file.
|
||||||
* This section is for global variables */
|
* This section is for global variables */
|
||||||
|
@ -12,7 +12,7 @@ static void UpdateAllServiceInterval(int32 new_value);
|
|||||||
static bool CanUpdateServiceInterval(VehicleType type, int32 &new_value);
|
static bool CanUpdateServiceInterval(VehicleType type, int32 &new_value);
|
||||||
static void UpdateServiceInterval(VehicleType type, int32 new_value);
|
static void UpdateServiceInterval(VehicleType type, int32 new_value);
|
||||||
|
|
||||||
static const SettingTable _company_settings{
|
static const SettingVariant _company_settings[] = {
|
||||||
[post-amble]
|
[post-amble]
|
||||||
};
|
};
|
||||||
[templates]
|
[templates]
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
; Settings for the in-game custom currency.
|
; Settings for the in-game custom currency.
|
||||||
|
|
||||||
[pre-amble]
|
[pre-amble]
|
||||||
static const SettingTable _currency_settings{
|
static const SettingVariant _currency_settings[] = {
|
||||||
[post-amble]
|
[post-amble]
|
||||||
};
|
};
|
||||||
[templates]
|
[templates]
|
||||||
|
@ -33,7 +33,7 @@ static std::initializer_list<const char*> _osk_activation{"disabled", "double",
|
|||||||
static std::initializer_list<const char*> _settings_profiles{"easy", "medium", "hard"};
|
static std::initializer_list<const char*> _settings_profiles{"easy", "medium", "hard"};
|
||||||
static std::initializer_list<const char*> _news_display{ "off", "summarized", "full"};
|
static std::initializer_list<const char*> _news_display{ "off", "summarized", "full"};
|
||||||
|
|
||||||
static const SettingTable _gameopt_settings{
|
static const SettingVariant _gameopt_settings[] = {
|
||||||
/* In version 4 a new difficulty setting has been added to the difficulty settings,
|
/* In version 4 a new difficulty setting has been added to the difficulty settings,
|
||||||
* town attitude towards demolishing. Needs special handling because some dimwit thought
|
* town attitude towards demolishing. Needs special handling because some dimwit thought
|
||||||
* it funny to have the GameDifficulty struct be an array while it is a struct of
|
* it funny to have the GameDifficulty struct be an array while it is a struct of
|
||||||
|
@ -20,7 +20,7 @@ extern bool _allow_hidpi_window;
|
|||||||
#define WITHOUT_COCOA
|
#define WITHOUT_COCOA
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const SettingTable _misc_settings{
|
static const SettingVariant _misc_settings[] = {
|
||||||
[post-amble]
|
[post-amble]
|
||||||
};
|
};
|
||||||
[templates]
|
[templates]
|
||||||
|
@ -49,7 +49,7 @@ static void UpdateClientConfigValues();
|
|||||||
* assigns its own value. If the setting was company-based, that would mean that
|
* assigns its own value. If the setting was company-based, that would mean that
|
||||||
* vehicles could decide on different moments that they are heading back to a
|
* vehicles could decide on different moments that they are heading back to a
|
||||||
* service depot, causing desyncs on a massive scale. */
|
* service depot, causing desyncs on a massive scale. */
|
||||||
const SettingTable _settings{
|
static const SettingVariant _settings[] = {
|
||||||
[post-amble]
|
[post-amble]
|
||||||
};
|
};
|
||||||
[templates]
|
[templates]
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#if defined(_WIN32) && !defined(DEDICATED)
|
#if defined(_WIN32) && !defined(DEDICATED)
|
||||||
extern bool _window_maximize;
|
extern bool _window_maximize;
|
||||||
|
|
||||||
static const SettingTable _win32_settings{
|
static const SettingVariant _win32_settings[] = {
|
||||||
[post-amble]
|
[post-amble]
|
||||||
};
|
};
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
[pre-amble]
|
[pre-amble]
|
||||||
|
|
||||||
static const SettingTable _window_settings{
|
static const SettingVariant _window_settings[] = {
|
||||||
[post-amble]
|
[post-amble]
|
||||||
};
|
};
|
||||||
[templates]
|
[templates]
|
||||||
|
Loading…
Reference in New Issue
Block a user