43 #define DEBUG_LIST_MEMORY_USAGE
47 #define LIST_HEADER_OVERHEAD \
48 ((int) ((offsetof(List, initial_elements) - 1) / sizeof(ListCell) + 1))
54 #define IsPointerList(l) ((l) == NIL || IsA((l), List))
55 #define IsIntegerList(l) ((l) == NIL || IsA((l), IntList))
56 #define IsOidList(l) ((l) == NIL || IsA((l), OidList))
58 #ifdef USE_ASSERT_CHECKING
77 #define check_list_invariants(l) ((void) 0)
105 #ifndef DEBUG_LIST_MEMORY_USAGE
137 newlist->
length = min_size;
158 #ifndef DEBUG_LIST_MEMORY_USAGE
170 new_max_len = min_size;
173 if (
list->elements ==
list->initial_elements)
185 memcpy(
list->elements,
list->initial_elements,
194 #ifdef CLOBBER_FREED_MEMORY
195 wipe_mem(
list->initial_elements,
204 #ifndef DEBUG_LIST_MEMORY_USAGE
218 memcpy(newelements,
list->elements,
221 list->elements = newelements;
225 list->max_length = new_max_len;
237 list->elements[0] = datum1;
247 list->elements[0] = datum1;
248 list->elements[1] = datum2;
259 list->elements[0] = datum1;
260 list->elements[1] = datum2;
261 list->elements[2] = datum3;
272 list->elements[0] = datum1;
273 list->elements[1] = datum2;
274 list->elements[2] = datum3;
275 list->elements[3] = datum4;
286 list->elements[0] = datum1;
287 list->elements[1] = datum2;
288 list->elements[2] = datum3;
289 list->elements[3] = datum4;
290 list->elements[4] = datum5;
305 if (
list->length >=
list->max_length)
308 memmove(&
list->elements[1], &
list->elements[0],
323 if (
list->length >=
list->max_length)
396 Assert(pos >= 0 && pos <= list->length);
399 if (
list->length >=
list->max_length)
402 if (pos < list->length)
403 memmove(&
list->elements[pos + 1], &
list->elements[pos],
407 return &
list->elements[pos];
617 list->length = new_size;
670 if (
lfirst(cell) == datum)
730 Assert(n >= 0 && n < list->length);
737 if (
list->length == 1)
749 #ifndef DEBUG_LIST_MEMORY_USAGE
750 memmove(&
list->elements[n], &
list->elements[n + 1],
756 int newmaxlen =
list->length - 1;
762 memcpy(&newelems[n], &
list->elements[n + 1],
764 if (
list->elements !=
list->initial_elements)
772 #ifdef CLOBBER_FREED_MEMORY
773 wipe_mem(
list->initial_elements,
780 list->elements = newelems;
781 list->max_length = newmaxlen;
840 if (
lfirst(cell) == datum)
963 #ifndef DEBUG_LIST_MEMORY_USAGE
964 memmove(&
list->elements[0], &
list->elements[n],
970 int newmaxlen =
list->length - n;
975 memcpy(newelems, &
list->elements[n], newmaxlen *
sizeof(
ListCell));
976 if (
list->elements !=
list->initial_elements)
984 #ifdef CLOBBER_FREED_MEMORY
985 wipe_mem(
list->initial_elements,
992 list->elements = newelems;
993 list->max_length = newmaxlen;
994 list->length = newmaxlen;
1034 foreach(cell, list2)
1058 foreach(cell, list2)
1081 foreach(cell, list2)
1104 foreach(cell, list2)
1138 if (list1 ==
NIL || list2 ==
NIL)
1145 foreach(cell, list1)
1164 if (list1 ==
NIL || list2 ==
NIL)
1171 foreach(cell, list1)
1207 foreach(cell, list1)
1233 foreach(cell, list1)
1258 foreach(cell, list1)
1283 foreach(cell, list1)
1371 foreach(cell, list2)
1393 foreach(cell, list2)
1414 foreach(cell, list2)
1435 foreach(cell, list2)
1465 for (
int j = 1;
j <
len;
j++)
1467 if (elements[
i].oid_value != elements[
j].oid_value)
1470 list->length =
i + 1;
1488 for (
int i = 0;
i <
list->length;
i++)
1491 if (
list->elements !=
list->initial_elements)
1558 if (oldlist ==
NIL || nskip >= oldlist->
length)
1588 for (
int i = 0;
i < newlist->
length;
i++)
1614 typedef int (*qsort_comparator) (
const void *
a,
const void *
b);
#define offsetof(type, field)
void * copyObjectImpl(const void *from)
static void PGresult const char * p2
bool equal(const void *a, const void *b)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * list_delete_int(List *list, int datum)
List * list_make5_impl(NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3, ListCell datum4, ListCell datum5)
static void new_head_cell(List *list)
static ListCell * insert_new_cell(List *list, int pos)
void list_sort(List *list, list_sort_comparator cmp)
List * list_copy_deep(const List *oldlist)
List * list_delete_ptr(List *list, void *datum)
static List * new_list(NodeTag type, int min_size)
List * list_insert_nth(List *list, int pos, void *datum)
List * list_concat_unique(List *list1, const List *list2)
List * list_difference_ptr(const List *list1, const List *list2)
List * list_make2_impl(NodeTag t, ListCell datum1, ListCell datum2)
List * list_delete_first_n(List *list, int n)
List * list_union(const List *list1, const List *list2)
static void enlarge_list(List *list, int min_size)
#define LIST_HEADER_OVERHEAD
List * list_append_unique_int(List *list, int datum)
List * list_make1_impl(NodeTag t, ListCell datum1)
List * list_concat_unique_int(List *list1, const List *list2)
List * lcons_int(int datum, List *list)
List * list_difference_oid(const List *list1, const List *list2)
List * list_concat_unique_oid(List *list1, const List *list2)
List * list_truncate(List *list, int new_size)
List * lappend(List *list, void *datum)
static void list_free_private(List *list, bool deep)
List * list_intersection_int(const List *list1, const List *list2)
List * list_difference_int(const List *list1, const List *list2)
List * lappend_int(List *list, int datum)
List * list_insert_nth_int(List *list, int pos, int datum)
List * lappend_oid(List *list, Oid datum)
List * list_intersection(const List *list1, const List *list2)
List * list_copy(const List *oldlist)
#define check_list_invariants(l)
List * list_delete_first(List *list)
void list_deduplicate_oid(List *list)
static void new_tail_cell(List *list)
List * list_delete_oid(List *list, Oid datum)
int list_oid_cmp(const ListCell *p1, const ListCell *p2)
List * list_append_unique(List *list, void *datum)
List * list_delete_cell(List *list, ListCell *cell)
List * list_delete(List *list, void *datum)
List * list_union_oid(const List *list1, const List *list2)
List * list_delete_nth_cell(List *list, int n)
bool list_member_ptr(const List *list, const void *datum)
List * list_concat_unique_ptr(List *list1, const List *list2)
void list_free(List *list)
bool list_member_int(const List *list, int datum)
bool list_member_oid(const List *list, Oid datum)
List * list_make3_impl(NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3)
List * list_make4_impl(NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3, ListCell datum4)
List * list_copy_tail(const List *oldlist, int nskip)
int list_int_cmp(const ListCell *p1, const ListCell *p2)
List * list_concat(List *list1, const List *list2)
bool list_member(const List *list, const void *datum)
List * lcons(void *datum, List *list)
List * list_union_ptr(const List *list1, const List *list2)
List * lcons_oid(Oid datum, List *list)
List * list_append_unique_ptr(List *list, void *datum)
List * list_difference(const List *list1, const List *list2)
List * list_concat_copy(const List *list1, const List *list2)
List * list_append_unique_oid(List *list, Oid datum)
void list_free_deep(List *list)
List * list_delete_last(List *list)
List * list_union_int(const List *list1, const List *list2)
List * list_insert_nth_oid(List *list, int pos, Oid datum)
void pfree(void *pointer)
void * repalloc(void *pointer, Size size)
void * MemoryContextAlloc(MemoryContext context, Size size)
#define VALGRIND_MAKE_MEM_NOACCESS(addr, size)
static MemoryContext GetMemoryChunkContext(void *pointer)
#define IsA(nodeptr, _type_)
static uint32 pg_nextpower2_32(uint32 num)
static int list_length(const List *l)
#define list_make1_oid(x1)
int(* list_sort_comparator)(const ListCell *a, const ListCell *b)
#define list_make1_int(x1)
#define qsort(a, b, c, d)
static int cmp(const chr *x, const chr *y, size_t len)
ListCell initial_elements[FLEXIBLE_ARRAY_MEMBER]