linked-list: Add method to compare two lists of objects for equality

This commit is contained in:
Tobias Brunner
2016-03-08 10:21:57 +01:00
parent 229cdf6bc8
commit 348b0ffbc6
3 changed files with 166 additions and 2 deletions
+53 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2007-2011 Tobias Brunner
* Copyright (C) 2007-2015 Tobias Brunner
* Copyright (C) 2005-2006 Martin Willi
* Copyright (C) 2005 Jan Hutter
* Hochschule fuer Technik Rapperswil
@@ -433,6 +433,56 @@ METHOD(linked_list_t, clone_offset, linked_list_t*,
return clone;
}
METHOD(linked_list_t, equals_offset, bool,
private_linked_list_t *this, linked_list_t *other_pub, size_t offset)
{
private_linked_list_t *other = (private_linked_list_t*)other_pub;
element_t *cur_t, *cur_o;
if (this->count != other->count)
{
return FALSE;
}
cur_t = this->first;
cur_o = other->first;
while (cur_t && cur_o)
{
bool (**method)(void*,void*) = cur_t->value + offset;
if (!(*method)(cur_t->value, cur_o->value))
{
return FALSE;
}
cur_t = cur_t->next;
cur_o = cur_o->next;
}
return TRUE;
}
METHOD(linked_list_t, equals_function, bool,
private_linked_list_t *this, linked_list_t *other_pub,
bool (*fn)(void*,void*))
{
private_linked_list_t *other = (private_linked_list_t*)other_pub;
element_t *cur_t, *cur_o;
if (this->count != other->count)
{
return FALSE;
}
cur_t = this->first;
cur_o = other->first;
while (cur_t && cur_o)
{
if (!fn(cur_t->value, cur_o->value))
{
return FALSE;
}
cur_t = cur_t->next;
cur_o = cur_o->next;
}
return TRUE;
}
METHOD(linked_list_t, destroy, void,
private_linked_list_t *this)
{
@@ -503,6 +553,8 @@ linked_list_t *linked_list_create()
.invoke_offset = (void*)_invoke_offset,
.invoke_function = (void*)_invoke_function,
.clone_offset = _clone_offset,
.equals_offset = _equals_offset,
.equals_function = _equals_function,
.destroy = _destroy,
.destroy_offset = _destroy_offset,
.destroy_function = _destroy_function,
+22 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2007-2011 Tobias Brunner
* Copyright (C) 2007-2015 Tobias Brunner
* Copyright (C) 2005-2008 Martin Willi
* Copyright (C) 2005 Jan Hutter
* Hochschule fuer Technik Rapperswil
@@ -217,6 +217,27 @@ struct linked_list_t {
*/
linked_list_t *(*clone_offset) (linked_list_t *this, size_t offset);
/**
* Compare two lists and their objects for equality using the given equals
* method.
*
* @param other list to compare
* @param offset offset of the objects equals method
* @return TRUE if lists and objects are equal, FALSE otherwise
*/
bool (*equals_offset) (linked_list_t *this, linked_list_t *other,
size_t offset);
/**
* Compare two lists and their objects for equality using the given function.
*
* @param other list to compare
* @param function function to compare the objects
* @return TRUE if lists and objects are equal, FALSE otherwise
*/
bool (*equals_function) (linked_list_t *this, linked_list_t *other,
bool (*)(void*,void*));
/**
* Destroys a linked_list object.
*/