184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans/* Ring definitions. */ 2a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr(a_type) \ 384cbbcb90af44807361198baed4e74ab77715ff7Jason Evansstruct { \ 484cbbcb90af44807361198baed4e74ab77715ff7Jason Evans a_type *qre_next; \ 584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans a_type *qre_prev; \ 684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} 784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans/* Ring functions. */ 9a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_new(a_qr, a_field) do { \ 1084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_next = (a_qr); \ 1184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_prev = (a_qr); \ 1284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 1384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 14a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_next(a_qr, a_field) ((a_qr)->a_field.qre_next) 1584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 16a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_prev(a_qr, a_field) ((a_qr)->a_field.qre_prev) 1784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 18a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_before_insert(a_qrelm, a_qr, a_field) do { \ 1984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_prev = (a_qrelm)->a_field.qre_prev; \ 2084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_next = (a_qrelm); \ 2184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_prev->a_field.qre_next = (a_qr); \ 2284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qrelm)->a_field.qre_prev = (a_qr); \ 2384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 2484cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 25a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_after_insert(a_qrelm, a_qr, a_field) \ 2684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans do \ 2784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans { \ 2884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_next = (a_qrelm)->a_field.qre_next; \ 2984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_prev = (a_qrelm); \ 3084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_next->a_field.qre_prev = (a_qr); \ 3184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qrelm)->a_field.qre_next = (a_qr); \ 3284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans } while (0) 3384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 34a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_meld(a_qr_a, a_qr_b, a_field) do { \ 3584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans void *t; \ 3684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr_a)->a_field.qre_prev->a_field.qre_next = (a_qr_b); \ 3784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr_b)->a_field.qre_prev->a_field.qre_next = (a_qr_a); \ 3884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans t = (a_qr_a)->a_field.qre_prev; \ 3984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr_a)->a_field.qre_prev = (a_qr_b)->a_field.qre_prev; \ 4084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr_b)->a_field.qre_prev = t; \ 4184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 4284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 4383e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris/* 4483e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris * qr_meld() and qr_split() are functionally equivalent, so there's no need to 4583e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris * have two copies of the code. 4683e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris */ 47a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_split(a_qr_a, a_qr_b, a_field) \ 4884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans qr_meld((a_qr_a), (a_qr_b), a_field) 4984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 50a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_remove(a_qr, a_field) do { \ 5184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_prev->a_field.qre_next \ 5284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans = (a_qr)->a_field.qre_next; \ 5384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_next->a_field.qre_prev \ 5484cbbcb90af44807361198baed4e74ab77715ff7Jason Evans = (a_qr)->a_field.qre_prev; \ 5584cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_next = (a_qr); \ 5684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (a_qr)->a_field.qre_prev = (a_qr); \ 5784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans} while (0) 5884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 59a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_foreach(var, a_qr, a_field) \ 6084cbbcb90af44807361198baed4e74ab77715ff7Jason Evans for ((var) = (a_qr); \ 6184cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (var) != NULL; \ 6284cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (var) = (((var)->a_field.qre_next != (a_qr)) \ 6384cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ? (var)->a_field.qre_next : NULL)) 6484cbbcb90af44807361198baed4e74ab77715ff7Jason Evans 65a4f124f59fa5f702231432a7e5fa45140ba81e2aJason Evans#define qr_reverse_foreach(var, a_qr, a_field) \ 6684cbbcb90af44807361198baed4e74ab77715ff7Jason Evans for ((var) = ((a_qr) != NULL) ? qr_prev(a_qr, a_field) : NULL; \ 6784cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (var) != NULL; \ 6884cbbcb90af44807361198baed4e74ab77715ff7Jason Evans (var) = (((var) != (a_qr)) \ 6984cbbcb90af44807361198baed4e74ab77715ff7Jason Evans ? (var)->a_field.qre_prev : NULL)) 70