array: Add an insert/create function for value based arrays
authorMartin Willi <martin@strongswan.org>
Fri, 4 Dec 2015 08:02:28 +0000 (09:02 +0100)
committerMartin Willi <martin@strongswan.org>
Mon, 7 Dec 2015 09:05:07 +0000 (10:05 +0100)
src/libstrongswan/collections/array.c
src/libstrongswan/collections/array.h
src/libstrongswan/tests/suites/test_array.c

index 61c696b..a45a68a 100644 (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;
index 0659c70..c3be1a1 100644 (file)
@@ -139,6 +139,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.
  *
  * @param array                        array to add items to
index ba2aff4..eda72e1 100644 (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;
 }