Leon Urbas 11 роки тому
батько
коміт
f0aefdc7cc
3 змінених файлів з 94 додано та 1 видалено
  1. 3 0
      include/UA_list.h
  2. 15 0
      src/util/UA_list.c
  3. 76 1
      tests/check_list.c

+ 3 - 0
include/UA_list.h

@@ -26,6 +26,7 @@ typedef void (*UA_list_ElementVisitor)(UA_list_Element* payload);
 
 //typedef Boolean (*UA_list_PayloadMatcher)(void* payload);
 typedef _Bool (*UA_list_PayloadMatcher)(void* payload);
+typedef _Bool (*UA_list_PayloadComparer)(void* payload, void* otherPayload);
 
 void UA_list_defaultFreer(void* payload);
 
@@ -55,6 +56,8 @@ UA_Int32 UA_list_iteratePayload(UA_list_List* const list, UA_list_PayloadVisitor
 
 UA_list_Element* UA_list_find(UA_list_List* const list, UA_list_PayloadMatcher matcher);
 
+UA_list_Element* UA_list_search(UA_list_List* const list, UA_list_PayloadComparer compare, void* payload);
+
 UA_list_Element* UA_list_getFirst(UA_list_List* const list);
 
 UA_list_Element* UA_list_getLast(UA_list_List* const list);

+ 15 - 0
src/util/UA_list.c

@@ -205,6 +205,21 @@ UA_list_Element* UA_list_find(UA_list_List* const list, UA_list_PayloadMatcher m
 	return UA_NULL;
 }
 
+UA_list_Element* UA_list_search(UA_list_List* const list, UA_list_PayloadComparer compare, void* payload){
+	if(list==UA_NULL)return UA_NULL;
+	if(compare){
+		UA_list_Element* current = list->first;
+		while(current){
+			if(compare && (*compare)(current->payload, payload)==TRUE){
+				return current;
+			}
+			current=current->next;
+		}
+	}
+	/* nothing found */
+	return UA_NULL;
+}
+
 UA_list_Element* UA_list_getFirst(UA_list_List* const list){
 	if(list==UA_NULL)return UA_NULL;
 	return list->first;

+ 76 - 1
tests/check_list.c

@@ -18,7 +18,7 @@ void freer(void* payload){
 }
 
 _Bool matcher(void* payload){
-	if(payload == NULL){
+	if(payload == UA_NULL){
 		return FALSE;
 	}
 	if(*((UA_Int32*)payload) == 42){
@@ -27,6 +27,14 @@ _Bool matcher(void* payload){
 	return FALSE;
 }
 
+_Bool comparer(void* payload, void* otherPayload) {
+	if(payload == UA_NULL || otherPayload == UA_NULL){
+		return UA_FALSE;
+	} else {
+		return ( *((UA_Int32*)payload) == *((UA_Int32*)otherPayload) );
+	}
+}
+
 START_TEST(list_test_basic)
 {
 
@@ -72,11 +80,78 @@ START_TEST(list_test_basic)
 }
 END_TEST
 
+void myAddPayloadValueToFront(UA_list_List *list, UA_Int32 payloadValue) {
+	UA_Int32* payload;
+	UA_alloc((void**)&payload, sizeof(*payload));
+	*payload = payloadValue;
+	UA_list_addPayloadToFront(list, payload);
+}
+void myAddPayloadVectorToFront(UA_list_List *list, UA_Int32 payloadValues[], UA_Int32 n) {
+	UA_Int32 i = 0;
+	for (;i<n;i++) {
+		myAddPayloadValueToFront(list,payloadValues[i]);
+	}
+}
+
+
+START_TEST(addElementsShallResultInRespectiveSize)
+{
+	// given
+	UA_list_List list;
+	UA_list_init(&list);
+	// when
+	UA_Int32 plv[] = {42,24,1};
+	myAddPayloadVectorToFront(&list,plv,sizeof(plv)/sizeof(UA_Int32));
+	// then
+	ck_assert_int_eq(list.size, 3);
+	// finally
+	UA_list_destroy(&list, freer);
+}
+END_TEST
+
+START_TEST(findElementShallFind42)
+{
+	// given
+	UA_list_List list;
+	UA_list_init(&list);
+	UA_Int32 plv[] = {42,24,1};
+	myAddPayloadVectorToFront(&list,plv,sizeof(plv)/sizeof(UA_Int32));
+	// when
+	UA_list_Element* e = UA_list_find(&list,matcher);
+	// then
+	ck_assert_ptr_ne(e, UA_NULL);
+	ck_assert_int_eq(*(UA_Int32*)(e->payload), 42);
+	// finally
+	UA_list_destroy(&list, freer);
+}
+END_TEST
+
+START_TEST(searchElementShallFind24)
+{
+	// given
+	UA_list_List list;
+	UA_list_init(&list);
+	UA_Int32 plv[] = {42,24,1};
+	myAddPayloadVectorToFront(&list,plv,sizeof(plv)/sizeof(UA_Int32));
+	UA_Int32 payload = 24;
+	// when
+	UA_list_Element* e = UA_list_search(&list,comparer,(void*)&payload);
+	// then
+	ck_assert_ptr_ne(e, UA_NULL);
+	ck_assert_int_eq(*(UA_Int32*)(e->payload), 24);
+	// finally
+	UA_list_destroy(&list, freer);
+}
+END_TEST
+
 Suite*list_testSuite(void)
 {
 	Suite *s = suite_create("list_test");
 	TCase *tc_core = tcase_create("Core");
 	tcase_add_test(tc_core, list_test_basic);
+	tcase_add_test(tc_core, addElementsShallResultInRespectiveSize);
+	tcase_add_test(tc_core, findElementShallFind42);
+	tcase_add_test(tc_core, searchElementShallFind24);
 	suite_add_tcase(s,tc_core);
 	return s;
 }