() , , . , , .
, , (- ) ~ 100% ~ 80%.
typedef struct sQueueItem {
QueueValue value;
size_t item_size;
} QueueItem;
Bool queuePush(Queue * const queue, QueueValue value, size_t val_sz) {
if(isNull(queue) || isFull(queue)) return FALSE;
queue->items[queue->last].value = xmalloc(val_sz);
memcpy(queue->items[queue->last].value, value, val_sz);
queue->items[queue->last].item_size = val_sz;
queue->last = (queue->last+1) % queue->size;
queue->count += 1;
return TRUE;
}
Bool queuePop(Queue * const queue,
QueueValue **value,
size_t item_size)
{
if(isEmpty(queue)) return FALSE;
QueueItem *p = queue->items[queue->first];
assert(p->item_size == item_size);
memcpy(*value, p->value, p->item_size);
free(queue->items[queue->first].value);
queue->first = (queue->first+1) % queue->size;
queue->count -= 1;
return TRUE;
}
Edit:
, queuePop
Bool queuePop(Queue * const queue,
QueueValue *value, // stet
size_t item_size)
and changed the `memcpy` to
memcpy(value, p->value, p->item_size);
- , NULL item_size, queuePop malloc() **value. , , SO :)