/* See COPYRIGHT for copyright information. */
/* Kevin Klues <klueska@cs.berkeley.edu>	*/

#pragma once

#include <string.h>

__BEGIN_DECLS

#define POOL_TYPE_DEFINE(_type, p, sz)                                         \
typedef struct struct_##p {                                                    \
	uint32_t size;                                                         \
	uint32_t free;                                                         \
	uint32_t index;                                                        \
	_type* queue[(sz)];                                                    \
	_type pool[(sz)];                                                      \
} p##_t;

#define POOL_INIT(p, sz)                                                       \
({                                                                             \
	(p)->size = (sz);                                                      \
	(p)->free = (sz);                                                      \
	(p)->index = 0;                                                        \
	memset((p)->pool, 0, (sz) * sizeof((p)->pool[0]));                     \
	for(int i=0; i<(p)->size; i++) {                                       \
		(p)->queue[i] = &((p)->pool[i]);                               \
	}                                                                      \
})

// removed unnecessary (p)->queue[(p)->index] = NULL;
#define POOL_GET(p)                                                            \
({                                                                             \
	void* rval = NULL;                                                     \
	if((p)->free) {                                                        \
		rval = (p)->queue[(p)->index];                                 \
		(p)->free--;                                                   \
		(p)->index++;                                                  \
		if((p)->index == (p)->size) {                                  \
			(p)->index = 0;                                        \
		}                                                              \
	}                                                                      \
	rval;                                                                  \
})

// emptyIndex is also the first element that has been allocated, iterate thru to
// index-1

#define POOL_FOR_EACH(p, func)						\
({									\
	int emptyIndex = ((p)->index + (p)->free);			\
	if (emptyIndex >= (p)->size) {					\
		emptyIndex -= (p)->size;				\
	}								\
	for(int _i = emptyIndex;  _i < (p)->index; _i++){		\
		func((p)->queue[_i]);					\
	}								\
})

#define POOL_PUT(p, val)                                                       \
({                                                                             \
	int rval = -1;                                                         \
	if((p)->free < (p)->size) {                                            \
		int emptyIndex = ((p)->index + (p)->free);                     \
		if (emptyIndex >= (p)->size) {                                 \
			emptyIndex -= (p)->size;                               \
		}                                                              \
		(p)->queue[emptyIndex] = val;                                  \
		(p)->free++;                                                   \
		rval = 1;                                                      \
	}                                                                      \
	rval;                                                                  \
})

#define POOL_EMPTY(p) ((p)->free == 0)
#define POOL_SIZE(p) ((p)->free)
#define POOL_MAX_SIZE(p) ((p)->size)

__END_DECLS
