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