#ifndef _SIMPLE_FIFO_H_
#define _SIMPLE_FIFO_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
struct simple_fifo {
uint32_t cnt; /* total count of elements */
uint32_t in;
uint32_t out;
uint32_t esize; /* size of queue element */
void *data;
};
static inline void sfifo_reset(struct simple_fifo *f)
{
f->in = f->out = 0;
}
static inline void sfifo_drain(struct simple_fifo *f)
{
f->out = f->in;
}
static inline uint32_t sfifo_len(struct simple_fifo *f)
{
return (f->in + f->cnt - f->out) % f->cnt;
}
static inline int sfifo_is_empty(struct simple_fifo *f)
{
return ((f->in % f->cnt) == (f->out % f->cnt));
}
static inline int sfifo_is_full(struct simple_fifo *f)
{
return (sfifo_len(f) == (f->cnt - 1));
}
static inline int sfifo_in(struct simple_fifo *f, void* ele)
{
if (sfifo_is_full(f))
{
return -1;
}
memcpy((void*)(f->data + f->esize * f->in), ele, f->esize);
f->in = (f->in + 1) % f->cnt;
return 0;
}
static inline int sfifo_override(struct simple_fifo *f, void* ele)
{
memcpy((void*)(f->data + f->esize * f->in), ele, f->esize);
f->in = (f->in + 1) % f->cnt;
return 0;
}
static inline int sfifo_out(struct simple_fifo *f, void* ele)
{
if (sfifo_is_empty(f))
{
return -1;
}
memcpy(ele, (void*)(f->data + f->esize * f->out), f->esize);
f->out = (f->out + 1) % f->cnt;
return 0;
}
static int sfifo_latest_out(struct simple_fifo *f, void* ele)
{
if (sfifo_is_empty(f))
{
return -1;
}
f->out = (f->in == 0) ? (f->cnt - 1) : (f->in - 1);
memcpy(ele, (void*)(f->data + f->esize * f->out), f->esize);
f->out = f->in;
return 0;
}
static inline int sfifo_peek(struct simple_fifo *f, void* ele)
{
if (sfifo_is_empty(f))
{
return -1;
}
memcpy(ele, (void*)(f->data + f->esize * f->out), f->esize);
return 0;
}
static inline int sfifo_skip(struct simple_fifo *f)
{
if (sfifo_is_empty(f))
{
return -1;
}
f->out = (f->out + 1) % f->cnt;
return 0;
}
static inline void sfifo_init(struct simple_fifo *f, int esize, int cnt, void *data)
{
f->cnt = cnt;
f->esize = esize;
f->data = data;
sfifo_reset(f);
}
static inline void sfifo_dump(struct simple_fifo *f)
{
//printf("sfifo_dump: %u %u %u %u, 0x%x \r\n",
// (unsigned int)f->cnt, (unsigned int)f->in, (unsigned int)f->out, (unsigned int)f->esize, (unsigned int)f->data);
}
static inline void *sfifo_in_addr(struct simple_fifo *f)
{
if (sfifo_is_full(f))
{
return NULL;
}
return (void *)(f->data + f->esize * f->in);
}
static inline void *sfifo_out_addr(struct simple_fifo *f)
{
if (sfifo_is_empty(f))
{
return NULL;
}
return (void *)(f->data + f->esize * f->out);
}
static inline int sfifo_in_skip(struct simple_fifo *f)
{
if (sfifo_is_full(f))
{
return -1;
}
f->in = (f->in + 1) % f->cnt;
return 0;
}
static inline int sfifo_out_skip(struct simple_fifo *f)
{
if (sfifo_is_empty(f))
{
return -1;
}
f->out = (f->out + 1) % f->cnt;
return 0;
}
#ifdef __cplusplus
}
#endif
#endif /* _SIMPLE_FIFO_H_ */
fifo快速实现
于 2022-05-25 10:14:35 首次发布