Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 #ifndef _SOS_LIST_H_ 018 #ifndef _SOS_LIST_H_
019 #define _SOS_LIST_H_ 019 #define _SOS_LIST_H_
020 020
021 021
022 022
023 023
024 024
025 025
026 026
027 027
028 028
029 029
030 030
031 031
032 032
033 #define list_init_named(list,prev,next) \ 033 #define list_init_named(list,prev,next) \
034 ((list) = NULL) 034 ((list) = NULL)
035 035
036 #define list_singleton_named(list,item,prev,ne 036 #define list_singleton_named(list,item,prev,next) ({ \
037 (item)->next = (item)->prev = (item); \ 037 (item)->next = (item)->prev = (item); \
038 (list) = (item); \ 038 (list) = (item); \
039 }) 039 })
040 040
041 #define list_is_empty_named(list,prev,next) \ 041 #define list_is_empty_named(list,prev,next) \
042 ((list) == NULL) 042 ((list) == NULL)
043 043
044 #define list_is_singleton_named(list,prev,next <<
045 ( ((list) != NULL) && ((list)->prev == (list <<
046 <<
047 #define list_get_head_named(list,prev,next) \ 044 #define list_get_head_named(list,prev,next) \
048 (list) 045 (list)
049 046
050 #define list_get_tail_named(list,prev,next) \ 047 #define list_get_tail_named(list,prev,next) \
051 ((list)?((list)->prev):NULL) 048 ((list)?((list)->prev):NULL)
052 049
053 050
054 #define __list_insert_atleft_named(before_this 051 #define __list_insert_atleft_named(before_this,item,prev,next) ({ \
055 (before_this)->prev->next = (item); \ 052 (before_this)->prev->next = (item); \
056 (item)->prev = (before_this)->prev; \ 053 (item)->prev = (before_this)->prev; \
057 (before_this)->prev = (item); \ 054 (before_this)->prev = (item); \
058 (item)->next = (before_this); \ 055 (item)->next = (before_this); \
059 }) 056 })
060 057
061 058
062 #define list_insert_before_named(list,before_t 059 #define list_insert_before_named(list,before_this,item,prev,next) ({ \
063 __list_insert_atleft_named(before_this,item 060 __list_insert_atleft_named(before_this,item,prev,next); \
064 if ((list) == (before_this)) (list) = (item 061 if ((list) == (before_this)) (list) = (item); \
065 }) 062 })
066 063
067 064
068 #define list_insert_after_named(list,after_thi 065 #define list_insert_after_named(list,after_this,item,prev,next) ({ \
069 (after_this)->next->prev = (item); \ 066 (after_this)->next->prev = (item); \
070 (item)->next = (after_this)->next; \ 067 (item)->next = (after_this)->next; \
071 (after_this)->next = (item); \ 068 (after_this)->next = (item); \
072 (item)->prev = (after_this); \ 069 (item)->prev = (after_this); \
073 }) 070 })
074 071
075 #define list_add_head_named(list,item,prev,nex 072 #define list_add_head_named(list,item,prev,next) ({ \
076 if (list) \ 073 if (list) \
077 list_insert_before_named(list,list,item,pr 074 list_insert_before_named(list,list,item,prev,next); \
078 else \ 075 else \
079 list_singleton_named(list,item,prev,next); 076 list_singleton_named(list,item,prev,next); \
080 (list) = (item); \ 077 (list) = (item); \
081 }) 078 })
082 079
083 #define list_add_tail_named(list,item,prev,nex 080 #define list_add_tail_named(list,item,prev,next) ({ \
084 if (list) \ 081 if (list) \
085 __list_insert_atleft_named(list,item,prev, 082 __list_insert_atleft_named(list,item,prev,next); \
086 else \ 083 else \
087 list_singleton_named(list,item,prev,next); 084 list_singleton_named(list,item,prev,next); \
088 }) 085 })
089 086
090 087
091 #define list_delete_named(list,item,prev,next) 088 #define list_delete_named(list,item,prev,next) ({ \
092 if ( ((item)->next == (item)) && ((item)->pr 089 if ( ((item)->next == (item)) && ((item)->prev == (item)) ) \
093 (item)->next = (item)->prev = (list) = NUL 090 (item)->next = (item)->prev = (list) = NULL; \
094 else { \ 091 else { \
095 (item)->prev->next = (item)->next; \ 092 (item)->prev->next = (item)->next; \
096 (item)->next->prev = (item)->prev; \ 093 (item)->next->prev = (item)->prev; \
097 if ((item) == (list)) (list) = (item)->nex 094 if ((item) == (list)) (list) = (item)->next; \
098 (item)->prev = (item)->next = NULL; \ 095 (item)->prev = (item)->next = NULL; \
099 } \ 096 } \
100 }) 097 })
101 098
102 #define list_pop_head_named(list,prev,next) ({ 099 #define list_pop_head_named(list,prev,next) ({ \
103 typeof(list) __ret_elt = (list); \ 100 typeof(list) __ret_elt = (list); \
104 list_delete_named(list,__ret_elt,prev,next); 101 list_delete_named(list,__ret_elt,prev,next); \
105 __ret_elt; }) 102 __ret_elt; })
106 103
107 104
108 105
109 #define list_foreach_forward_named(list,iterat 106 #define list_foreach_forward_named(list,iterator,nb_elements,prev,next) \
110 for (nb_elements=0, (iterator) = (list 107 for (nb_elements=0, (iterator) = (list) ; \
111 (iterator) && (!nb_elements || (( 108 (iterator) && (!nb_elements || ((iterator) != (list))) ; \
112 nb_elements++, (iterator) = (iter 109 nb_elements++, (iterator) = (iterator)->next )
113 110
114 111
115 112
116 #define list_foreach_backward_named(list,itera 113 #define list_foreach_backward_named(list,iterator,nb_elements,prev,next) \
117 for (nb_elements=0, (iterator) = list_ 114 for (nb_elements=0, (iterator) = list_get_tail_named(list,prev,next) ; \
118 (iterator) && (!nb_elements || \ 115 (iterator) && (!nb_elements || \
119 ((iterator) != list_get_tail_na 116 ((iterator) != list_get_tail_named(list,prev,next))) ; \
120 nb_elements++, (iterator) = (iter 117 nb_elements++, (iterator) = (iterator)->prev )
121 118
122 #define list_foreach_named list_foreach_forwar 119 #define list_foreach_named list_foreach_forward_named
123 120
124 121
125 #define list_foreach_early_break(list,iterator 122 #define list_foreach_early_break(list,iterator,nb_elements) \
126 ((list) && ( \ 123 ((list) && ( \
127 ((list) != (iterator)) || \ 124 ((list) != (iterator)) || \
128 ( ((list) == (iterator)) && (nb_elements = 125 ( ((list) == (iterator)) && (nb_elements == 0)) ))
129 126
130 !! 127
131 <<
132 <<
133 #define list_collapse_named(list,iterator,prev 128 #define list_collapse_named(list,iterator,prev,next) \
134 for ( ; ({ ((iterator) = (list)) ; \ 129 for ( ; ({ ((iterator) = (list)) ; \
135 if (list) list_delete_named 130 if (list) list_delete_named(list,iterator,prev,next) ; \
136 (iterator); }) ; ) 131 (iterator); }) ; )
137 132
138 133
139 134
140 135
141 136
142 137
143 138
144 #define list_init(list) \ 139 #define list_init(list) \
145 list_init_named(list,prev,next) 140 list_init_named(list,prev,next)
146 141
147 #define list_singleton(list,item) \ 142 #define list_singleton(list,item) \
148 list_singleton_named(list,item,prev,next) 143 list_singleton_named(list,item,prev,next)
149 144
150 #define list_is_empty(list) \ 145 #define list_is_empty(list) \
151 list_is_empty_named(list,prev,next) 146 list_is_empty_named(list,prev,next)
152 <<
153 #define list_is_singleton(list) \ <<
154 list_is_singleton_named(list,prev,next) <<
155 147
156 #define list_get_head(list) \ 148 #define list_get_head(list) \
157 list_get_head_named(list,prev,next) \ 149 list_get_head_named(list,prev,next) \
158 150
159 #define list_get_tail(list) \ 151 #define list_get_tail(list) \
160 list_get_tail_named(list,prev,next) \ 152 list_get_tail_named(list,prev,next) \
161 153
162 154
163 #define list_insert_after(list,after_this,item 155 #define list_insert_after(list,after_this,item) \
164 list_insert_after_named(list,after_this,item 156 list_insert_after_named(list,after_this,item,prev,next)
165 157
166 158
167 #define list_insert_before(list,before_this,it 159 #define list_insert_before(list,before_this,item) \
168 list_insert_before_named(list,before_this,it 160 list_insert_before_named(list,before_this,item,prev,next)
169 161
170 #define list_add_head(list,item) \ 162 #define list_add_head(list,item) \
171 list_add_head_named(list,item,prev,next) 163 list_add_head_named(list,item,prev,next)
172 164
173 #define list_add_tail(list,item) \ 165 #define list_add_tail(list,item) \
174 list_add_tail_named(list,item,prev,next) 166 list_add_tail_named(list,item,prev,next)
175 167
176 168
177 #define list_delete(list,item) \ 169 #define list_delete(list,item) \
178 list_delete_named(list,item,prev,next) 170 list_delete_named(list,item,prev,next)
179 171
180 #define list_pop_head(list) \ 172 #define list_pop_head(list) \
181 list_pop_head_named(list,prev,next) 173 list_pop_head_named(list,prev,next)
182 174
183 #define list_foreach_forward(list,iterator,nb_ 175 #define list_foreach_forward(list,iterator,nb_elements) \
184 list_foreach_forward_named(list,iterator,nb_ 176 list_foreach_forward_named(list,iterator,nb_elements,prev,next)
185 177
186 #define list_foreach_backward(list,iterator,nb 178 #define list_foreach_backward(list,iterator,nb_elements) \
187 list_foreach_backward_named(list,iterator,nb 179 list_foreach_backward_named(list,iterator,nb_elements,prev,next)
188 180
189 #define list_foreach list_foreach_forward 181 #define list_foreach list_foreach_forward
190 182
191 #define list_collapse(list,iterator) \ 183 #define list_collapse(list,iterator) \
192 list_collapse_named(list,iterator,prev,next) 184 list_collapse_named(list,iterator,prev,next)
193 185
194 #endif 186 #endif