Changes in src/libcfa/bits/containers.h [705e612:65deb18]
- File:
-
- 1 edited
-
src/libcfa/bits/containers.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/bits/containers.h
r705e612 r65deb18 186 186 #endif 187 187 188 189 //-----------------------------------------------------------------------------190 // Doubly Linked List191 //-----------------------------------------------------------------------------192 #ifdef __cforall193 forall(dtype TYPE | sized(TYPE))194 #define T TYPE195 #define __getter_t * [T * & next, T * & prev] ( T & )196 #else197 typedef void (*__generit_c_getter_t)();198 #define T void199 #define __getter_t __generit_c_getter_t200 #endif201 struct __dllist {202 T * head;203 __getter_t __get;204 };205 #undef T206 #undef __getter_t207 208 #ifdef __cforall209 #define __dllist_t(T) __dllist(T)210 #else211 #define __dllist_t(T) struct __dllist212 #endif213 214 #ifdef __cforall215 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 .0223 #define _prev .1224 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 seen230 // prevent code movement across barrier231 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 barrier242 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 _next262 #undef _prev263 #endif264 265 188 //----------------------------------------------------------------------------- 266 189 // Tools
Note:
See TracChangeset
for help on using the changeset viewer.