diff options
Diffstat (limited to 'Source/charon/utils')
-rw-r--r-- | Source/charon/utils/iterator.h | 15 | ||||
-rw-r--r-- | Source/charon/utils/linked_list.c | 19 |
2 files changed, 34 insertions, 0 deletions
diff --git a/Source/charon/utils/iterator.h b/Source/charon/utils/iterator.h index b27f3e788..f0e66a093 100644 --- a/Source/charon/utils/iterator.h +++ b/Source/charon/utils/iterator.h @@ -75,6 +75,21 @@ struct iterator_t { * @param[in] item value to insert in list */ void (*insert_after) (iterator_t *this, void *item); + + /** + * @brief Replace the current item at current iterator position. + * + * The iterator position is not changed after replacing. + * + * @param this calling iterator + * @param[out]old_item old value will be written here(can be NULL) + * @param[in] new_item new value + * + * @return + * - SUCCESS + * - FAILED if iterator is on an invalid position + */ + status_t (*replace) (iterator_t *this, void **old_item, void *new_item); /** * @brief removes an element from list at the given iterator position. diff --git a/Source/charon/utils/linked_list.c b/Source/charon/utils/linked_list.c index 35599b33f..a38720af9 100644 --- a/Source/charon/utils/linked_list.c +++ b/Source/charon/utils/linked_list.c @@ -293,6 +293,24 @@ static void insert_before(private_iterator_t * iterator, void *item) } /** + * Implementation of iterator_t.replace. + */ +status_t replace (private_iterator_t *this, void **old_item, void *new_item) +{ + if (this->current == NULL) + { + return NOT_FOUND; + } + if (old_item != NULL) + { + *old_item = this->current->value; + } + this->current->value = new_item; + + return SUCCESS; +} + +/** * Implementation of iterator_t.insert_after. */ static void insert_after(private_iterator_t * iterator, void *item) @@ -490,6 +508,7 @@ static iterator_t *create_iterator (private_linked_list_t *linked_list,bool forw this->public.current = (status_t (*) (iterator_t *this, void **value)) iterator_current; this->public.insert_before = (void (*) (iterator_t *this, void *item)) insert_before; this->public.insert_after = (void (*) (iterator_t *this, void *item)) insert_after; + this->public.replace = (status_t (*) (iterator_t *, void **, void *)) replace; this->public.remove = (status_t (*) (iterator_t *this)) remove; this->public.reset = (void (*) (iterator_t *this)) iterator_reset; this->public.destroy = (void (*) (iterator_t *this)) iterator_destroy; |