Changes in libcfa/src/bits/containers.hfa [3381ed7:2233ad4]
- File:
-
- 1 edited
-
libcfa/src/bits/containers.hfa (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/containers.hfa
r3381ed7 r2233ad4 10 10 // Created On : Tue Oct 31 16:38:50 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed J an 15 07:42:35 202013 // Update Count : 2812 // Last Modified On : Wed Jun 26 08:52:20 2019 13 // Update Count : 4 14 14 15 15 #pragma once … … 44 44 45 45 forall(dtype T | sized(T)) 46 static inline T & ?[?]( __small_array(T) & this, __lock_size_t idx) {46 static inline T& ?[?]( __small_array(T) & this, __lock_size_t idx) { 47 47 return ((typeof(this.data))this.data)[idx]; 48 48 } 49 49 50 50 forall(dtype T | sized(T)) 51 static inline T & ?[?]( const __small_array(T) & this, __lock_size_t idx) {51 static inline T& ?[?]( const __small_array(T) & this, __lock_size_t idx) { 52 52 return ((typeof(this.data))this.data)[idx]; 53 53 } 54 54 55 forall(dtype T )56 static inline T * begin( const __small_array(T) & this ) {55 forall(dtype T | sized(T)) 56 static inline T* begin( const __small_array(T) & this ) { 57 57 return ((typeof(this.data))this.data); 58 58 } 59 59 60 60 forall(dtype T | sized(T)) 61 static inline T * end( const __small_array(T) & this ) {61 static inline T* end( const __small_array(T) & this ) { 62 62 return ((typeof(this.data))this.data) + this.size; 63 63 } … … 70 70 #ifdef __cforall 71 71 trait is_node(dtype T) { 72 T *& get_next( T& );72 T*& get_next( T& ); 73 73 }; 74 74 #endif … … 97 97 forall(dtype T) 98 98 static inline void ?{}( __stack(T) & this ) { 99 (this.top){ 0p }; 100 } 101 102 static inline forall( dtype T | is_node(T) ) { 103 void push( __stack(T) & this, T * val ) { 104 verify( !get_next( *val ) ); 105 get_next( *val ) = this.top; 106 this.top = val; 107 } 108 109 T * pop( __stack(T) & this ) { 110 T * top = this.top; 111 if( top ) { 112 this.top = get_next( *top ); 113 get_next( *top ) = 0p; 114 } 115 return top; 116 } 117 118 int ?!=?( const __stack(T) & this, __attribute__((unused)) zero_t zero ) { 119 return this.top != 0; 120 } 99 (this.top){ NULL }; 100 } 101 102 forall(dtype T | is_node(T) | sized(T)) 103 static inline void push( __stack(T) & this, T * val ) { 104 verify( !get_next( *val ) ); 105 get_next( *val ) = this.top; 106 this.top = val; 107 } 108 109 forall(dtype T | is_node(T) | sized(T)) 110 static inline T * pop( __stack(T) & this ) { 111 T * top = this.top; 112 if( top ) { 113 this.top = get_next( *top ); 114 get_next( *top ) = NULL; 115 } 116 return top; 117 } 118 119 forall(dtype T | is_node(T)) 120 static inline int ?!=?( const __stack(T) & this, __attribute__((unused)) zero_t zero ) { 121 return this.top != 0; 121 122 } 122 123 #endif … … 144 145 145 146 #ifdef __cforall 146 static inline forall( dtype T | is_node(T) ) { 147 void ?{}( __queue(T) & this ) with( this ) { 148 head{ 1p }; 149 tail{ &head }; 150 verify(*tail == 1p); 151 } 152 153 void append( __queue(T) & this, T * val ) with( this ) { 154 verify(tail != 0p); 155 verify(*tail == 1p); 156 *tail = val; 157 tail = &get_next( *val ); 158 *tail = 1p; 159 } 160 161 T * pop_head( __queue(T) & this ) { 162 verify(*this.tail == 1p); 163 T * head = this.head; 164 if( head != 1p ) { 165 this.head = get_next( *head ); 166 if( get_next( *head ) == 1p ) { 167 this.tail = &this.head; 168 } 169 get_next( *head ) = 0p; 170 verify(*this.tail == 1p); 171 return head; 147 148 forall(dtype T) 149 static inline void ?{}( __queue(T) & this ) with( this ) { 150 head{ NULL }; 151 tail{ &head }; 152 } 153 154 forall(dtype T | is_node(T) | sized(T)) 155 static inline void append( __queue(T) & this, T * val ) with( this ) { 156 verify(tail != NULL); 157 *tail = val; 158 tail = &get_next( *val ); 159 } 160 161 forall(dtype T | is_node(T) | sized(T)) 162 static inline T * pop_head( __queue(T) & this ) { 163 T * head = this.head; 164 if( head ) { 165 this.head = get_next( *head ); 166 if( !get_next( *head ) ) { 167 this.tail = &this.head; 172 168 } 173 verify(*this.tail == 1p); 174 return 0p; 175 } 176 177 T * remove( __queue(T) & this, T ** it ) with( this ) { 178 T * val = *it; 179 verify( val ); 180 181 (*it) = get_next( *val ); 182 183 if( tail == &get_next( *val ) ) { 184 tail = it; 185 } 186 187 get_next( *val ) = 0p; 188 189 verify( (head == 1p) == (&head == tail) ); 190 verify( *tail == 1p ); 191 return val; 192 } 193 194 int ?!=?( const __queue(T) & this, __attribute__((unused)) zero_t zero ) { 195 return this.head != 0; 196 } 169 get_next( *head ) = NULL; 170 } 171 return head; 172 } 173 174 forall(dtype T | is_node(T) | sized(T)) 175 static inline T * remove( __queue(T) & this, T ** it ) with( this ) { 176 T * val = *it; 177 verify( val ); 178 179 (*it) = get_next( *val ); 180 181 if( tail == &get_next( *val ) ) { 182 tail = it; 183 } 184 185 get_next( *val ) = NULL; 186 187 verify( (head == NULL) == (&head == tail) ); 188 verify( *tail == NULL ); 189 return val; 190 } 191 192 forall(dtype T | is_node(T)) 193 static inline int ?!=?( const __queue(T) & this, __attribute__((unused)) zero_t zero ) { 194 return this.head != 0; 197 195 } 198 196 #endif … … 225 223 226 224 #ifdef __cforall 227 forall(dtype T ) 225 226 forall(dtype T | sized(T)) 228 227 static inline [void] ?{}( __dllist(T) & this, * [T * & next, T * & prev] ( T & ) __get ) { 229 this.head{ 0p};228 this.head{ NULL }; 230 229 this.__get = __get; 231 230 } … … 233 232 #define next 0 234 233 #define prev 1 235 static inline forall(dtype T) { 236 void push_front( __dllist(T) & this, T & node ) with( this ) { 237 verify(__get); 238 if ( head ) { 239 __get( node ).next = head; 240 __get( node ).prev = __get( *head ).prev; 241 // inserted node must be consistent before it is seen 242 // prevent code movement across barrier 243 asm( "" : : : "memory" ); 244 __get( *head ).prev = &node; 245 T & _prev = *__get( node ).prev; 246 __get( _prev ).next = &node; 247 } else { 248 __get( node ).next = &node; 249 __get( node ).prev = &node; 250 } 251 234 forall(dtype T | sized(T)) 235 static inline void push_front( __dllist(T) & this, T & node ) with( this ) { 236 verify(__get); 237 if ( head ) { 238 __get( node ).next = head; 239 __get( node ).prev = __get( *head ).prev; 240 // inserted node must be consistent before it is seen 252 241 // prevent code movement across barrier 253 242 asm( "" : : : "memory" ); 254 head = &node; 255 } 256 257 void remove( __dllist(T) & this, T & node ) with( this ) { 258 verify(__get); 259 if ( &node == head ) { 260 if ( __get( *head ).next == head ) { 261 head = 0p; 262 } else { 263 head = __get( *head ).next; 264 } 243 __get( *head ).prev = &node; 244 T & _prev = *__get( node ).prev; 245 __get( _prev ).next = &node; 246 } 247 else { 248 __get( node ).next = &node; 249 __get( node ).prev = &node; 250 } 251 252 // prevent code movement across barrier 253 asm( "" : : : "memory" ); 254 head = &node; 255 } 256 257 forall(dtype T | sized(T)) 258 static inline void remove( __dllist(T) & this, T & node ) with( this ) { 259 verify(__get); 260 if ( &node == head ) { 261 if ( __get( *head ).next == head ) { 262 head = NULL; 265 263 } 266 __get( *__get( node ).next ).prev = __get( node ).prev; 267 __get( *__get( node ).prev ).next = __get( node ).next; 268 __get( node ).next = 0p; 269 __get( node ).prev = 0p; 270 } 271 272 int ?!=?( const __dllist(T) & this, __attribute__((unused)) zero_t zero ) { 273 return this.head != 0; 274 } 264 else { 265 head = __get( *head ).next; 266 } 267 } 268 __get( *__get( node ).next ).prev = __get( node ).prev; 269 __get( *__get( node ).prev ).next = __get( node ).next; 270 __get( node ).next = NULL; 271 __get( node ).prev = NULL; 272 } 273 274 forall(dtype T | sized(T)) 275 static inline int ?!=?( const __dllist(T) & this, __attribute__((unused)) zero_t zero ) { 276 return this.head != 0; 275 277 } 276 278 #undef next … … 284 286 285 287 #endif 286 287 // Local Variables: //288 // tab-width: 4 //289 // End: //
Note:
See TracChangeset
for help on using the changeset viewer.