64 lines
2.2 KiB
Diff
64 lines
2.2 KiB
Diff
--- a/src/joystick/SDL_gamepad.c
|
|
+++ b/src/joystick/SDL_gamepad.c
|
|
@@ -108,6 +108,7 @@ typedef struct
|
|
{
|
|
int refcount _guarded;
|
|
SDL_JoystickID *joysticks _guarded;
|
|
GamepadMapping_t **joystick_mappings _guarded;
|
|
int num_changed_mappings _guarded;
|
|
GamepadMapping_t **changed_mappings _guarded;
|
|
+ SDL_HashTable *changed_mappings_set _guarded; // O(1) pointer membership
|
|
} MappingChangeTracker;
|
|
|
|
@@ -595,6 +596,11 @@ static void PushMappingChangeTracking(void)
|
|
s_mappingChangeTracker = (MappingChangeTracker *)SDL_calloc(1, sizeof(*tracker));
|
|
...
|
|
+ tracker->changed_mappings_set = SDL_CreateHashTable(
|
|
+ 0, false, SDL_HashPointer, SDL_KeyMatchPointer, NULL, NULL);
|
|
|
|
@@ -627,6 +633,10 @@ static void AddMappingChangeTracking(GamepadMapping_t *mapping)
|
|
tracker->changed_mappings[num_mappings] = mapping;
|
|
tracker->num_changed_mappings = (num_mappings + 1);
|
|
}
|
|
+ // Mirror into hash set for O(1) HasMappingChangeTracking queries.
|
|
+ if (tracker->changed_mappings_set) {
|
|
+ SDL_InsertIntoHashTable(tracker->changed_mappings_set,
|
|
+ (void *)mapping, (const void *)true, false);
|
|
+ }
|
|
}
|
|
|
|
@@ -639,13 +639,10 @@ static bool HasMappingChangeTracking(MappingChangeTracker *tracker, GamepadMappi
|
|
{
|
|
- int i;
|
|
-
|
|
SDL_AssertJoysticksLocked();
|
|
|
|
- for (i = 0; i < tracker->num_changed_mappings; ++i) {
|
|
- if (tracker->changed_mappings[i] == mapping) {
|
|
- return true;
|
|
- }
|
|
- }
|
|
- return false;
|
|
+ if (!tracker->changed_mappings_set) {
|
|
+ // Fallback: linear scan (allocation failure path).
|
|
+ int i;
|
|
+ for (i = 0; i < tracker->num_changed_mappings; ++i) {
|
|
+ if (tracker->changed_mappings[i] == mapping) {
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+ return false;
|
|
+ }
|
|
+ const void *value;
|
|
+ return SDL_FindInHashTable(tracker->changed_mappings_set, (void *)mapping, &value);
|
|
}
|
|
|
|
@@ -698,6 +698,10 @@ static void PopMappingChangeTracking(void)
|
|
SDL_free(tracker->joysticks);
|
|
SDL_free(tracker->joystick_mappings);
|
|
SDL_free(tracker->changed_mappings);
|
|
+ if (tracker->changed_mappings_set) {
|
|
+ SDL_DestroyHashTable(tracker->changed_mappings_set);
|
|
+ }
|
|
SDL_free(tracker);
|
|
}
|