aboutsummaryrefslogtreecommitdiffstats
path: root/Source/charon/utils/linked_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'Source/charon/utils/linked_list.c')
-rw-r--r--Source/charon/utils/linked_list.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/Source/charon/utils/linked_list.c b/Source/charon/utils/linked_list.c
index 69e0ffc12..f3e686a5a 100644
--- a/Source/charon/utils/linked_list.c
+++ b/Source/charon/utils/linked_list.c
@@ -360,6 +360,23 @@ static int get_count(private_linked_list_t *this)
return this->count;
}
+/**
+ * Implementation of linked_list_t.call_on_items.
+ */
+static void call_on_items(private_linked_list_t *this, void(*func)(void*))
+{
+ iterator_t *iterator;
+ void *item;
+
+ iterator = this->public.create_iterator(&(this->public),TRUE);
+
+ while (iterator->has_next(iterator))
+ {
+ iterator->current(iterator, &item);
+ (*func)(item);
+ }
+ iterator->destroy(iterator);
+}
/**
* Implementation of linked_list_t.insert_first.
@@ -408,7 +425,10 @@ static status_t remove_first(private_linked_list_t *this, void **item)
}
this->first = element->next;
- *item = element->value;
+ if (item != NULL)
+ {
+ *item = element->value;
+ }
this->count--;
@@ -478,7 +498,10 @@ static status_t remove_last(private_linked_list_t *this, void **item)
}
this->last = element->previous;
- *item = element->value;
+ if (item != NULL)
+ {
+ *item = element->value;
+ }
this->count--;
@@ -649,6 +672,7 @@ linked_list_t *linked_list_create()
this->public.get_count = (int (*) (linked_list_t *)) get_count;
this->public.create_iterator = (iterator_t * (*) (linked_list_t *,bool )) create_iterator;
+ this->public.call_on_items = (void (*) (linked_list_t *, void(*func)(void*)))call_on_items;
this->public.get_first = (status_t (*) (linked_list_t *, void **item)) get_first;
this->public.get_last = (status_t (*) (linked_list_t *, void **item)) get_last;
this->public.insert_first = (void (*) (linked_list_t *, void *item)) insert_first;