⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.h

📁 abstract rtos
💻 H
字号:
#ifndef	_SYS_QUEUE_H_#define	_SYS_QUEUE_H_#define LIST_HEAD(name, type)						\struct name {								\	struct type *lh_first;				\}#define LIST_HEAD_INITIALIZER(head)					\	{ NULL }#define LIST_ENTRY(type)						\struct {								\	struct type *le_next;				\	struct type **le_prev;		\}#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field)#define QUEUEDEBUG_LIST_OP(elm, field)#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field)#define	LIST_INIT(head) do {						\	(head)->lh_first = NULL;					\} while (0)#define LIST_INSERT_AFTER(listelm, elm, field) do {			\	QUEUEDEBUG_LIST_OP((listelm), field)				\	if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)	\		(listelm)->field.le_next->field.le_prev =		\		    &(elm)->field.le_next;				\	(listelm)->field.le_next = (elm);				\	(elm)->field.le_prev = &(listelm)->field.le_next;		\} while (0)#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\	QUEUEDEBUG_LIST_OP((listelm), field)				\	(elm)->field.le_prev = (listelm)->field.le_prev;		\	(elm)->field.le_next = (listelm);				\	*(listelm)->field.le_prev = (elm);				\	(listelm)->field.le_prev = &(elm)->field.le_next;		\} while (0)#define LIST_INSERT_HEAD(head, elm, field) do {				\	QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field)		\	if (((elm)->field.le_next = (head)->lh_first) != NULL)		\		(head)->lh_first->field.le_prev = &(elm)->field.le_next;\	(head)->lh_first = (elm);					\	(elm)->field.le_prev = &(head)->lh_first;			\} while (0)#define LIST_REMOVE(elm, field) do {					\	QUEUEDEBUG_LIST_OP((elm), field)				\	if ((elm)->field.le_next != NULL)				\		(elm)->field.le_next->field.le_prev = 			\		    (elm)->field.le_prev;				\	*(elm)->field.le_prev = (elm)->field.le_next;			\	QUEUEDEBUG_LIST_POSTREMOVE((elm), field)			\} while (0)#define LIST_FOREACH(var, head, field)					\	for ((var) = ((head)->lh_first);				\		(var);							\		(var) = ((var)->field.le_next))#define	LIST_EMPTY(head)		((head)->lh_first == NULL)#define	LIST_FIRST(head)		((head)->lh_first)#define	LIST_NEXT(elm, field)		((elm)->field.le_next)#define SLIST_HEAD(name, type)						\struct name {								\	struct type *slh_first;				\}#define SLIST_HEAD_INITIALIZER(head)					\	{ NULL } #define SLIST_ENTRY(type)						\struct {								\	struct type *sle_next;				\} #define	SLIST_EMPTY(head)	((head)->slh_first == NULL)#define	SLIST_FIRST(head)	((head)->slh_first)#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)#define SLIST_FOREACH(var, head, field)					\	for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next)#define SLIST_INIT(head) do {						\	(head)->slh_first = NULL;					\} while (0)#define SLIST_INSERT_AFTER(slistelm, elm, field) do {			\	(elm)->field.sle_next = (slistelm)->field.sle_next;		\	(slistelm)->field.sle_next = (elm);				\} while (0)#define SLIST_INSERT_HEAD(head, elm, field) do {			\	(elm)->field.sle_next = (head)->slh_first;			\	(head)->slh_first = (elm);					\} while (0)#define SLIST_NEXT(elm, field)	((elm)->field.sle_next)#define SLIST_REMOVE_HEAD(head, field) do {				\	(head)->slh_first = (head)->slh_first->field.sle_next;		\} while (0)#define SLIST_REMOVE(head, elm, type, field) do {			\	if ((head)->slh_first == (elm)) {				\		SLIST_REMOVE_HEAD((head), field);			\	}								\	else {								\		struct type *curelm = (head)->slh_first;		\		while(curelm->field.sle_next != (elm))			\			curelm = curelm->field.sle_next;		\		curelm->field.sle_next =				\		    curelm->field.sle_next->field.sle_next;		\	}								\} while (0)#define SIMPLEQ_HEAD(name, type)					\struct name {								\	struct type *sqh_first;				\	struct type **sqh_last;			\}#define SIMPLEQ_HEAD_INITIALIZER(head)					\	{ NULL, &(head).sqh_first }#define SIMPLEQ_ENTRY(type)						\struct {								\	struct type *sqe_next;				\}#define	SIMPLEQ_INIT(head) do {						\	(head)->sqh_first = NULL;					\	(head)->sqh_last = &(head)->sqh_first;				\} while (0)#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {			\	if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)	\		(head)->sqh_last = &(elm)->field.sqe_next;		\	(head)->sqh_first = (elm);					\} while (0)#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.sqe_next = NULL;					\	*(head)->sqh_last = (elm);					\	(head)->sqh_last = &(elm)->field.sqe_next;			\} while (0)#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\	if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\		(head)->sqh_last = &(elm)->field.sqe_next;		\	(listelm)->field.sqe_next = (elm);				\} while (0)#define SIMPLEQ_REMOVE_HEAD(head, elm, field) do {			\	if (((head)->sqh_first = (elm)->field.sqe_next) == NULL)	\		(head)->sqh_last = &(head)->sqh_first;			\} while (0)#define SIMPLEQ_FOREACH(var, head, field)				\	for ((var) = ((head)->sqh_first);				\		(var);							\		(var) = ((var)->field.sqe_next))#define	SIMPLEQ_EMPTY(head)		((head)->sqh_first == NULL)#define	SIMPLEQ_FIRST(head)		((head)->sqh_first)#define	SIMPLEQ_NEXT(elm, field)	((elm)->field.sqe_next)#define TAILQ_HEAD(name, type)						\struct name {								\	struct type *tqh_first;				\	struct type **tqh_last;			\}#define TAILQ_HEAD_INITIALIZER(head)					\	{ NULL, &(head).tqh_first }#define TAILQ_ENTRY(type)						\struct {								\	struct type *tqe_next;				\	struct type **tqe_prev;		\}#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)#define QUEUEDEBUG_TAILQ_OP(elm, field)#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field)#define	TAILQ_INIT(head) do {						\	(head)->tqh_first = NULL;					\	(head)->tqh_last = &(head)->tqh_first;				\} while (0)#define TAILQ_INSERT_HEAD(head, elm, field) do {			\	QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field)		\	if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\		(head)->tqh_first->field.tqe_prev =			\		    &(elm)->field.tqe_next;				\	else								\		(head)->tqh_last = &(elm)->field.tqe_next;		\	(head)->tqh_first = (elm);					\	(elm)->field.tqe_prev = &(head)->tqh_first;			\} while (0)#define TAILQ_INSERT_TAIL(head, elm, field) do {			\	QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field)		\	(elm)->field.tqe_next = NULL;					\	(elm)->field.tqe_prev = (head)->tqh_last;			\	*(head)->tqh_last = (elm);					\	(head)->tqh_last = &(elm)->field.tqe_next;			\} while (0)#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\	QUEUEDEBUG_TAILQ_OP((listelm), field)				\	if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\		(elm)->field.tqe_next->field.tqe_prev = 		\		    &(elm)->field.tqe_next;				\	else								\		(head)->tqh_last = &(elm)->field.tqe_next;		\	(listelm)->field.tqe_next = (elm);				\	(elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\} while (0)#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\	QUEUEDEBUG_TAILQ_OP((listelm), field)				\	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\	(elm)->field.tqe_next = (listelm);				\	*(listelm)->field.tqe_prev = (elm);				\	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\} while (0)#define TAILQ_REMOVE(head, elm, field) do {				\	QUEUEDEBUG_TAILQ_OP((elm), field)				\	if (((elm)->field.tqe_next) != NULL)				\		(elm)->field.tqe_next->field.tqe_prev = 		\		    (elm)->field.tqe_prev;				\	else								\		(head)->tqh_last = (elm)->field.tqe_prev;		\	*(elm)->field.tqe_prev = (elm)->field.tqe_next;			\	QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field);			\} while (0)#define	TAILQ_EMPTY(head)		((head)->tqh_first == NULL)#define	TAILQ_FIRST(head)		((head)->tqh_first)#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)#define TAILQ_LAST(head, headname) \	(*(((struct headname *)((head)->tqh_last))->tqh_last))#define TAILQ_PREV(elm, headname, field) \	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))#define TAILQ_FOREACH(var, head, field)					\	for ((var) = ((head)->tqh_first);				\		(var);							\		(var) = ((var)->field.tqe_next))#define TAILQ_FOREACH_REVERSE(var, head, headname, field)		\	for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));	\		(var);							\		(var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))#define CIRCLEQ_HEAD(name, type)					\struct name {								\	struct type *cqh_first;				\	struct type *cqh_last;				\}#define CIRCLEQ_HEAD_INITIALIZER(head)					\	{ (VOID *)&head, (VOID *)&head }#define CIRCLEQ_ENTRY(type)						\struct {								\	struct type *cqe_next;				\	struct type *cqe_prev;				\}#define	CIRCLEQ_INIT(head) do {						\	(head)->cqh_first = (VOID *)(head);				\	(head)->cqh_last = (VOID *)(head);				\} while (0)#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\	(elm)->field.cqe_next = (listelm)->field.cqe_next;		\	(elm)->field.cqe_prev = (listelm);				\	if ((listelm)->field.cqe_next == (VOID *)(head))		\		(head)->cqh_last = (elm);				\	else								\		(listelm)->field.cqe_next->field.cqe_prev = (elm);	\	(listelm)->field.cqe_next = (elm);				\} while (0)#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\	(elm)->field.cqe_next = (listelm);				\	(elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\	if ((listelm)->field.cqe_prev == (VOID *)(head))		\		(head)->cqh_first = (elm);				\	else								\		(listelm)->field.cqe_prev->field.cqe_next = (elm);	\	(listelm)->field.cqe_prev = (elm);				\} while (0)#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\	(elm)->field.cqe_next = (head)->cqh_first;			\	(elm)->field.cqe_prev = (VOID *)(head);				\	if ((head)->cqh_last == (VOID *)(head))				\		(head)->cqh_last = (elm);				\	else								\		(head)->cqh_first->field.cqe_prev = (elm);		\	(head)->cqh_first = (elm);					\} while (0)#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\	(elm)->field.cqe_next = (VOID *)(head);				\	(elm)->field.cqe_prev = (head)->cqh_last;			\	if ((head)->cqh_first == (VOID *)(head))			\		(head)->cqh_first = (elm);				\	else								\		(head)->cqh_last->field.cqe_next = (elm);		\	(head)->cqh_last = (elm);					\} while (0)#define	CIRCLEQ_REMOVE(head, elm, field) do {				\	if ((elm)->field.cqe_next == (VOID *)(head))			\		(head)->cqh_last = (elm)->field.cqe_prev;		\	else								\		(elm)->field.cqe_next->field.cqe_prev =			\		    (elm)->field.cqe_prev;				\	if ((elm)->field.cqe_prev == (VOID *)(head))			\		(head)->cqh_first = (elm)->field.cqe_next;		\	else								\		(elm)->field.cqe_prev->field.cqe_next =			\		    (elm)->field.cqe_next;				\} while (0)#define CIRCLEQ_FOREACH(var, head, field)				\	for ((var) = ((head)->cqh_first);				\		(var) != (VOID *)(head);				\		(var) = ((var)->field.cqe_next))#define CIRCLEQ_FOREACH_REVERSE(var, head, field)			\	for ((var) = ((head)->cqh_last);				\		(var) != (VOID *)(head);				\		(var) = ((var)->field.cqe_prev))#define	CIRCLEQ_EMPTY(head)		((head)->cqh_first == (VOID *)(head))#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)#define	CIRCLEQ_LAST(head)		((head)->cqh_last)#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)#endif	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -