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