return list;
}
-/*
- * Add a new cell to the list, in the position after 'prev_cell'. The
- * data in the cell is left undefined, and must be filled in by the
- * caller. 'list' is assumed to be non-NIL, and 'prev_cell' is assumed
- * to be non-NULL and a member of 'list'. Returns address of new cell.
- *
- * Caution: prev_cell might no longer point into the list after this!
- */
-static ListCell *
-add_new_cell_after(List *list, ListCell *prev_cell)
-{
- /* insert_new_cell will assert that this is in-range: */
- int pos = prev_cell - list->elements;
-
- return insert_new_cell(list, pos + 1);
-}
-
-/*
- * Add a new cell to the specified list (which must be non-NIL);
- * it will be placed after the list cell 'prev' (which must be
- * non-NULL and a member of 'list'). The data placed in the new cell
- * is 'datum'.
- */
-void
-lappend_cell(List *list, ListCell *prev, void *datum)
-{
- Assert(IsPointerList(list));
- lfirst(add_new_cell_after(list, prev)) = datum;
- check_list_invariants(list);
-}
-
-void
-lappend_cell_int(List *list, ListCell *prev, int datum)
-{
- Assert(IsIntegerList(list));
- lfirst_int(add_new_cell_after(list, prev)) = datum;
- check_list_invariants(list);
-}
-
-void
-lappend_cell_oid(List *list, ListCell *prev, Oid datum)
-{
- Assert(IsOidList(list));
- lfirst_oid(add_new_cell_after(list, prev)) = datum;
- check_list_invariants(list);
-}
-
/*
* Prepend a new element to the list. A pointer to the modified list
* is returned. Note that this function may or may not destructively
bool force)
{
ListCell *lc;
+ int pos;
/* Look for a clump that new_clump can join to */
foreach(lc, clumps)
if (clumps == NIL || new_clump->size == 1)
return lappend(clumps, new_clump);
- /* Check if it belongs at the front */
- lc = list_head(clumps);
- if (new_clump->size > ((Clump *) lfirst(lc))->size)
- return lcons(new_clump, clumps);
-
/* Else search for the place to insert it */
- for (;;)
+ for (pos = 0; pos < list_length(clumps); pos++)
{
- ListCell *nxt = lnext(clumps, lc);
+ Clump *old_clump = (Clump *) list_nth(clumps, pos);
- if (nxt == NULL || new_clump->size > ((Clump *) lfirst(nxt))->size)
- break; /* it belongs after 'lc', before 'nxt' */
- lc = nxt;
+ if (new_clump->size > old_clump->size)
+ break; /* new_clump belongs before old_clump */
}
- lappend_cell(clumps, lc, new_clump);
+ clumps = list_insert_nth(clumps, pos, new_clump);
return clumps;
}
extern List *list_insert_nth_int(List *list, int pos, int datum);
extern List *list_insert_nth_oid(List *list, int pos, Oid datum);
-extern void lappend_cell(List *list, ListCell *prev, void *datum);
-extern void lappend_cell_int(List *list, ListCell *prev, int datum);
-extern void lappend_cell_oid(List *list, ListCell *prev, Oid datum);
-
extern List *lcons(void *datum, List *list);
extern List *lcons_int(int datum, List *list);
extern List *lcons_oid(Oid datum, List *list);