fifo快速实现

#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_ */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值