Make sure the enumerator stops after all items have been enumerated.
This also changes how insert_before behaves, before enumeration items are inserted first, after enumeration last.
This commit is contained in:
@@ -110,11 +110,20 @@ struct private_enumerator_t {
|
|||||||
* current item
|
* current item
|
||||||
*/
|
*/
|
||||||
element_t *current;
|
element_t *current;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enumerator has enumerated all items
|
||||||
|
*/
|
||||||
|
bool finished;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(enumerator_t, enumerate, bool,
|
METHOD(enumerator_t, enumerate, bool,
|
||||||
private_enumerator_t *this, void **item)
|
private_enumerator_t *this, void **item)
|
||||||
{
|
{
|
||||||
|
if (this->finished)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
if (!this->current)
|
if (!this->current)
|
||||||
{
|
{
|
||||||
this->current = this->list->first;
|
this->current = this->list->first;
|
||||||
@@ -125,6 +134,7 @@ METHOD(enumerator_t, enumerate, bool,
|
|||||||
}
|
}
|
||||||
if (!this->current)
|
if (!this->current)
|
||||||
{
|
{
|
||||||
|
this->finished = TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
*item = this->current->value;
|
*item = this->current->value;
|
||||||
@@ -151,6 +161,7 @@ METHOD(linked_list_t, reset_enumerator, void,
|
|||||||
private_linked_list_t *this, private_enumerator_t *enumerator)
|
private_linked_list_t *this, private_enumerator_t *enumerator)
|
||||||
{
|
{
|
||||||
enumerator->current = NULL;
|
enumerator->current = NULL;
|
||||||
|
enumerator->finished = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(linked_list_t, get_count, int,
|
METHOD(linked_list_t, get_count, int,
|
||||||
@@ -267,7 +278,14 @@ METHOD(linked_list_t, insert_before, void,
|
|||||||
current = enumerator->current;
|
current = enumerator->current;
|
||||||
if (!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;
|
return;
|
||||||
}
|
}
|
||||||
element = element_create(item);
|
element = element_create(item);
|
||||||
|
|||||||
@@ -95,9 +95,10 @@ struct linked_list_t {
|
|||||||
/**
|
/**
|
||||||
* Inserts a new item before the item the enumerator currently points to.
|
* 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,
|
* If this method is called before starting the enumeration the item is
|
||||||
* the item is inserted last. This is helpful when inserting items into a
|
* inserted first. If it is called after all items have been enumerated
|
||||||
* sorted list.
|
* the item is inserted last. This is helpful when inserting items into
|
||||||
|
* a sorted list.
|
||||||
*
|
*
|
||||||
* @note The position of the enumerator is not changed.
|
* @note The position of the enumerator is not changed.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user