diff options
-rw-r--r-- | common/array.c | 21 | ||||
-rw-r--r-- | common/array.h | 2 | ||||
-rw-r--r-- | common/tests/test-array.c | 27 |
3 files changed, 43 insertions, 7 deletions
diff --git a/common/array.c b/common/array.c index f2930a9..9802100 100644 --- a/common/array.c +++ b/common/array.c @@ -81,16 +81,10 @@ p11_array_new (p11_destroyer destroyer) void p11_array_free (p11_array *array) { - unsigned int i; - if (array == NULL) return; - if (array->destroyer) { - for (i = 0; i < array->num; i++) - (array->destroyer) (array->elem[i]); - } - + p11_array_clear (array); free (array->elem); free (array); } @@ -117,3 +111,16 @@ p11_array_remove (p11_array *array, (array->num - (index + 1)) * sizeof (void*)); array->num--; } + +void +p11_array_clear (p11_array *array) +{ + int i; + + if (array->destroyer) { + for (i = 0; i < array->num; i++) + (array->destroyer) (array->elem[i]); + } + + array->num = 0; +} diff --git a/common/array.h b/common/array.h index 8964b83..94be29c 100644 --- a/common/array.h +++ b/common/array.h @@ -63,4 +63,6 @@ bool p11_array_push (p11_array *array, void p11_array_remove (p11_array *array, unsigned int index); +void p11_array_clear (p11_array *array); + #endif /* __P11_ARRAY_H__ */ diff --git a/common/tests/test-array.c b/common/tests/test-array.c index a52f3b5..a796365 100644 --- a/common/tests/test-array.c +++ b/common/tests/test-array.c @@ -167,6 +167,32 @@ test_p11_array_remove_and_count (CuTest *tc) p11_array_free (array); } +static void +test_p11_array_clear_destroys (CuTest *tc) +{ + p11_array *array; + int value = 0; + + array = p11_array_new (destroy_value); + if (!p11_array_push (array, &value)) + CuFail (tc, "should not be reached"); + + CuAssertIntEquals (tc, 1, array->num); + + p11_array_clear (array); + + CuAssertIntEquals (tc, 2, value); + CuAssertIntEquals (tc, 0, array->num); + + /* should not be destroyed again */ + value = 0; + + p11_array_free (array); + + CuAssertIntEquals (tc, 0, value); +} + + int main (void) { @@ -181,6 +207,7 @@ main (void) SUITE_ADD_TEST (suite, test_p11_array_remove_and_count); SUITE_ADD_TEST (suite, test_p11_array_free_null); SUITE_ADD_TEST (suite, test_p11_array_free_destroys); + SUITE_ADD_TEST (suite, test_p11_array_clear_destroys); CuSuiteRun (suite); CuSuiteSummary (suite, output); |