Added iterators.
authorSebastian Hack <hack@ipd.info.uni-karlsruhe.de>
Mon, 29 Nov 2004 13:33:44 +0000 (13:33 +0000)
committerSebastian Hack <hack@ipd.info.uni-karlsruhe.de>
Mon, 29 Nov 2004 13:33:44 +0000 (13:33 +0000)
[r4495]

ir/adt/iterator.c [new file with mode: 0644]
ir/adt/iterator.h [new file with mode: 0644]

diff --git a/ir/adt/iterator.c b/ir/adt/iterator.c
new file mode 100644 (file)
index 0000000..7136c61
--- /dev/null
@@ -0,0 +1,63 @@
+
+#include <string.h>
+
+#include "pset.h"
+#include "list.h"
+#include "iterator.h"
+
+#define ITERATOR_MAGIC "ITR"
+
+int is_iterator(const void *ptr)
+{
+       const iterator_t *it = ptr;
+       return strncmp(it->magic, ITERATOR_MAGIC, sizeof(ITERATOR_MAGIC)) == 0;
+}
+
+static void *it_pset_start(void *collection)
+{
+       return pset_first(collection);
+}
+
+static void *it_pset_next(void *collection, void *curr)
+{
+       return pset_next(collection);
+}
+
+static void it_pset_finish(void *collection, void *curr)
+{
+}
+
+static const iterator_t iterator_pset = {
+       ITERATOR_MAGIC,
+       it_pset_start,
+       it_pset_next,
+       it_pset_finish
+};
+
+const iterator_t *it_pset = &iterator_pset;
+
+
+static void *it_list_next(void *coll, void *it)
+{
+       struct list_head *head = coll;
+       struct list_head *curr = it;
+       return curr->next != head ? curr->next : NULL;
+}
+
+static void *it_list_start(void *coll)
+{
+       return it_list_next(coll, coll);
+}
+
+static void it_list_finish(void *coll, void *curr)
+{
+}
+
+static const iterator_t iterator_list = {
+       ITERATOR_MAGIC,
+       it_list_start,
+       it_list_next,
+       it_list_finish
+};
+
+const iterator_t *it_list = &iterator_list;
diff --git a/ir/adt/iterator.h b/ir/adt/iterator.h
new file mode 100644 (file)
index 0000000..1e98446
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * Iterators for the several collection types used in firm.
+ * Useful for formatted and unified dumping of collections of objects.
+ * @author Sebastian Hack
+ * @date 29.11.2004
+ */
+
+/**
+ * Check, if some memory object appears to be an iterator.
+ * @param ptr SOme memory.
+ * @return 1, if that memory area appears to be an iterator, 0 if not.
+ */
+int is_iterator(const void *ptr);
+
+typedef struct _iterator_t {
+       char magic[4];
+       void *(*start)(void *collection);
+       void *(*next)(void *collection, void *curr);
+       void (*finish)(void *collection, void *curr);
+} iterator_t;
+
+/**
+ * An iterator implementation for psets.
+ */
+extern const iterator_t *it_pset;
+
+/**
+ * An iterator implementation for linked lists.
+ */
+extern const iterator_t *it_list;