Przeglądaj źródła

lib_sllist foreach

isundil 9 lat temu
rodzic
commit
e4283d829d
3 zmienionych plików z 44 dodań i 0 usunięć
  1. 9 0
      lib/sllist/include/sllist.h
  2. 19 0
      lib/sllist/src/find.c
  3. 16 0
      test/sllist/main.c

+ 9 - 0
lib/sllist/include/sllist.h

@@ -62,4 +62,13 @@ sl_list *sllist_clear(sl_list *list);
 **/
 int sllist_find(sl_list *list, int(*fnc)(const void *cmp, const void *param), const void *param);
 
+/**
+ * Execute function foreach values of list
+ * Param 2 is custom_data
+ * A -1 return value will act as a `break` instruction
+ * return the number of iterated objects
+**/
+int sllist_foreach(sl_list *list, int(*fnc)(void **item, void *custom), void *custom);
+
 #endif /* SL_LIST_H__ */
+

+ 19 - 0
lib/sllist/src/find.c

@@ -1,3 +1,4 @@
+#include <unistd.h>
 #include "sllist.h"
 
 int sllist_find(sl_list *list, int(*cmpfnc)(const void *, const void*), const void *param)
@@ -16,3 +17,21 @@ int sllist_find(sl_list *list, int(*cmpfnc)(const void *, const void*), const vo
 	return -1;
 }
 
+int sllist_foreach(sl_list *list, int (*execfnc)(void **, void*), void *param)
+{
+	struct sl_list_item *item = list->first;
+	size_t i, j, count;
+
+	count = sllist_count(list);
+	for (i =0; i < count; i += SL_LIST_BUFLEN)
+	{
+		for (j =0; j < SL_LIST_BUFLEN && (j + i) < count; ++j)
+		{
+			if (execfnc(&(item->data[j]), param) == -1)
+				return (i + j);
+		}
+		item = item->next;
+	}
+	return i + j;
+}
+

+ 16 - 0
test/sllist/main.c

@@ -16,6 +16,14 @@ int cmp_int(const void *a, const void *b)
 	return a == b;
 }
 
+static inline int add1_fnc(void **_i, void *nullable)
+{
+	(void) nullable;
+	int * i = (int *)_i;
+	(*i)++;
+	return 1;
+}
+
 static inline int test_add()
 {
 	unsigned long long i;
@@ -45,6 +53,14 @@ static inline int test_add()
 	_assertEqual(sllist_find(a, cmp_int, (void *)2), 1);
 	_assertEqual(sllist_find(a, cmp_int, (void *)2046), 1023);
 	_assertEqual(sllist_find(a, cmp_int, (void *)2048), -1);
+	sllist_foreach(a, add1_fnc, NULL);
+	_assertEqual(sllist_count(a), 1024);
+	_assertEqual(sllist_at(a, 0), 1);
+	_assertEqual(sllist_at(a, 1023), 2047);
+	_assertEqual(sllist_at(a, 1024), 0);
+	_assertEqual(sllist_find(a, cmp_int, (void *)1), 0);
+	_assertEqual(sllist_find(a, cmp_int, (void *)3), 1);
+	_assertEqual(sllist_find(a, cmp_int, (void *)2047), 1023);
 	while (sllist_count(a))
 		sllist_popback(a);
 	for (i=0; i < 1024; ++i)