ql.h revision a4f124f59fa5f702231432a7e5fa45140ba81e2a
184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans/* 284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans * List definitions. 384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans */ 4a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_head(a_type) \ 584cbbcb90af44807361198baed4e74ab77715ff7Jason Evansstruct { \ 684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans a_type *qlh_first; \ 784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} 884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 9a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_head_initializer(a_head) {NULL} 1084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 11a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_elm(a_type) qr(a_type) 1284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 1384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans/* List functions. */ 14a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_new(a_head) do { \ 1584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_head)->qlh_first = NULL; \ 1684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 1784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 18a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_elm_new(a_elm, a_field) qr_new((a_elm), a_field) 1984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 20a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_first(a_head) ((a_head)->qlh_first) 2184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 22a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_last(a_head, a_field) \ 2384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ((ql_first(a_head) != NULL) \ 2484cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ? qr_prev(ql_first(a_head), a_field) : NULL) 2584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 26a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_next(a_head, a_elm, a_field) \ 2784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ((ql_last(a_head, a_field) != (a_elm)) \ 2884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ? qr_next((a_elm), a_field) : NULL) 2984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 30a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_prev(a_head, a_elm, a_field) \ 3184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ((ql_first(a_head) != (a_elm)) ? qr_prev((a_elm), a_field) \ 3284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans : NULL) 3384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 34a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_before_insert(a_head, a_qlelm, a_elm, a_field) do { \ 3584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_before_insert((a_qlelm), (a_elm), a_field); \ 3684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans if (ql_first(a_head) == (a_qlelm)) { \ 3784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ql_first(a_head) = (a_elm); \ 3884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans } \ 3984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 4084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 41a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_after_insert(a_qlelm, a_elm, a_field) \ 4284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_after_insert((a_qlelm), (a_elm), a_field) 4384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 44a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_head_insert(a_head, a_elm, a_field) do { \ 4584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans if (ql_first(a_head) != NULL) { \ 4684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_before_insert(ql_first(a_head), (a_elm), a_field); \ 4784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans } \ 4884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ql_first(a_head) = (a_elm); \ 4984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 5084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 51a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_tail_insert(a_head, a_elm, a_field) do { \ 5284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans if (ql_first(a_head) != NULL) { \ 5384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_before_insert(ql_first(a_head), (a_elm), a_field); \ 5484cbbcb90af44807361198baed4e74ab77715ff7Jason Evans } \ 5584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ql_first(a_head) = qr_next((a_elm), a_field); \ 5684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 5784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 58a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_remove(a_head, a_elm, a_field) do { \ 5984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans if (ql_first(a_head) == (a_elm)) { \ 6084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ql_first(a_head) = qr_next(ql_first(a_head), a_field); \ 6184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans } \ 6284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans if (ql_first(a_head) != (a_elm)) { \ 6384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_remove((a_elm), a_field); \ 6484cbbcb90af44807361198baed4e74ab77715ff7Jason Evans } else { \ 6584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ql_first(a_head) = NULL; \ 6684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans } \ 6784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 6884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 69a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_head_remove(a_head, a_type, a_field) do { \ 7084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans a_type *t = ql_first(a_head); \ 7184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ql_remove((a_head), t, a_field); \ 7284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 7384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 74a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_tail_remove(a_head, a_type, a_field) do { \ 7584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans a_type *t = ql_last(a_head, a_field); \ 7684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ql_remove((a_head), t, a_field); \ 7784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 7884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 79a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_foreach(a_var, a_head, a_field) \ 8084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_foreach((a_var), ql_first(a_head), a_field) 8184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 82a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define ql_reverse_foreach(a_var, a_head, a_field) \ 8384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_reverse_foreach((a_var), ql_first(a_head), a_field) 84