Make sure the enumerator stops after all items have been enumerated.
authorTobias Brunner <tobias@strongswan.org>
Thu, 9 Jun 2011 07:49:28 +0000 (09:49 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 6 Jul 2011 07:43:46 +0000 (09:43 +0200)
This also changes how insert_before behaves, before enumeration items
are inserted first, after enumeration last.

src/libstrongswan/utils/linked_list.c
src/libstrongswan/utils/linked_list.h

index aaea530..e4c1a33 100644 (file)
@@ -110,11 +110,20 @@ struct private_enumerator_t {
         * current item
         */
        element_t *current;
+
+       /**
+        * enumerator has enumerated all items
+        */
+       bool finished;
 };
 
 METHOD(enumerator_t, enumerate, bool,
        private_enumerator_t *this, void **item)
 {
+       if (this->finished)
+       {
+               return FALSE;
+       }
        if (!this->current)
        {
                this->current = this->list->first;
@@ -125,6 +134,7 @@ METHOD(enumerator_t, enumerate, bool,
        }
        if (!this->current)
        {
+               this->finished = TRUE;
                return FALSE;
        }
        *item = this->current->value;
@@ -151,6 +161,7 @@ METHOD(linked_list_t, reset_enumerator, void,
        private_linked_list_t *this, private_enumerator_t *enumerator)
 {
        enumerator->current = NULL;
+       enumerator->finished = FALSE;
 }
 
 METHOD(linked_list_t, get_count, int,
@@ -267,7 +278,14 @@ METHOD(linked_list_t, insert_before, void,
        current = enumerator->current;
        if (!current)
        {
-               this->public.insert_last(&this->public, item);
+               if (enumerator->finished)
+               {
+                       this->public.insert_last(&this->public, item);
+               }
+               else
+               {
+                       this->public.insert_first(&this->public, item);
+               }
                return;
        }
        element = element_create(item);
index 47c003d..cb3d53e 100644 (file)
@@ -95,9 +95,10 @@ struct linked_list_t {
        /**
         * Inserts a new item before the item the enumerator currently points to.
         *
-        * If the enumerator's position is invalid, e.g. at the end of the list,
-        * the item is inserted last. This is helpful when inserting items into a
-        * sorted list.
+        * If this method is called before starting the enumeration the item is
+        * inserted first. If it is called after all items have been enumerated
+        * the item is inserted last. This is helpful when inserting items into
+        * a sorted list.
         *
         * @note The position of the enumerator is not changed.
         *