Changes in src/libcfa/bits/containers.h [65deb18:705e612]
- File:
-
- 1 edited
-
src/libcfa/bits/containers.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/bits/containers.h
r65deb18 r705e612 186 186 #endif 187 187 188 189 //----------------------------------------------------------------------------- 190 // Doubly Linked List 191 //----------------------------------------------------------------------------- 192 #ifdef __cforall 193 forall(dtype TYPE | sized(TYPE)) 194 #define T TYPE 195 #define __getter_t * [T * & next, T * & prev] ( T & ) 196 #else 197 typedef void (*__generit_c_getter_t)(); 198 #define T void 199 #define __getter_t __generit_c_getter_t 200 #endif 201 struct __dllist { 202 T * head; 203 __getter_t __get; 204 }; 205 #undef T 206 #undef __getter_t 207 208 #ifdef __cforall 209 #define __dllist_t(T) __dllist(T) 210 #else 211 #define __dllist_t(T) struct __dllist 212 #endif 213 214 #ifdef __cforall 215 216 forall(dtype T | sized(T)) 217 static inline [void] ?{}( __dllist(T) & this, * [T * & next, T * & prev] ( T & ) __get ) { 218 this.head{ NULL }; 219 this.__get = __get; 220 } 221 222 #define _next .0 223 #define _prev .1 224 forall(dtype T | sized(T)) 225 static inline void push_front( __dllist(T) & this, T & node ) with( this ) { 226 if ( head ) { 227 __get( node )_next = head; 228 __get( node )_prev = __get( *head )_prev; 229 // inserted node must be consistent before it is seen 230 // prevent code movement across barrier 231 asm( "" : : : "memory" ); 232 __get( *head )_prev = &node; 233 T & prev = *__get( node )_prev; 234 __get( prev )_next = &node; 235 } 236 else { 237 __get( node )_next = &node; 238 __get( node )_prev = &node; 239 } 240 241 // prevent code movement across barrier 242 asm( "" : : : "memory" ); 243 head = &node; 244 } 245 246 forall(dtype T | sized(T)) 247 static inline void remove( __dllist(T) & this, T & node ) with( this ) { 248 if ( &node == head ) { 249 if ( __get( *head )_next == head ) { 250 head = NULL; 251 } 252 else { 253 head = __get( *head )_next; 254 } 255 } 256 __get( *__get( node )_next )_prev = __get( node )_prev; 257 __get( *__get( node )_prev )_next = __get( node )_next; 258 __get( node )_next = NULL; 259 __get( node )_prev = NULL; 260 } 261 #undef _next 262 #undef _prev 263 #endif 264 188 265 //----------------------------------------------------------------------------- 189 266 // Tools
Note:
See TracChangeset
for help on using the changeset viewer.