This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/674-improve-properties
in repository https://gitbox.apache.org/repos/asf/celix.git

commit c4a601f3d2a48618d4b228a99b75737ac30a1e14
Author: Pepijn Noltes <[email protected]>
AuthorDate: Sun Jan 7 17:25:17 2024 +0100

    Add get/setString support for array list
---
 libs/utils/gtest/src/ArrayListTestSuite.cc | 17 ++++++++++++++++-
 libs/utils/include/celix_array_list.h      | 30 ++++++++++++++++++++++++++++++
 libs/utils/src/array_list.c                | 15 +++++++++++++++
 3 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/libs/utils/gtest/src/ArrayListTestSuite.cc 
b/libs/utils/gtest/src/ArrayListTestSuite.cc
index f4d7dbba..8abd79fa 100644
--- a/libs/utils/gtest/src/ArrayListTestSuite.cc
+++ b/libs/utils/gtest/src/ArrayListTestSuite.cc
@@ -85,6 +85,11 @@ TEST_F(ArrayListTestSuite, TestArrayListWithEquals) {
 
 template<typename T>
 void testArrayListForTemplateType(int nrEntries) {
+    std::vector<std::string> strStorage;
+    for (int i = 0; i < nrEntries; ++i) {
+        strStorage.push_back(std::string{"test-"} + std::to_string(i));
+    }
+
     auto* list = celix_arrayList_create();
     //fill
     for (int i = 0; i < nrEntries; ++i) {
@@ -106,6 +111,8 @@ void testArrayListForTemplateType(int nrEntries) {
             celix_arrayList_addBool(list, i % 2 == 0);
         } else if constexpr (std::is_same_v<size_t, T>) {
             celix_arrayList_addSize(list, i);
+        } else if constexpr (std::is_same_v<const char*, T>) {
+            celix_arrayList_addString(list, strStorage[i].c_str());
         }
     }
     EXPECT_EQ(celix_arrayList_size(list), nrEntries);
@@ -130,6 +137,8 @@ void testArrayListForTemplateType(int nrEntries) {
             EXPECT_EQ(celix_arrayList_getBool(list, i), i % 2 == 0);
         } else if constexpr (std::is_same_v<size_t, T>) {
             EXPECT_EQ(celix_arrayList_getSize(list, i), i);
+        } else if constexpr (std::is_same_v<const char*, T>) {
+            EXPECT_STREQ(celix_arrayList_getString(list, i), 
strStorage[i].c_str());
         }
     }
 
@@ -153,6 +162,8 @@ void testArrayListForTemplateType(int nrEntries) {
             celix_arrayList_removeBool(list, i % 2 == 0);
         } else if constexpr (std::is_same_v<size_t, T>) {
             celix_arrayList_removeSize(list, i);
+        } else if constexpr (std::is_same_v<const char*, T>) {
+            celix_arrayList_removeString(list, strStorage[i].c_str());
         }
     }
     EXPECT_EQ(celix_arrayList_size(list), 0);
@@ -216,6 +227,7 @@ TEST_F(ArrayListTestSuite, 
TestDifferentEntyTypesForArrayList) {
     testArrayListForTemplateType<double>(10);
     testArrayListForTemplateType<bool>(10);
     testArrayListForTemplateType<size_t>(10);
+    testArrayListForTemplateType<const char*>(10);
 }
 
 TEST_F(ArrayListTestSuite, TestSimpleRemovedCallbacksForArrayList) {
@@ -299,9 +311,12 @@ TEST_F(ArrayListTestSuite, TestReturnStatusAddFunctions) {
     EXPECT_EQ(CELIX_SUCCESS, celix_arrayList_addBool(list, true));
     EXPECT_EQ(5, celix_arrayList_size(list));
 
-    EXPECT_EQ(CELIX_SUCCESS, celix_arrayList_add(list, (void*)0x42));
+    EXPECT_EQ(CELIX_SUCCESS, celix_arrayList_addString(list, "test"));
     EXPECT_EQ(6, celix_arrayList_size(list));
 
+    EXPECT_EQ(CELIX_SUCCESS, celix_arrayList_add(list, (void*)0x42));
+    EXPECT_EQ(7, celix_arrayList_size(list));
+
     celix_arrayList_destroy(list);
 }
 
diff --git a/libs/utils/include/celix_array_list.h 
b/libs/utils/include/celix_array_list.h
index b494c476..77ae1a1e 100644
--- a/libs/utils/include/celix_array_list.h
+++ b/libs/utils/include/celix_array_list.h
@@ -42,6 +42,7 @@ extern "C" {
 
 typedef union celix_array_list_entry {
     void *voidPtrVal;
+    const char* strVal;
     int intVal;
     long int longVal;
     unsigned int uintVal;
@@ -278,6 +279,16 @@ bool celix_arrayList_getBool(const celix_array_list_t 
*list, int index);
 CELIX_UTILS_EXPORT
 size_t celix_arrayList_getSize(const celix_array_list_t *list, int index);
 
+/**
+ * @brief Returns the value for the provided index.
+ *
+ * @param list The array list.
+ * @param index The entry index to return.
+ * @return Returns the string (const char*) value for the index. Returns NULL 
if index is out of bound.
+ */
+CELIX_UTILS_EXPORT
+const char* celix_arrayList_getString(const celix_array_list_t *list, int 
index);
+
 /**
  * @brief Returns the entry for the provided index.
  * 
@@ -377,6 +388,16 @@ celix_status_t celix_arrayList_addBool(celix_array_list_t 
*list, bool value);
 CELIX_UTILS_EXPORT
 celix_status_t celix_arrayList_addSize(celix_array_list_t *list, size_t value);
 
+/**
+ * @brief add string pointer entry to the back of the array list.
+ * @note The string will *not* be copied.
+ *
+ * @param list The array list.
+ * @param value The string value to add to the array list.
+ * @return CELIX_SUCCESS if the value is added, CELIX_ENOMEM if the array list 
is out of memory.
+ */
+CELIX_UTILS_EXPORT celix_status_t celix_arrayList_addString(celix_array_list_t 
*list, const char* value);
+
 /**
  * @brief Returns the index of the provided entry, if found.
  *
@@ -501,6 +522,15 @@ void celix_arrayList_removeBool(celix_array_list_t *list, 
bool value);
 CELIX_UTILS_EXPORT
 void celix_arrayList_removeSize(celix_array_list_t *list, size_t value);
 
+/**
+ * @brief Remove the first size entry from array list which matches the 
provided value.
+ *
+ * The equals callback provided when the array list was created will be used 
to find the entry.
+ * If there was no equals callback provided a direct memory compare will be 
done.
+ */
+CELIX_UTILS_EXPORT
+void celix_arrayList_removeString(celix_array_list_t *list, const char* value);
+
 /**
  * @brief Sort the array list using the provided sort function.
  */
diff --git a/libs/utils/src/array_list.c b/libs/utils/src/array_list.c
index a7e2dd9f..3d493e36 100644
--- a/libs/utils/src/array_list.c
+++ b/libs/utils/src/array_list.c
@@ -165,6 +165,7 @@ float celix_arrayList_getFloat(const celix_array_list_t 
*list, int index) { retu
 double celix_arrayList_getDouble(const celix_array_list_t *list, int index) { 
return arrayList_getEntry(list, index).doubleVal; }
 bool celix_arrayList_getBool(const celix_array_list_t *list, int index) { 
return arrayList_getEntry(list, index).boolVal; }
 size_t celix_arrayList_getSize(const celix_array_list_t *list, int index) { 
return arrayList_getEntry(list, index).sizeVal; }
+const char* celix_arrayList_getString(const celix_array_list_t *list, int 
index) { return arrayList_getEntry(list, index).strVal; }
 celix_array_list_entry_t celix_arrayList_getEntry(const celix_array_list_t 
*list, int index) { return arrayList_getEntry(list, index); }
 
 static celix_status_t celix_arrayList_addEntry(celix_array_list_t *list, 
celix_array_list_entry_t entry) {
@@ -238,6 +239,13 @@ celix_status_t celix_arrayList_addSize(celix_array_list_t 
*list, size_t val) {
     return celix_arrayList_addEntry(list, entry);
 }
 
+celix_status_t celix_arrayList_addString(celix_array_list_t *list, const char* 
value) {
+    celix_array_list_entry_t entry;
+    memset(&entry, 0, sizeof(entry));
+    entry.strVal = value;
+    return celix_arrayList_addEntry(list, entry);
+}
+
 int celix_arrayList_indexOf(celix_array_list_t *list, celix_array_list_entry_t 
entry) {
     size_t size = celix_arrayList_size(list);
     int i;
@@ -330,6 +338,13 @@ void celix_arrayList_removeSize(celix_array_list_t *list, 
size_t val) {
     celix_arrayList_removeEntry(list, entry);
 }
 
+void celix_arrayList_removeString(celix_array_list_t *list, const char* value) 
{
+    celix_array_list_entry_t entry;
+    memset(&entry, 0, sizeof(entry));
+    entry.strVal = value;
+    celix_arrayList_removeEntry(list, entry);
+}
+
 void celix_arrayList_clear(celix_array_list_t *list) {
     list->modCount++;
     for (int i = 0; i < list->size; ++i) {

Reply via email to