mirror of https://github.com/citusdata/citus.git
example of foreach_(index|first) macro's
parent
19f28eabae
commit
4c15e0fbd5
|
@ -921,7 +921,6 @@ ShardListInsertCommand(List *shardIntervalList)
|
|||
"shardlength, groupid, placementid) AS (VALUES ");
|
||||
|
||||
ShardInterval *shardInterval = NULL;
|
||||
bool isFirstValue = true;
|
||||
foreach_ptr(shardInterval, shardIntervalList)
|
||||
{
|
||||
uint64 shardId = shardInterval->shardId;
|
||||
|
@ -930,7 +929,7 @@ ShardListInsertCommand(List *shardIntervalList)
|
|||
ShardPlacement *placement = NULL;
|
||||
foreach_ptr(placement, shardPlacementList)
|
||||
{
|
||||
if (!isFirstValue)
|
||||
if (!foreach_first(shardInterval) || foreach_first(placement))
|
||||
{
|
||||
/*
|
||||
* As long as this is not the first placement of the first shard,
|
||||
|
@ -938,7 +937,6 @@ ShardListInsertCommand(List *shardIntervalList)
|
|||
*/
|
||||
appendStringInfo(insertPlacementCommand, ", ");
|
||||
}
|
||||
isFirstValue = false;
|
||||
|
||||
appendStringInfo(insertPlacementCommand,
|
||||
"(%ld, %d, %ld, %d, %ld)",
|
||||
|
|
|
@ -33,6 +33,13 @@ typedef struct ListCellAndListWrapper
|
|||
ListCell *listCell;
|
||||
} ListCellAndListWrapper;
|
||||
|
||||
|
||||
typedef struct ListCellAndIndex
|
||||
{
|
||||
ListCell *listCell;
|
||||
int index;
|
||||
} ListCellAndIndex;
|
||||
|
||||
/*
|
||||
* foreach_ptr -
|
||||
* a convenience macro which loops through a pointer list without needing a
|
||||
|
@ -49,10 +56,13 @@ typedef struct ListCellAndListWrapper
|
|||
* var is NULL.
|
||||
*/
|
||||
#define foreach_ptr(var, l) \
|
||||
for (ListCell *(var ## CellDoNotUse) = list_head(l); \
|
||||
(var ## CellDoNotUse) != NULL && \
|
||||
(((var) = lfirst(var ## CellDoNotUse)) || true); \
|
||||
var ## CellDoNotUse = lnext_compat(l, var ## CellDoNotUse))
|
||||
for (ListCellAndIndex(var ## InternalDoNotUse) = { list_head(l), 0 }; \
|
||||
(var ## InternalDoNotUse).listCell != NULL && \
|
||||
(((var) = lfirst((var ## InternalDoNotUse).listCell)) || true); \
|
||||
(var ## InternalDoNotUse).listCell = lnext_compat(l, \
|
||||
(var ## InternalDoNotUse). \
|
||||
listCell), \
|
||||
(var ## InternalDoNotUse).index ++)
|
||||
|
||||
|
||||
/*
|
||||
|
@ -113,6 +123,22 @@ typedef struct ListCellAndListWrapper
|
|||
#define foreach_ptr_append(var, l) foreach_ptr(var, l)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* foreach_index
|
||||
* when in _any_ kind foreach_* block, return the index of the iterator based on the
|
||||
* name of the variable that captures the item from the list.
|
||||
*/
|
||||
#define foreach_index(var) ((var ## InternalDoNotUse).index)
|
||||
|
||||
|
||||
/*
|
||||
* foreach_first
|
||||
* convenience on top of foreach_index that checks if it is the first loop
|
||||
*/
|
||||
#define foreach_first(var) ((foreach_index(var)) == 0)
|
||||
|
||||
|
||||
/* utility functions declaration shared within this module */
|
||||
extern List * SortList(List *pointerList,
|
||||
int (*ComparisonFunction)(const void *, const void *));
|
||||
|
|
Loading…
Reference in New Issue