• Tom Lane's avatar
    Add for_each_from, to simplify loops starting from non-first list cells. · 56fe0089
    Tom Lane authored
    We have a dozen or so places that need to iterate over all but the
    first cell of a List.  Prior to v13 this was typically written as
    	for_each_cell(lc, lnext(list_head(list)))
    Commit 1cff1b95 changed these to
    	for_each_cell(lc, list, list_second_cell(list))
    This patch introduces a new macro for_each_from() which expresses
    the start point as a list index, allowing these to be written as
    	for_each_from(lc, list, 1)
    This is marginally more efficient, since ForEachState.i can be
    initialized directly instead of backing into it from a ListCell
    address.  It also seems clearer and less typo-prone.
    
    Some of the remaining uses of for_each_cell() look like they could
    profitably be changed to for_each_from(), but here I confined myself
    to changing uses of list_second_cell().
    
    Also, fix for_each_cell_setup() and for_both_cell_setup() to
    const-ify their arguments; that's a simple oversight in 1cff1b95.
    
    Back-patch into v13, on the grounds that (1) the const-ification
    is a minor bug fix, and (2) it's better for back-patching purposes
    if we only have two ways to write these loops rather than three.
    
    In HEAD, also remove list_third_cell() and list_fourth_cell(),
    which were also introduced in 1cff1b95, and are unused as of
    cc99baa4.  It seems unlikely that any third-party code would
    have started to use them already; anyone who has can be directed
    to list_nth_cell instead.
    
    Discussion: https://postgr.es/m/CAApHDvpo1zj9KhEpU2cCRZfSM3Q6XGdhzuAS2v79PH7WJBkYVA@mail.gmail.com
    56fe0089
nodeFuncs.c 110 KB