Better docstrings and example driver
This commit is contained in:
parent
9c746a10cf
commit
07bb60c8ae
2 changed files with 46 additions and 21 deletions
11
driver.c
11
driver.c
|
@ -13,14 +13,17 @@ main(void)
|
|||
struct RingBuf rb;
|
||||
rb_init(&rb, 10, malloc, sizeof(int));
|
||||
|
||||
int data = 5;
|
||||
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
|
||||
rb_push_back(&rb, &data, memcpy);
|
||||
int ok = WriteOk; // Assume we can write
|
||||
for(int i = 0; i < 10 && ok == WriteOk; i++) {
|
||||
ok = rb_push_back(&rb, &arr[i], memcpy);
|
||||
}
|
||||
|
||||
int d;
|
||||
rb_pop_front(&rb, &d);
|
||||
|
||||
while(rb_pop_front(&rb, &d) == ReadOk) {
|
||||
printf("Data: %d\n", d);
|
||||
}
|
||||
|
||||
rb_destroy(&rb, free);
|
||||
|
||||
|
|
54
ringbuf.h
54
ringbuf.h
|
@ -6,38 +6,60 @@
|
|||
#define rb_size_t int
|
||||
#endif
|
||||
|
||||
/** Signatures of generic functions */
|
||||
/** Signatures of allocators */
|
||||
typedef void *(*ALLOC_T)(rb_size_t);
|
||||
|
||||
/** Signature of memcpy */
|
||||
typedef void *(*MEMCPY_T)(void *, const void *, rb_size_t);
|
||||
|
||||
/**
|
||||
* Ring buffer, also known as circular buffer.
|
||||
* @brief Ring buffer, also known as circular buffer.
|
||||
*/
|
||||
struct RingBuf {
|
||||
rb_size_t struct_size; /* Size of the struct */
|
||||
rb_size_t capacity; /* The physical capacity of the entire ringbuf */
|
||||
rb_size_t count; /* The number of elements in the buffer */
|
||||
void *write_head; /* Address of the write head */
|
||||
void *read_head; /* Address of the read head */
|
||||
void *buffer; /* The actual data */
|
||||
void *buffer_end; /* The end of the buffer */
|
||||
rb_size_t struct_size; /** Size of the struct */
|
||||
rb_size_t capacity; /** The physical capacity of the entire ringbuf */
|
||||
rb_size_t count; /** The number of elements in the buffer */
|
||||
void *write_head; /** Address of the write head */
|
||||
void *read_head; /** Address of the read head */
|
||||
void *buffer; /** The actual data */
|
||||
void *buffer_end; /** The end of the buffer */
|
||||
} __attribute__((packed));
|
||||
|
||||
// TODO: Perhaps unify these to RBResult?
|
||||
|
||||
enum WriteResult { Full, WriteOk }; /** Result of a write */
|
||||
enum ReadResult { Empty, ReadOk }; /** Result of a read */
|
||||
|
||||
/** Initialize the ring buffer */
|
||||
void rb_init(struct RingBuf *rb, rb_size_t capacity, void *(*alloc)(rb_size_t),
|
||||
/**
|
||||
* @brief Initialize the ring buffer
|
||||
* @param rb The ring buffer to initialize
|
||||
* @param capacity The capacity of the ring buffer
|
||||
* @param alloc The allocator function
|
||||
* @param struct_size The size of the struct
|
||||
* @return void
|
||||
*/
|
||||
void rb_init(struct RingBuf *rb, rb_size_t capacity, ALLOC_T alloc,
|
||||
rb_size_t struct_size);
|
||||
|
||||
/** Insert data to the ring buffer */
|
||||
/**
|
||||
* @brief Insert data to the ring buffer
|
||||
* @param rb The ring buffer
|
||||
* @param item The item to insert
|
||||
* @param memcpy_fn The memcpy function
|
||||
* @return WriteResult
|
||||
*/
|
||||
enum WriteResult rb_push_back(struct RingBuf *rb, const void *item,
|
||||
MEMCPY_T memcpy_fn);
|
||||
|
||||
/** Read data from the ring buffer */
|
||||
/**
|
||||
* @brief Read data from the ring buffer
|
||||
* @param rb The ring buffer
|
||||
* @param item The item to read into
|
||||
* @return ReadResult
|
||||
*/
|
||||
enum ReadResult rb_pop_front(struct RingBuf *rb, void *item);
|
||||
|
||||
/** Free the ring buffer */
|
||||
/**
|
||||
* @brief Free the ring buffer
|
||||
* @param rb The ring buffer
|
||||
* @param free The free function
|
||||
*/
|
||||
void rb_destroy(struct RingBuf *rb, void(free)());
|
||||
|
|
Loading…
Reference in a new issue