68#define NIL ((List *) NULL)
172#define lfirst(lc) ((lc)->ptr_value)
173#define lfirst_int(lc) ((lc)->int_value)
174#define lfirst_oid(lc) ((lc)->oid_value)
175#define lfirst_xid(lc) ((lc)->xid_value)
176#define lfirst_node(type,lc) castNode(type, lfirst(lc))
178#define linitial(l) lfirst(list_nth_cell(l, 0))
179#define linitial_int(l) lfirst_int(list_nth_cell(l, 0))
180#define linitial_oid(l) lfirst_oid(list_nth_cell(l, 0))
181#define linitial_node(type,l) castNode(type, linitial(l))
183#define lsecond(l) lfirst(list_nth_cell(l, 1))
184#define lsecond_int(l) lfirst_int(list_nth_cell(l, 1))
185#define lsecond_oid(l) lfirst_oid(list_nth_cell(l, 1))
186#define lsecond_node(type,l) castNode(type, lsecond(l))
188#define lthird(l) lfirst(list_nth_cell(l, 2))
189#define lthird_int(l) lfirst_int(list_nth_cell(l, 2))
190#define lthird_oid(l) lfirst_oid(list_nth_cell(l, 2))
191#define lthird_node(type,l) castNode(type, lthird(l))
193#define lfourth(l) lfirst(list_nth_cell(l, 3))
194#define lfourth_int(l) lfirst_int(list_nth_cell(l, 3))
195#define lfourth_oid(l) lfirst_oid(list_nth_cell(l, 3))
196#define lfourth_node(type,l) castNode(type, lfourth(l))
198#define llast(l) lfirst(list_last_cell(l))
199#define llast_int(l) lfirst_int(list_last_cell(l))
200#define llast_oid(l) lfirst_oid(list_last_cell(l))
201#define llast_xid(l) lfirst_xid(list_last_cell(l))
202#define llast_node(type,l) castNode(type, llast(l))
244#define list_make1(x1) \
245 list_make1_impl(T_List, list_make_ptr_cell(x1))
246#define list_make2(x1,x2) \
247 list_make2_impl(T_List, list_make_ptr_cell(x1), list_make_ptr_cell(x2))
248#define list_make3(x1,x2,x3) \
249 list_make3_impl(T_List, list_make_ptr_cell(x1), list_make_ptr_cell(x2), \
250 list_make_ptr_cell(x3))
251#define list_make4(x1,x2,x3,x4) \
252 list_make4_impl(T_List, list_make_ptr_cell(x1), list_make_ptr_cell(x2), \
253 list_make_ptr_cell(x3), list_make_ptr_cell(x4))
254#define list_make5(x1,x2,x3,x4,x5) \
255 list_make5_impl(T_List, list_make_ptr_cell(x1), list_make_ptr_cell(x2), \
256 list_make_ptr_cell(x3), list_make_ptr_cell(x4), \
257 list_make_ptr_cell(x5))
259#define list_make1_int(x1) \
260 list_make1_impl(T_IntList, list_make_int_cell(x1))
261#define list_make2_int(x1,x2) \
262 list_make2_impl(T_IntList, list_make_int_cell(x1), list_make_int_cell(x2))
263#define list_make3_int(x1,x2,x3) \
264 list_make3_impl(T_IntList, list_make_int_cell(x1), list_make_int_cell(x2), \
265 list_make_int_cell(x3))
266#define list_make4_int(x1,x2,x3,x4) \
267 list_make4_impl(T_IntList, list_make_int_cell(x1), list_make_int_cell(x2), \
268 list_make_int_cell(x3), list_make_int_cell(x4))
269#define list_make5_int(x1,x2,x3,x4,x5) \
270 list_make5_impl(T_IntList, list_make_int_cell(x1), list_make_int_cell(x2), \
271 list_make_int_cell(x3), list_make_int_cell(x4), \
272 list_make_int_cell(x5))
274#define list_make1_oid(x1) \
275 list_make1_impl(T_OidList, list_make_oid_cell(x1))
276#define list_make2_oid(x1,x2) \
277 list_make2_impl(T_OidList, list_make_oid_cell(x1), list_make_oid_cell(x2))
278#define list_make3_oid(x1,x2,x3) \
279 list_make3_impl(T_OidList, list_make_oid_cell(x1), list_make_oid_cell(x2), \
280 list_make_oid_cell(x3))
281#define list_make4_oid(x1,x2,x3,x4) \
282 list_make4_impl(T_OidList, list_make_oid_cell(x1), list_make_oid_cell(x2), \
283 list_make_oid_cell(x3), list_make_oid_cell(x4))
284#define list_make5_oid(x1,x2,x3,x4,x5) \
285 list_make5_impl(T_OidList, list_make_oid_cell(x1), list_make_oid_cell(x2), \
286 list_make_oid_cell(x3), list_make_oid_cell(x4), \
287 list_make_oid_cell(x5))
289#define list_make1_xid(x1) \
290 list_make1_impl(T_XidList, list_make_xid_cell(x1))
291#define list_make2_xid(x1,x2) \
292 list_make2_impl(T_XidList, list_make_xid_cell(x1), list_make_xid_cell(x2))
293#define list_make3_xid(x1,x2,x3) \
294 list_make3_impl(T_XidList, list_make_xid_cell(x1), list_make_xid_cell(x2), \
295 list_make_xid_cell(x3))
296#define list_make4_xid(x1,x2,x3,x4) \
297 list_make4_impl(T_XidList, list_make_xid_cell(x1), list_make_xid_cell(x2), \
298 list_make_xid_cell(x3), list_make_xid_cell(x4))
299#define list_make5_xid(x1,x2,x3,x4,x5) \
300 list_make5_impl(T_XidList, list_make_xid_cell(x1), list_make_xid_cell(x2), \
301 list_make_xid_cell(x3), list_make_xid_cell(x4), \
302 list_make_xid_cell(x5))
313 return &list->elements[n];
323 return &list->elements[list->length - 1];
359#define list_nth_node(type,list,n) castNode(type, list_nth(list, n))
405#define foreach(cell, lst) \
406 for (ForEachState cell##__state = {(lst), 0}; \
407 (cell##__state.l != NIL && \
408 cell##__state.i < cell##__state.l->length) ? \
409 (cell = &cell##__state.l->elements[cell##__state.i], true) : \
410 (cell = NULL, false); \
423#define foreach_delete_current(lst, var_or_cell) \
424 ((List *) (var_or_cell##__state.l = list_delete_nth_cell(lst, var_or_cell##__state.i--)))
435#define foreach_current_index(var_or_cell) (var_or_cell##__state.i)
446#define for_each_from(cell, lst, N) \
447 for (ForEachState cell##__state = for_each_from_setup(lst, N); \
448 (cell##__state.l != NIL && \
449 cell##__state.i < cell##__state.l->length) ? \
450 (cell = &cell##__state.l->elements[cell##__state.i], true) : \
451 (cell = NULL, false); \
470#define for_each_cell(cell, lst, initcell) \
471 for (ForEachState cell##__state = for_each_cell_setup(lst, initcell); \
472 (cell##__state.l != NIL && \
473 cell##__state.i < cell##__state.l->length) ? \
474 (cell = &cell##__state.l->elements[cell##__state.i], true) : \
475 (cell = NULL, false); \
501#define foreach_ptr(type, var, lst) foreach_internal(type, *, var, lst, lfirst)
502#define foreach_int(var, lst) foreach_internal(int, , var, lst, lfirst_int)
503#define foreach_oid(var, lst) foreach_internal(Oid, , var, lst, lfirst_oid)
504#define foreach_xid(var, lst) foreach_internal(TransactionId, , var, lst, lfirst_xid)
513#define foreach_internal(type, pointer, var, lst, func) \
514 for (type pointer var = 0, pointer var##__outerloop = (type pointer) 1; \
516 var##__outerloop = 0) \
517 for (ForEachState var##__state = {(lst), 0}; \
518 (var##__state.l != NIL && \
519 var##__state.i < var##__state.l->length && \
520 (var = (type pointer) func(&var##__state.l->elements[var##__state.i]), true)); \
528#define foreach_node(type, var, lst) \
529 for (type * var = 0, *var##__outerloop = (type *) 1; \
531 var##__outerloop = 0) \
532 for (ForEachState var##__state = {(lst), 0}; \
533 (var##__state.l != NIL && \
534 var##__state.i < var##__state.l->length && \
535 (var = lfirst_node(type, &var##__state.l->elements[var##__state.i]), true)); \
550#define forboth(cell1, list1, cell2, list2) \
551 for (ForBothState cell1##__state = {(list1), (list2), 0}; \
552 multi_for_advance_cell(cell1, cell1##__state, l1, i), \
553 multi_for_advance_cell(cell2, cell1##__state, l2, i), \
554 (cell1 != NULL && cell2 != NULL); \
557#define multi_for_advance_cell(cell, state, l, i) \
558 (cell = (state.l != NIL && state.i < state.l->length) ? \
559 &state.l->elements[state.i] : NULL)
572#define for_both_cell(cell1, list1, initcell1, cell2, list2, initcell2) \
573 for (ForBothCellState cell1##__state = \
574 for_both_cell_setup(list1, initcell1, list2, initcell2); \
575 multi_for_advance_cell(cell1, cell1##__state, l1, i1), \
576 multi_for_advance_cell(cell2, cell1##__state, l2, i2), \
577 (cell1 != NULL && cell2 != NULL); \
578 cell1##__state.i1++, cell1##__state.i2++)
595#define forthree(cell1, list1, cell2, list2, cell3, list3) \
596 for (ForThreeState cell1##__state = {(list1), (list2), (list3), 0}; \
597 multi_for_advance_cell(cell1, cell1##__state, l1, i), \
598 multi_for_advance_cell(cell2, cell1##__state, l2, i), \
599 multi_for_advance_cell(cell3, cell1##__state, l3, i), \
600 (cell1 != NULL && cell2 != NULL && cell3 != NULL); \
607#define forfour(cell1, list1, cell2, list2, cell3, list3, cell4, list4) \
608 for (ForFourState cell1##__state = {(list1), (list2), (list3), (list4), 0}; \
609 multi_for_advance_cell(cell1, cell1##__state, l1, i), \
610 multi_for_advance_cell(cell2, cell1##__state, l2, i), \
611 multi_for_advance_cell(cell3, cell1##__state, l3, i), \
612 multi_for_advance_cell(cell4, cell1##__state, l4, i), \
613 (cell1 != NULL && cell2 != NULL && cell3 != NULL && cell4 != NULL); \
620#define forfive(cell1, list1, cell2, list2, cell3, list3, cell4, list4, cell5, list5) \
621 for (ForFiveState cell1##__state = {(list1), (list2), (list3), (list4), (list5), 0}; \
622 multi_for_advance_cell(cell1, cell1##__state, l1, i), \
623 multi_for_advance_cell(cell2, cell1##__state, l2, i), \
624 multi_for_advance_cell(cell3, cell1##__state, l3, i), \
625 multi_for_advance_cell(cell4, cell1##__state, l4, i), \
626 multi_for_advance_cell(cell5, cell1##__state, l5, i), \
627 (cell1 != NULL && cell2 != NULL && cell3 != NULL && \
628 cell4 != NULL && cell5 != NULL); \
#define Assert(condition)
#define FLEXIBLE_ARRAY_MEMBER
#define IsA(nodeptr, _type_)
static ListCell list_make_oid_cell(Oid v)
pg_nodiscard List * list_delete_first(List *list)
List * list_difference(const List *list1, const List *list2)
pg_nodiscard List * list_copy_tail(const List *oldlist, int nskip)
pg_nodiscard List * lcons(void *datum, List *list)
pg_nodiscard List * list_delete_first_n(List *list, int n)
List * list_union_ptr(const List *list1, const List *list2)
List * list_make4_impl(NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3, ListCell datum4)
pg_nodiscard List * lappend_oid(List *list, Oid datum)
void list_sort(List *list, list_sort_comparator cmp)
static int list_length(const List *l)
pg_nodiscard List * list_append_unique_ptr(List *list, void *datum)
pg_nodiscard List * list_concat_unique(List *list1, const List *list2)
static ForEachState for_each_cell_setup(const List *lst, const ListCell *initcell)
pg_nodiscard List * list_concat_unique_int(List *list1, const List *list2)
pg_nodiscard List * list_copy_head(const List *oldlist, int len)
pg_nodiscard List * list_concat_copy(const List *list1, const List *list2)
List * list_difference_ptr(const List *list1, const List *list2)
static Oid list_nth_oid(const List *list, int n)
List * list_difference_int(const List *list1, const List *list2)
pg_nodiscard List * list_copy(const List *oldlist)
List * list_intersection(const List *list1, const List *list2)
List * list_make3_impl(NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3)
pg_nodiscard List * lappend(List *list, void *datum)
pg_nodiscard List * list_copy_deep(const List *oldlist)
pg_nodiscard List * list_append_unique_int(List *list, int datum)
pg_nodiscard List * lcons_oid(Oid datum, List *list)
pg_nodiscard List * list_append_unique(List *list, void *datum)
pg_nodiscard List * list_delete_oid(List *list, Oid datum)
pg_nodiscard List * lappend_xid(List *list, TransactionId datum)
pg_nodiscard List * list_delete_ptr(List *list, void *datum)
static void * list_nth(const List *list, int n)
List * list_difference_oid(const List *list1, const List *list2)
pg_nodiscard List * lappend_int(List *list, int datum)
pg_nodiscard List * list_insert_nth_oid(List *list, int pos, Oid datum)
pg_nodiscard List * list_delete_int(List *list, int datum)
pg_nodiscard List * list_delete_last(List *list)
pg_nodiscard List * list_insert_nth(List *list, int pos, void *datum)
List * list_union_oid(const List *list1, const List *list2)
pg_nodiscard List * list_concat_unique_oid(List *list1, const List *list2)
static ListCell * list_nth_cell(const List *list, int n)
bool list_member_xid(const List *list, TransactionId datum)
static ListCell * list_head(const List *l)
static ListCell list_make_xid_cell(TransactionId v)
List * list_make1_impl(NodeTag t, ListCell datum1)
pg_nodiscard List * list_append_unique_oid(List *list, Oid datum)
List * list_intersection_int(const List *list1, const List *list2)
pg_nodiscard List * list_delete_nth_cell(List *list, int n)
pg_nodiscard List * lcons_int(int datum, List *list)
int(* list_sort_comparator)(const ListCell *a, const ListCell *b)
pg_nodiscard List * list_insert_nth_int(List *list, int pos, int datum)
void list_deduplicate_oid(List *list)
int list_oid_cmp(const ListCell *p1, const ListCell *p2)
static ListCell * list_second_cell(const List *l)
List * list_make2_impl(NodeTag t, ListCell datum1, ListCell datum2)
static ListCell * lnext(const List *l, const ListCell *c)
static ForEachState for_each_from_setup(const List *lst, int N)
static ForBothCellState for_both_cell_setup(const List *list1, const ListCell *initcell1, const List *list2, const ListCell *initcell2)
pg_nodiscard List * list_delete_cell(List *list, ListCell *cell)
bool list_member_ptr(const List *list, const void *datum)
void list_free(List *list)
bool list_member_int(const List *list, int datum)
static ListCell list_make_int_cell(int v)
bool list_member_oid(const List *list, Oid datum)
int list_int_cmp(const ListCell *p1, const ListCell *p2)
static ListCell list_make_ptr_cell(void *v)
pg_nodiscard List * list_truncate(List *list, int new_size)
bool list_member(const List *list, const void *datum)
static int list_nth_int(const List *list, int n)
List * list_union_int(const List *list1, const List *list2)
List * list_make5_impl(NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3, ListCell datum4, ListCell datum5)
pg_nodiscard List * list_concat_unique_ptr(List *list1, const List *list2)
void list_free_deep(List *list)
static int list_cell_number(const List *l, const ListCell *c)
pg_nodiscard List * list_delete(List *list, void *datum)
static ListCell * list_last_cell(const List *list)
static ListCell * list_tail(const List *l)
List * list_union(const List *list1, const List *list2)
pg_nodiscard List * list_concat(List *list1, const List *list2)
static int cmp(const chr *x, const chr *y, size_t len)
ListCell initial_elements[FLEXIBLE_ARRAY_MEMBER]