Changeset 58fe85a for libcfa/src/bits/containers.hfa
- Timestamp:
- Jan 7, 2021, 3:27:00 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 2b4daf2, 64aeca0
- Parents:
- 3c64c668 (diff), eef8dfb (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
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/containers.hfa
r3c64c668 r58fe85a 17 17 #include "bits/align.hfa" 18 18 #include "bits/defs.hfa" 19 19 #include <stdio.h> 20 20 //----------------------------------------------------------------------------- 21 21 // Array … … 36 36 #define __small_array_t(T) __small_array(T) 37 37 #else 38 #define __small_array_t(T) struct__small_array38 #define __small_array_t(T) __small_array 39 39 #endif 40 40 … … 146 146 static inline forall( dtype T | is_node(T) ) { 147 147 void ?{}( __queue(T) & this ) with( this ) { 148 head{ 1p };149 tail{ &head };150 verify(*t ail == 1p);148 (this.head){ 1p }; 149 (this.tail){ &this.head }; 150 verify(*this.tail == 1p); 151 151 } 152 152 153 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; 154 verify(this.tail != 0p); 155 verify(*this.tail == 1p); 156 *this.tail = val; 157 this.tail = &get_next( *val ); 158 *this.tail = 1p; 159 } 160 161 T * peek( __queue(T) & this ) { 162 verify(*this.tail == 1p); 163 T * front = this.head; 164 if( front != 1p ) { 165 verify(*this.tail == 1p); 166 return front; 167 } 168 verify(*this.tail == 1p); 169 return 0p; 159 170 } 160 171 161 172 T * pop_head( __queue(T) & this ) { 162 173 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 ) {174 T * _head = this.head; 175 if( _head != 1p ) { 176 this.head = get_next( *_head ); 177 if( get_next( *_head ) == 1p ) { 167 178 this.tail = &this.head; 168 179 } 169 get_next( * head ) = 0p;180 get_next( *_head ) = 0p; 170 181 verify(*this.tail == 1p); 171 return head; 182 verify( get_next(*_head) == 0p ); 183 return _head; 172 184 } 173 185 verify(*this.tail == 1p); … … 181 193 (*it) = get_next( *val ); 182 194 183 if( t ail == &get_next( *val ) ) {184 t ail = it;195 if( this.tail == &get_next( *val ) ) { 196 this.tail = it; 185 197 } 186 198 187 199 get_next( *val ) = 0p; 188 200 189 verify( ( head == 1p) == (&head ==tail) );190 verify( *t ail == 1p );201 verify( (this.head == 1p) == (&this.head == this.tail) ); 202 verify( *this.tail == 1p ); 191 203 return val; 192 204 } 193 205 194 206 int ?!=?( const __queue(T) & this, __attribute__((unused)) zero_t zero ) { 195 return this.head != 0;207 return this.head != 1p; 196 208 } 197 209 } … … 227 239 forall(dtype T ) 228 240 static inline [void] ?{}( __dllist(T) & this, * [T * & next, T * & prev] ( T & ) __get ) { 229 this.head{ 0p };241 (this.head){ 0p }; 230 242 this.__get = __get; 231 243 } … … 236 248 void push_front( __dllist(T) & this, T & node ) with( this ) { 237 249 verify(__get); 238 if ( head ) {239 __get( node ).next = head;240 __get( node ).prev = __get( * head ).prev;250 if ( this.head ) { 251 __get( node ).next = this.head; 252 __get( node ).prev = __get( *this.head ).prev; 241 253 // inserted node must be consistent before it is seen 242 254 // prevent code movement across barrier 243 255 asm( "" : : : "memory" ); 244 __get( * head ).prev = &node;256 __get( *this.head ).prev = &node; 245 257 T & _prev = *__get( node ).prev; 246 258 __get( _prev ).next = &node; … … 252 264 // prevent code movement across barrier 253 265 asm( "" : : : "memory" ); 254 head = &node;266 this.head = &node; 255 267 } 256 268 257 269 void remove( __dllist(T) & this, T & node ) with( this ) { 258 270 verify(__get); 259 if ( &node == head ) {260 if ( __get( * head ).next ==head ) {261 head = 0p;271 if ( &node == this.head ) { 272 if ( __get( *this.head ).next == this.head ) { 273 this.head = 0p; 262 274 } else { 263 head = __get( *head ).next;275 this.head = __get( *this.head ).next; 264 276 } 265 277 } … … 273 285 return this.head != 0; 274 286 } 287 288 void move_to_front( __dllist(T) & src, __dllist(T) & dst, T & node ) { 289 remove (src, node); 290 push_front(dst, node); 291 } 275 292 } 276 293 #undef next
Note:
See TracChangeset
for help on using the changeset viewer.