From 55af69813a99b0adfc7a01f26b9fe0ede69e1837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 11 Nov 2021 16:23:50 +0200 Subject: [PATCH] Ensure registration is never out of bounds with static_assert --- src/openrct2/actions/GameActionRegistry.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/openrct2/actions/GameActionRegistry.cpp b/src/openrct2/actions/GameActionRegistry.cpp index 68256d2919..71d776b836 100644 --- a/src/openrct2/actions/GameActionRegistry.cpp +++ b/src/openrct2/actions/GameActionRegistry.cpp @@ -102,16 +102,20 @@ namespace GameActions using GameActionRegistry = std::array; - static constexpr void Register(GameActionRegistry& registry, GameCommand id, GameActionFactory factory, const char* name) + template + static constexpr void Register(GameActionRegistry& registry, GameActionFactory factory, const char* name) { - const auto idx = static_cast(id); + constexpr auto idx = static_cast(TId); + + static_assert(idx < EnumValue(GameCommand::Count)); + registry[idx] = { factory, name }; } template static constexpr void Register(GameActionRegistry& registry, const char* name) { GameActionFactory factory = []() -> GameAction* { return new T(); }; - Register(registry, T::TYPE, factory, name); + Register(registry, factory, name); } static constexpr GameActionRegistry BuildRegistry()