From 90029beb4919ea8d74b9d646e643beb7a3e3fcd0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 2 May 2024 23:19:08 +0100 Subject: [PATCH] Codechange: Ensure SDLK mappings stay in the expected order. (#12608) Add a constexpr constructor that ensures at compile-time that the source SDLK range matches the target range. --- src/video/sdl2_v.cpp | 24 +++++++++++++++--------- src/video/sdl_v.cpp | 18 ++++++++++++------ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 2fb0654ee5..93a74a2b13 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -240,18 +240,24 @@ std::vector VideoDriver_SDL_Base::GetListOfMonitorRefreshRates() struct SDLVkMapping { - SDL_Keycode vk_from; - uint8_t vk_count; - uint8_t map_to; - bool unprintable; + const SDL_Keycode vk_from; + const uint8_t vk_count; + const uint8_t map_to; + const bool unprintable; + + constexpr SDLVkMapping(SDL_Keycode vk_first, SDL_Keycode vk_last, uint8_t map_first, [[maybe_unused]] uint8_t map_last, bool unprintable) + : vk_from(vk_first), vk_count(vk_first - vk_last + 1), map_to(map_first), unprintable(unprintable) + { + assert((vk_last - vk_first) == (map_last - map_first)); + } }; -#define AS(x, z) {x, 1, z, false} -#define AM(x, y, z, w) {x, (uint8_t)(y - x + 1), z, false} -#define AS_UP(x, z) {x, 1, z, true} -#define AM_UP(x, y, z, w) {x, (uint8_t)(y - x + 1), z, true} +#define AS(x, z) {x, x, z, z, false} +#define AM(x, y, z, w) {x, y, z, w, false} +#define AS_UP(x, z) {x, x, z, z, true} +#define AM_UP(x, y, z, w) {x, y, z, w, true} -static const SDLVkMapping _vk_mapping[] = { +static constexpr SDLVkMapping _vk_mapping[] = { /* Pageup stuff + up/down */ AS_UP(SDLK_PAGEUP, WKC_PAGEUP), AS_UP(SDLK_PAGEDOWN, WKC_PAGEDOWN), diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index 3619b61fd2..b40e23574d 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -373,15 +373,21 @@ bool VideoDriver_SDL::ClaimMousePointer() } struct SDLVkMapping { - uint16_t vk_from; - uint8_t vk_count; - uint8_t map_to; + const uint16_t vk_from; + const uint8_t vk_count; + const uint8_t map_to; + + constexpr SDLVkMapping(SDL_Keycode vk_first, SDL_Keycode vk_last, uint8_t map_first, [[maybe_unused]] uint8_t map_last) + : vk_from(vk_first), vk_count(vk_first - vk_last + 1), map_to(map_first) + { + assert((vk_last - vk_first) == (map_last - map_first)); + } }; -#define AS(x, z) {x, 1, z} -#define AM(x, y, z, w) {x, (uint8_t)(y - x + 1), z} +#define AS(x, z) {x, x, z, z, false} +#define AM(x, y, z, w) {x, y, z, w, false} -static const SDLVkMapping _vk_mapping[] = { +static constexpr SDLVkMapping _vk_mapping[] = { /* Pageup stuff + up/down */ AM(SDLK_PAGEUP, SDLK_PAGEDOWN, WKC_PAGEUP, WKC_PAGEDOWN), AS(SDLK_UP, WKC_UP),