objc-list.h revision 1.9
1/* Generic single linked list to keep various information
2   Copyright (C) 1993-2020 Free Software Foundation, Inc.
3   Contributed by Kresten Krab Thorup.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24<http://www.gnu.org/licenses/>.  */
25
26#ifndef __GNU_OBJC_LIST_H
27#define __GNU_OBJC_LIST_H
28
29struct objc_list
30{
31  void *head;
32  struct objc_list *tail;
33};
34
35/* Return a cons cell produced from (head . tail).  */
36static inline struct objc_list*
37list_cons (void* head, struct objc_list* tail)
38{
39  struct objc_list* cell;
40
41  cell = (struct objc_list*)objc_malloc (sizeof (struct objc_list));
42  cell->head = head;
43  cell->tail = tail;
44  return cell;
45}
46
47/* Remove the element at the head by replacing it by its
48   successor.  */
49static inline void
50list_remove_head (struct objc_list** list)
51{
52  if ((*list)->tail)
53    {
54      /* Fetch next.  */
55      struct objc_list* tail = (*list)->tail;
56
57      /* Copy next to list head.  */
58      *(*list) = *tail;
59
60      /* Free next.  */
61      objc_free (tail);
62    }
63  else
64    {
65      /* Inly one element in list.  */
66      objc_free (*list);
67      (*list) = 0;
68    }
69}
70
71
72/* Map FUNCTION over all elements in LIST.  */
73static inline void
74list_mapcar (struct objc_list* list, void(*function)(void*))
75{
76  while (list)
77    {
78      (*function) (list->head);
79      list = list->tail;
80    }
81}
82
83/* Free list (backwards recursive).  */
84static inline void
85list_free (struct objc_list* list)
86{
87  if(list)
88    {
89      list_free (list->tail);
90      objc_free (list);
91    }
92}
93
94#endif /* not __GNU_OBJC_LIST_H */
95