ql.h revision 84cbbcb90af44807361198baed4e74ab77715ff7
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/******************************************************************************
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * Copyright (C) 2002 Jason Evans <jasone@canonware.com>.
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * All rights reserved.
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * Redistribution and use in source and binary forms, with or without
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * modification, are permitted provided that the following conditions
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * are met:
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * 1. Redistributions of source code must retain the above copyright
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *    notice(s), this list of conditions and the following disclaimer
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *    unmodified other than the allowable addition of one or more
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *    copyright notices.
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * 2. Redistributions in binary form must reproduce the above copyright
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *    notice(s), this list of conditions and the following disclaimer in
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *    the documentation and/or other materials provided with the
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *    distribution.
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ******************************************************************************/
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/*
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * List definitions.
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner */
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_head(a_type)							\
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstruct {								\
3717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	a_type *qlh_first;						\
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
4017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham#define ql_head_initializer(a_head) {NULL}
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42f4124deeb9532044a38c0774ced872f2709347daGreg Clayton#define ql_elm(a_type)	qr(a_type)
4317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/* List functions. */
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_new(a_head) do {						\
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	(a_head)->qlh_first = NULL;					\
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} while (0)
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_elm_new(a_elm, a_field) qr_new((a_elm), a_field)
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_first(a_head) ((a_head)->qlh_first)
5217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_last(a_head, a_field)					\
5417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	((ql_first(a_head) != NULL)					\
5517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	    ? qr_prev(ql_first(a_head), a_field) : NULL)
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57f4124deeb9532044a38c0774ced872f2709347daGreg Clayton#define ql_next(a_head, a_elm, a_field)					\
5817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	((ql_last(a_head, a_field) != (a_elm))				\
5917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	    ? qr_next((a_elm), a_field)	: NULL)
6017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
6117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham#define ql_prev(a_head, a_elm, a_field)					\
6217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	((ql_first(a_head) != (a_elm)) ? qr_prev((a_elm), a_field)	\
6317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham				       : NULL)
64c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
6517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham#define ql_before_insert(a_head, a_qlelm, a_elm, a_field) do {		\
6617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	qr_before_insert((a_qlelm), (a_elm), a_field);			\
6717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	if (ql_first(a_head) == (a_qlelm)) {				\
6817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham		ql_first(a_head) = (a_elm);				\
6917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	}								\
7017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham} while (0)
7117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
72c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#define ql_after_insert(a_qlelm, a_elm, a_field)			\
73c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton	qr_after_insert((a_qlelm), (a_elm), a_field)
74f4124deeb9532044a38c0774ced872f2709347daGreg Clayton
75c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#define ql_head_insert(a_head, a_elm, a_field) do {			\
76c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton	if (ql_first(a_head) != NULL) {					\
77c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton		qr_before_insert(ql_first(a_head), (a_elm), a_field);	\
78c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton	}								\
7917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	ql_first(a_head) = (a_elm);					\
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} while (0)
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_tail_insert(a_head, a_elm, a_field) do {			\
8317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	if (ql_first(a_head) != NULL) {					\
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner		qr_before_insert(ql_first(a_head), (a_elm), a_field);	\
8517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	}								\
8617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	ql_first(a_head) = qr_next((a_elm), a_field);			\
8717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham} while (0)
8817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_remove(a_head, a_elm, a_field) do {				\
9017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	if (ql_first(a_head) == (a_elm)) {				\
91f4124deeb9532044a38c0774ced872f2709347daGreg Clayton		ql_first(a_head) = qr_next(ql_first(a_head), a_field);	\
9217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	}								\
9317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	if (ql_first(a_head) != (a_elm)) {				\
9417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham		qr_remove((a_elm), a_field);				\
9517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	} else {							\
96090f83176695d86197b0e86b67dee4160ec5003dJim Ingham		ql_first(a_head) = NULL;				\
9717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	}								\
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} while (0)
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_head_remove(a_head, a_type, a_field) do {			\
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	a_type *t = ql_first(a_head);					\
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	ql_remove((a_head), t, a_field);				\
10317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham} while (0)
10417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_tail_remove(a_head, a_type, a_field) do {			\
106f4124deeb9532044a38c0774ced872f2709347daGreg Clayton	a_type *t = ql_last(a_head, a_field);				\
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	ql_remove((a_head), t, a_field);				\
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} while (0)
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ql_foreach(a_var, a_head, a_field)				\
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	qr_foreach((a_var), ql_first(a_head), a_field)
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham#define ql_reverse_foreach(a_var, a_head, a_field)			\
11417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham	qr_reverse_foreach((a_var), ql_first(a_head), a_field)
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner