You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2024/01/07 19:43:17 UTC
(celix) 06/08: Add get/setString support for array list
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 <pn...@apache.org>
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) {