summaryrefslogtreecommitdiff
path: root/libobjc/objc-private/objc-list.h
diff options
context:
space:
mode:
Diffstat (limited to 'libobjc/objc-private/objc-list.h')
-rw-r--r--libobjc/objc-private/objc-list.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/libobjc/objc-private/objc-list.h b/libobjc/objc-private/objc-list.h
new file mode 100644
index 000000000..989b9c9d4
--- /dev/null
+++ b/libobjc/objc-private/objc-list.h
@@ -0,0 +1,94 @@
+/* Generic single linked list to keep various information
+ Copyright (C) 1993, 1994, 1996, 2009, 2010 Free Software Foundation, Inc.
+ Contributed by Kresten Krab Thorup.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+
+#ifndef __GNU_OBJC_LIST_H
+#define __GNU_OBJC_LIST_H
+
+struct objc_list
+{
+ void *head;
+ struct objc_list *tail;
+};
+
+/* Return a cons cell produced from (head . tail). */
+static inline struct objc_list*
+list_cons (void* head, struct objc_list* tail)
+{
+ struct objc_list* cell;
+
+ cell = (struct objc_list*)objc_malloc (sizeof (struct objc_list));
+ cell->head = head;
+ cell->tail = tail;
+ return cell;
+}
+
+/* Remove the element at the head by replacing it by its
+ successor. */
+static inline void
+list_remove_head (struct objc_list** list)
+{
+ if ((*list)->tail)
+ {
+ /* Fetch next. */
+ struct objc_list* tail = (*list)->tail;
+
+ /* Copy next to list head. */
+ *(*list) = *tail;
+
+ /* Free next. */
+ objc_free (tail);
+ }
+ else
+ {
+ /* Inly one element in list. */
+ objc_free (*list);
+ (*list) = 0;
+ }
+}
+
+
+/* Map FUNCTION over all elements in LIST. */
+static inline void
+list_mapcar (struct objc_list* list, void(*function)(void*))
+{
+ while (list)
+ {
+ (*function) (list->head);
+ list = list->tail;
+ }
+}
+
+/* Free list (backwards recursive). */
+static inline void
+list_free (struct objc_list* list)
+{
+ if(list)
+ {
+ list_free (list->tail);
+ objc_free (list);
+ }
+}
+
+#endif /* not __GNU_OBJC_LIST_H */