On 10 July 2017 at 12:40, Nikolay Sivov nsivov@codeweavers.com wrote:
+static BOOL d3drm_animation_get_next_key_id(struct d3drm_animation_keys *keys, DWORD *id) +{
- DWORD i;
- if (keys->next_unused <= keys->last_id)
- {
*id = keys->next_unused++;
return TRUE;
- }
- if (keys->next_free <= keys->last_id)
- {
*id = keys->next_free;
keys->next_free = ~0u;
return TRUE;
- }
- if (keys->count == keys->last_id - keys->first_id + 1)
return FALSE;
- /* Worst case, look for the spot from the beginning. */
- for (i = 0, *id = keys->first_id; i < keys->count; i++, ++*id)
- {
if (*id != keys->keys[i].id)
break;
- }
Does that work? The keys aren't necessarily ordered by ID, right? Regardless, it may be easier to make use of the fact that we never shrink the keys array.