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) {
