ZEND_API void zend_llist_init(zend_llist *l, size_t size, llist_dtor_func_t dtor, unsigned char persistent)
{
- l->head = NULL;
- l->tail = NULL;
- l->size = size;
- l->dtor = dtor;
+ l->head = NULL;
+ l->tail = NULL;
+ l->count = 0;
+ l->size = size;
+ l->dtor = dtor;
l->persistent = persistent;
}
}
l->tail = tmp;
memcpy(tmp->data, element, l->size);
+
+ ++l->count;
}
}
l->head = tmp;
memcpy(tmp->data, element, l->size);
+
+ ++l->count;
}
if ((l)->dtor) {\
(l)->dtor((current)->data);\
pefree((current), (l)->persistent);\
- }
+ }\
+ --l->count;
ZEND_API void zend_llist_del_element(zend_llist *l, void *element, int (*compare)(void *element1, void *element2))
pefree(current, l->persistent);
current = next;
}
+
+ l->count = 0;
}
l->tail->prev->next = NULL;
}
- /* Save the data, this doesn't get free'd,
- * the pointer is just removed from the list
- */
data = old_tail->data;
l->tail = l->tail->prev;
pefree(old_tail, l->persistent);
+ --l->count;
+
return data;
}
ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func)
{
- int list_size=0, i;
+ int i;
zend_llist_element **elements;
zend_llist_element *element, **ptr;
- for (element=l->head; element; element=element->next) {
- list_size++;
- }
-
- if (list_size == 0) {
+ if (l->count <= 0) {
return;
}
- elements = (zend_llist_element **) emalloc(list_size*sizeof(zend_llist_element *));
+ elements = (zend_llist_element **) emalloc(l->count * sizeof(zend_llist_element *));
ptr = &elements[0];
*ptr++ = element;
}
- qsort(elements, list_size, sizeof(zend_llist_element *), (int (*)(const void *, const void *)) comp_func);
+ qsort(elements, l->count, sizeof(zend_llist_element *), (int (*)(const void *, const void *)) comp_func);
l->head = elements[0];
elements[0]->prev = NULL;
- for (i=1; i<list_size; i++) {
+ for (i = 1; i < l->count; i++) {
elements[i]->prev = elements[i-1];
elements[i-1]->next = elements[i];
}
ZEND_API int zend_llist_count(zend_llist *l)
{
- zend_llist_element *element;
- int element_count=0;
-
- for (element=l->head; element; element=element->next) {
- element_count++;
- }
- return element_count;
+ return l->count;
}