Fix queue MSVC errors

This commit is contained in:
2026-05-17 12:20:47 +01:00
parent 8061692801
commit 515493b963
3 changed files with 27 additions and 4 deletions

View File

@@ -30,7 +30,10 @@ GenericQueue *_queue_push_alloc(const Allocator *allocator, GenericQueue *queue,
GenericQueue *output = queue; GenericQueue *output = queue;
u64 capacity = wapp_array_capacity(queue->items); u64 capacity = wapp_array_capacity(queue->items);
if (queue->count >= capacity) {
// NOTE (Abdelrahman): Extracted into variable to fix MSVC error
b8 queue_full = queue->count >= capacity;
if (queue_full) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(capacity * 2); u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(capacity * 2);
u64 array_size = _array_calc_alloc_size(new_capacity, item_size); u64 array_size = _array_calc_alloc_size(new_capacity, item_size);
u64 alloc_size = sizeof(GenericQueue) + array_size; u64 alloc_size = sizeof(GenericQueue) + array_size;
@@ -51,7 +54,27 @@ GenericQueue *_queue_push_alloc(const Allocator *allocator, GenericQueue *queue,
void *copy_boundary = (void *)((uptr)(queue->items) + (queue->front * item_size)); void *copy_boundary = (void *)((uptr)(queue->items) + (queue->front * item_size));
memcpy(output->items, copy_boundary, front_count * item_size); memcpy(output->items, copy_boundary, front_count * item_size);
if (back_count > 0) {
/**
* NOTE (Abdelrahman): Since this is a ring buffer, the elements at the beginning of the array
* aren't always the ones at the front of the queue. When that's the case, the memcpy above
* will only copy a subset of the elements. This is why we need to copy the remaining ones.
*
* Example: Take a queue that looks like this with a capacity of 5 elements
*
* 0 1 | 2 3 4
* ---------------|-----------------------
* | * | * | * | * | * |
* ---------------|-----------------------
* |
* queue_front = 2
* queue_back = 2
*
* In this case, the first memcpy will only copy elements 2-4. The memcpy below will be
* responsible for copying elements 0-1.
*/
b8 items_left_to_copy = back_count > 0;
if (items_left_to_copy) {
void *back_copy_dst = (void *)((uptr)(output->items) + (front_count * item_size)); void *back_copy_dst = (void *)((uptr)(output->items) + (front_count * item_size));
memcpy(back_copy_dst, queue->items, back_count * item_size); memcpy(back_copy_dst, queue->items, back_count * item_size);
} }

View File

@@ -47,7 +47,7 @@ TestFuncResult test_queue_push_alloc(void) {
u64 remaining = wapp_queue_capacity(&queue) - queue.count; u64 remaining = wapp_queue_capacity(&queue) - queue.count;
for (u64 i = 0; i < remaining; ++i) { for (u64 i = 0; i < remaining; ++i) {
item = remaining + i; item = (i32)(remaining + i);
wapp_queue_push(i32, &queue, &item); wapp_queue_push(i32, &queue, &item);
} }

View File

@@ -45,7 +45,7 @@ TestFuncResult test_queue_push_alloc(void) {
u64 remaining = wapp_queue_capacity(&queue) - queue.count; u64 remaining = wapp_queue_capacity(&queue) - queue.count;
for (u64 i = 0; i < remaining; ++i) { for (u64 i = 0; i < remaining; ++i) {
item = remaining + i; item = (i32)(remaining + i);
wapp_queue_push(i32, &queue, &item); wapp_queue_push(i32, &queue, &item);
} }