From a59dd7aa7ca55ee52f0c0e775d937f1cc9d3a79b Mon Sep 17 00:00:00 2001 From: Sebastian Hack Date: Mon, 29 Nov 2004 13:33:44 +0000 Subject: [PATCH] Added iterators. [r4495] --- ir/adt/iterator.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ ir/adt/iterator.h | 30 ++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 ir/adt/iterator.c create mode 100644 ir/adt/iterator.h diff --git a/ir/adt/iterator.c b/ir/adt/iterator.c new file mode 100644 index 000000000..7136c6187 --- /dev/null +++ b/ir/adt/iterator.c @@ -0,0 +1,63 @@ + +#include + +#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 index 000000000..1e984462d --- /dev/null +++ b/ir/adt/iterator.h @@ -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; -- 2.20.1