Implement RingBuffer

V0: basic init with given backing up buffer, reject to enqueue if full(no override), support dequeue

#include <limits.h>

typedef struct {
    int *buffer;
    int head; //index of the next element to read, oldest
    int tail; // tail is the index where the next write will go (one past the newest item)
    int capacity;
    int count;
} ring_buffer_t;


void init(ring_buffer_t *rb, int *backing, int capacity){
    rb->buffer = backing;
    rb->head=0;
    rb->tail=0;
    rb->capacity=capacity;
    rb->count=0;
}
 
void enqueue(ring_buffer_t *rb, int val){
    if (rb->count == rb->capacity){
        // Full, reject
        return;
    }
    // Write at current tail, then advance with wrap-around
    rb->buffer[rb->tail] = val;
    rb->tail = (rb->tail + 1) % rb->capacity;
    rb->count++;
}

int dequeue(ring_buffer_t *rb){
    //if empty
    if (rb->count == 0){
        return INT_MIN;
    }
    int value = rb->buffer[rb->head];
    // needs to wrap around 
    rb->head = (rb->head + 1) % rb->capacity;
    rb->count--;
    return value;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容