gpt4 book ai didi

c++ - 替换循环缓冲区/fifo 队列数组元素中的 "FOR()"宏

转载 作者:行者123 更新时间:2023-11-30 01:15:58 24 4
gpt4 key购买 nike

我通过以下方式实现了 Elem 结构的 FIFO:

直到达到 max_elems 限制 Push() 简单地将给定元素放在数组中最后一个元素之后并递增 elems(计数)。如果 elems 已经达到 max_elems,它会通过推进头部索引来模拟弹出,因此它的行为就像一个循环缓冲区。

struct FIFO
{
FIFO(int mx)
{
head = 0;
elems = 0;
max_elems = mx;
elem = new Elem[max_elems];
}

int elems;
int max_elems;

Elem* elem; // [max_elems]

int head;

void Push( const Elem* e )
{
// int i = (elems+head) % max_elems;

int i = elems + head;
if (i >= max_elems)
i -= max_elems;

elem[ i ] = *e;

if (elems < max_elems)
elems ++;
else
{
head ++;
if (head == max_elems)
head = 0;
}
}

Elem* GetItem(int i)
{
// int j = (i+head)%max_elems;

int j = i + head;
if (j >= max_elems)
j -= max_elems;

return elem + j;
}
};

我需要经常迭代 elem 数组中的元素。我迫切需要保持 MAX 的表现。因此,我没有在常规 for() 中使用 GetItem,而是制作了一个 FOR 宏:

#define FOR(fifo,elem,from,count,code) \
if (fifo->head==0) \
{ \
int to = from+count;
for (int i = from; i<to; i++) \
{ \
Elem* elem = fifo->elem+i; \
code \
} \
else \
{ \
int f = from+fifo->head; \
if (f>=fifo->max_elems) \
f-=fifo->max_elems; \
int to = min(f + count, fifo->max_elems); \
for (int i = f; i<to; i++) \
{ \
Elem* elem = fifo->elem+i; \
code \
} \
to = count - (to-f); \
for (int i = 0; i<to; i++) \
{ \
Elem* elem = fifo->elem+i; \
code \
} \
}

这是我可以使用它的方式

void main()
{
FIFO buf(10000);
Elem e;

buf.Push(&e);
buf.Push(&e);
// ...

FOR ( buf, pe , 11, 5009, { pe->do_something(); } );
}

我讨厌这个宏,因为无法调试其中内联的“代码”。

最后我的问题是:

有没有更优雅的方法来制作这样的“FOR”而不是宏?

最佳答案

c++ 方法是用模板函数替换像这样可怕的宏,模板函数可以调试(和测试)。

编辑:根据要求,这是第一次尝试用函数替换宏。事实上,不需要模板——一个 std::function(可以从 lambda 初始化)就足够了:

void for_elems_in_fifo(FIFO* fifo,int from,int count,std::function<void(Elem&)> code)
{
if (fifo->head==0)
{
int to = from+count;
for (int i = from; i<to; i++)
{
Elem* elem = fifo->elem+i;
code(*elem);
}
}
else
{
int f = from+fifo->head;
if (f>=fifo->max_elems)
f-=fifo->max_elems;
int to = min(f + count, fifo->max_elems);
for (int i = f; i<to; i++)
{
Elem* elem = fifo->elem+i;
code(*elem);
}
to = count - (to-f);
for (int i = 0; i<to; i++)
{
Elem* elem = fifo->elem+i;
code(*elem);
}
}
}

关于c++ - 替换循环缓冲区/fifo 队列数组元素中的 "FOR()"宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27573204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com