array: Add an insert/create function for value based arrays

This commit is contained in:
Martin Willi 2015-12-04 09:02:28 +01:00
parent f3b2d4a9d8
commit 01caed533b
3 changed files with 68 additions and 0 deletions

View File

@ -277,6 +277,16 @@ void array_insert_create(array_t **array, int idx, void *ptr)
array_insert(*array, idx, ptr);
}
void array_insert_create_value(array_t **array, u_int esize,
int idx, void *val)
{
if (*array == NULL)
{
*array = array_create(esize, 0);
}
array_insert(*array, idx, val);
}
void array_insert_enumerator(array_t *array, int idx, enumerator_t *enumerator)
{
void *ptr;

View File

@ -138,6 +138,21 @@ void array_insert(array_t *array, int idx, void *data);
*/
void array_insert_create(array_t **array, int idx, void *ptr);
/**
* Create a value based array if it does not exist, insert value.
*
* This is a convenience function to insert a value and implicitly
* create a value based array if array is NULL. Array is set the the newly
* created array, if any.
*
* @param array pointer to array reference, potentially NULL
* @param esize element size of this array
* @param idx index to insert item at
* @param val pointer to value to insert
*/
void array_insert_create_value(array_t **array, u_int esize,
int idx, void *val);
/**
* Insert all items from an enumerator to an array.
*

View File

@ -491,6 +491,44 @@ START_TEST(test_invoke_offset)
}
END_TEST
START_TEST(test_insert_create)
{
array_t *array = NULL;
uintptr_t x;
array_insert_create(&array, ARRAY_TAIL, (void*)(uintptr_t)1);
array_insert_create(&array, ARRAY_TAIL, (void*)(uintptr_t)2);
ck_assert(array != NULL);
ck_assert(array_get(array, ARRAY_HEAD, &x));
ck_assert_int_eq(x, 1);
ck_assert(array_get(array, ARRAY_TAIL, &x));
ck_assert_int_eq(x, 2);
array_destroy(array);
}
END_TEST
START_TEST(test_insert_create_value)
{
array_t *array = NULL;
u_int16_t v;
v = 1;
array_insert_create_value(&array, sizeof(v), ARRAY_TAIL, &v);
v = 2;
array_insert_create_value(&array, sizeof(v), ARRAY_TAIL, &v);
ck_assert(array != NULL);
ck_assert(array_get(array, ARRAY_HEAD, &v));
ck_assert_int_eq(v, 1);
ck_assert(array_get(array, ARRAY_TAIL, &v));
ck_assert_int_eq(v, 2);
array_destroy(array);
}
END_TEST
Suite *array_suite_create()
{
Suite *s;
@ -528,5 +566,10 @@ Suite *array_suite_create()
tcase_add_test(tc, test_invoke_offset);
suite_add_tcase(s, tc);
tc = tcase_create("insert create");
tcase_add_test(tc, test_insert_create);
tcase_add_test(tc, test_insert_create_value);
suite_add_tcase(s, tc);
return s;
}