/*
 * Copyright (c) 2016-2017 Nordic Semiconductor ASA
 * Copyright (c) 2016 Vinayak Kariappa Chettimada
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @brief   Element of a memory-queue
 * @details Elements form a linked list, and as payload carries a pointer
 */
struct _memq_link {
	struct _memq_link *next; /* permit chaining */
	void              *mem;  /* payload */
};

typedef struct _memq_link memq_link_t;

#define MEMQ_DECLARE(name) \
	struct { \
		memq_link_t *head; \
		memq_link_t *tail; \
	} memq_##name

memq_link_t *memq_init(memq_link_t *link, memq_link_t **head,
		       memq_link_t **tail);

#define MEMQ_INIT(name, link) \
	memq_init(link, &memq_##name.head, &memq_##name.tail)

memq_link_t *memq_deinit(memq_link_t **head, memq_link_t **tail);
memq_link_t *memq_enqueue(memq_link_t *link, void *mem, memq_link_t **tail);
memq_link_t *memq_peek(memq_link_t *head, memq_link_t *tail, void **mem);
memq_link_t *memq_peek_n(memq_link_t *head, memq_link_t *tail, uint8_t n,
			 void **mem);
memq_link_t *memq_dequeue(memq_link_t *tail, memq_link_t **head, void **mem);
