Changeset 2b22e050 for src/libcfa/bits
- Timestamp:
- May 14, 2018, 8:45:23 AM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- a0cfa44
- Parents:
- 1dbc8590 (diff), 52df81c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/libcfa/bits/containers.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/bits/containers.h
r1dbc8590 r2b22e050 191 191 //----------------------------------------------------------------------------- 192 192 #ifdef __cforall 193 trait is_db_node(dtype T) { 194 T*& get_next( T& ); 195 T*& get_prev( T& ); 196 }; 197 #endif 198 199 #ifdef __cforall 200 forall(dtype TYPE | is_db_node(TYPE)) 193 forall(dtype TYPE | sized(TYPE)) 201 194 #define T TYPE 202 #else 203 #define T void 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 204 200 #endif 205 201 struct __dllist { 206 202 T * head; 207 }; 208 #undef T 203 __getter_t __get; 204 }; 205 #undef T 206 #undef __getter_t 209 207 210 208 #ifdef __cforall … … 216 214 #ifdef __cforall 217 215 218 forall(dtype T | is_db_node(T)) 219 static inline void ?{}( __dllist(T) & this ) with( this ) { 220 head{ NULL }; 221 } 222 223 // forall(dtype T | is_db_node(T) | sized(T)) 224 // static inline void push_front( __dllist(T) & this, T & node ) with( this ) { 225 // if ( head ) { 226 // get_next( node ) = head; 227 // get_prev( node ) = get_prev( *head ); 228 // // inserted node must be consistent before it is seen 229 // // prevent code movement across barrier 230 // asm( "" : : : "memory" ); 231 // get_prev( *head ) = node; 232 // T & prev = *get_prev( node ); 233 // get_next( prev ) = node; 234 // } 235 // else { 236 // get_next( node ) = &node; 237 // get_prev( node ) = &node; 238 // } 239 240 // // prevent code movement across barrier 241 // asm( "" : : : "memory" ); 242 // head = val; 243 // } 244 245 // forall(dtype T | is_db_node(T) | sized(T)) 246 // static inline T * remove( __dllist(T) & this, T & node ) with( this ) { 247 // if ( &node == head ) { 248 // if ( get_next( *head ) == head ) { 249 // head = NULL; 250 // } 251 // else { 252 // head = get_next( *head ); 253 // } 254 // } 255 // get_prev( *get_next( node ) ) = get_prev( node ); 256 // get_next( *get_prev( node ) ) = get_next( node ); 257 // get_next( node ) = NULL; 258 // get_prev( node ) = NULL; 259 // } 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 260 263 #endif 261 264
Note:
See TracChangeset
for help on using the changeset viewer.