Browse Source

+ UA_indexedList including tests
M small fixes on UA_list

Stasik0 11 years ago
parent
commit
db33a4ea2b
6 changed files with 164 additions and 18 deletions
  1. 40 0
      include/UA_indexedList.h
  2. 5 15
      include/UA_list.h
  3. 2 1
      src/Makefile.am
  4. 115 0
      src/util/UA_indexedList.c
  5. 1 1
      src/util/UA_list.c
  6. 1 1
      tests/Makefile.am

+ 40 - 0
include/UA_indexedList.h

@@ -0,0 +1,40 @@
+#ifndef UA_INDEXEDLIST_H_
+#define UA_INDEXEDLIST_H_
+
+#include "opcua_builtInDatatypes.h"
+/* UA_indexedList reuses many types of UA_list */
+#include "UA_list.h"
+
+/*
+ * Integer Indexed List
+ */
+typedef struct T_UA_indexedList_Element {
+	struct T_UA_list_element* father;
+	Int32 index;
+	void* payload;
+}UA_indexedList_Element;
+
+typedef UA_list_List UA_indexedList_List;
+typedef UA_list_PayloadVisitor UA_indexedList_PayloadVisitor;
+
+void UA_indexedList_defaultFreer(void* payload);
+
+Int32 UA_indexedList_init(UA_indexedList_List* const list);
+
+Int32 UA_indexedList_destroy(UA_indexedList_List* const list, UA_indexedList_PayloadVisitor visitor);
+
+Int32 UA_indexedList_initElement(UA_indexedList_Element* const elem);
+
+Int32 UA_indexedList_addValue(UA_indexedList_List* const list, Int32 index, void* payload);
+
+Int32 UA_indexedList_addValueToFront(UA_indexedList_List* const list, Int32 index, void* payload);
+
+UA_indexedList_Element* UA_indexedList_find(UA_indexedList_List* const list, Int32 index);
+
+void* UA_indexedList_findValue(UA_indexedList_List* const list, Int32 index);
+
+Int32 UA_indexedList_iterateValues(UA_indexedList_List* const list, UA_indexedList_PayloadVisitor visitor);
+
+Int32 UA_indexedList_removeElement(UA_indexedList_List* const list, UA_indexedList_Element* elem, UA_indexedList_PayloadVisitor visitor);
+
+#endif /* UA_INDEXEDLIST_H_ */

+ 5 - 15
include/UA_list.h

@@ -1,24 +1,14 @@
-/*
- * UA_list.h
- *
- *  Created on: Mar 13, 2014
- *      Author: sten
- */
-
 #ifndef UA_LIST_H_
 #define UA_LIST_H_
 
 #include "opcua_builtInDatatypes.h"
 
-/*
- * Data Structures
- */
-typedef void (*UA_list_PayloadVisitor)(void* payload);
-
 /*
  * Double Linked Lists
  */
 
+typedef void (*UA_list_PayloadVisitor)(void* payload);
+
 typedef struct T_UA_list_Element {
 	struct T_UA_list_List* father;
 	void *payload;
@@ -33,11 +23,11 @@ typedef struct T_UA_list_List {
 }UA_list_List;
 
 typedef void (*UA_list_ElementVisitor)(UA_list_Element* payload);
-/*
- * Returns 1 for true, 0 otherwise
- */
+
 typedef Boolean (*UA_list_PayloadMatcher)(void* payload);
 
+void UA_list_defaultFreer(void* payload);
+
 Int32 UA_list_initElement(UA_list_Element* const element);
 
 Int32 UA_list_init(UA_list_List* const list);

+ 2 - 1
src/Makefile.am

@@ -19,7 +19,8 @@ libopen62541_la_SOURCES = opcua_builtInDatatypes.c\
 						opcua_memory.h\
 						opcua_time.h\
 						tcp_layer.h\
-						util/UA_list.c						
+						util/UA_list.c\
+						util/UA_indexedList.c						
 libopen62541_la_CFLAGS = -I $(top_builddir)/include
 
 .PHONY: convenience-link clean-convenience-link

+ 115 - 0
src/util/UA_indexedList.c

@@ -0,0 +1,115 @@
+#include "UA_config.h"
+#include "UA_indexedList.h"
+
+void UA_indexedList_defaultFreer(void* payload){
+	UA_list_defaultFreer(payload);
+}
+
+Int32 UA_indexedList_init(UA_indexedList_List* const list){
+	if(list==NULL)return UA_ERROR;
+	return UA_list_init((UA_list_List*)list);
+}
+
+Int32 UA_indexedList_destroy(UA_indexedList_List* const list, UA_indexedList_PayloadVisitor visitor){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* current = NULL;
+	current=list->first;
+	while(current){
+		UA_list_Element* next = current->next;
+		UA_indexedList_Element* elem = (UA_indexedList_Element*)current->payload;
+		if(visitor){
+			(*visitor)(elem->payload);
+		}
+		if(elem){
+			free(elem);
+		}
+		free(current);
+		current = next;
+	}
+	UA_list_init(list);
+	return UA_NO_ERROR;
+}
+
+Int32 UA_indexedList_initElement(UA_indexedList_Element* const elem){
+	if(elem==NULL)return UA_ERROR;
+	elem->father = NULL;
+	elem->index = -1;
+	elem->payload = NULL;
+	return UA_NO_ERROR;
+}
+
+Int32 UA_indexedList_addValue(UA_indexedList_List* const list, Int32 index, void* payload){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* dllElem = (UA_list_Element*)malloc(sizeof(*dllElem));
+	UA_list_initElement(dllElem);
+	UA_indexedList_Element* iilElem = (UA_indexedList_Element*)malloc(sizeof(UA_indexedList_Element));
+	UA_indexedList_initElement(iilElem);
+	iilElem->index = index;
+	iilElem->father = dllElem;
+	iilElem->payload = payload;
+	dllElem->payload = iilElem;
+	return UA_list_addElementToBack((UA_list_List*)list, dllElem);
+}
+
+Int32 UA_indexedList_addValueToFront(UA_indexedList_List* const list, Int32 index, void* payload){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* dllElem = (UA_list_Element*)malloc(sizeof(*dllElem));
+	UA_list_initElement(dllElem);
+	UA_indexedList_Element* iilElem = (UA_indexedList_Element*)malloc(sizeof(*iilElem));
+	UA_indexedList_initElement(iilElem);
+	iilElem->index = index;
+	iilElem->father = dllElem;
+	iilElem->payload = payload;
+	dllElem->payload = iilElem;
+	return UA_list_addElementToFront((UA_list_List*)list, dllElem);
+}
+
+UA_indexedList_Element* UA_indexedList_find(UA_indexedList_List* const list, Int32 index){
+	if(list==NULL)return NULL;
+	UA_list_Element* current = list->first;
+	while(current){
+		if(current->payload){
+			UA_indexedList_Element* elem = (UA_indexedList_Element*)current->payload;
+			if(elem->index == index){
+				return elem;
+			}
+		}
+		current=current->next;
+	}
+	return NULL;
+}
+
+void* UA_indexedList_findValue(UA_indexedList_List* const list, Int32 index){
+	if(list==NULL)return NULL;
+	UA_indexedList_Element* iilElem = UA_indexedList_find(list, index);
+	if(iilElem){
+		return iilElem->payload;
+	}
+	return NULL;
+}
+
+Int32 UA_indexedList_iterateValues(UA_indexedList_List* const list, UA_indexedList_PayloadVisitor visitor){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* current = list->first;
+	while(current){
+		if(current->payload){
+			UA_indexedList_Element* elem = (UA_indexedList_Element*)current->payload;
+			if(visitor){
+				(*visitor)(elem->payload);
+			}
+		}
+		current=current->next;
+	}
+	return UA_NO_ERROR;
+	return UA_NO_ERROR;
+}
+
+Int32 UA_indexedList_removeElement(UA_indexedList_List* const list, UA_indexedList_Element* elem, UA_indexedList_PayloadVisitor visitor){
+	if(list==NULL || elem==NULL)return UA_ERROR;
+	if(visitor){
+		(*visitor)(elem->payload);
+	}
+	UA_list_Element* father = elem->father;
+	free(elem);
+	return UA_list_removeElement(father, NULL);
+}

+ 1 - 1
src/util/UA_list.c

@@ -1,4 +1,3 @@
-
 #include "UA_config.h"
 #include "UA_list.h"
 
@@ -7,6 +6,7 @@ void UA_list_defaultFreer(void* payload){
 		opcua_free(payload);
 	}
 }
+
 Int32 UA_list_initElement(UA_list_Element* const element){
 	if(element==NULL)return UA_ERROR;
 	element->next=NULL;

+ 1 - 1
tests/Makefile.am

@@ -1,4 +1,4 @@
-TESTS = check_stack check_list
+TESTS = check_stack check_list check_indexedList
 
 # --- no changes beyond this line needed ---
 INCLUDE = @CHECK_CFLAGS@ -I$(top_builddir)/src -I$(top_builddir)/include