- Timestamp:
- Aug 12, 2025, 12:44:35 AM (7 weeks ago)
- Branches:
- master
- Children:
- 7f995d70
- Parents:
- 81e1984b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/mike_brooks_MMath/benchmarks/list/libcfa-fork-list.hfa
r81e1984b r6c58850 84 84 // signifying, "need to advance to the first element," and at the end 85 85 // of iteration, signifying, "no more elements." Normal comsumption of 86 // an iterator runs ?`moveNextas the first step, and uses the return87 // of ?`moveNextas a guard, before dereferencing the iterator. So86 // an iterator runs advance as the first step, and uses the return 87 // of advance as a guard, before dereferencing the iterator. So 88 88 // normal consumption of an iterator does not dereference an iterator 89 89 // in origin position. The value of a pointer (underlying a refence) … … 342 342 } 343 343 344 static inline tE & ?`first( dlist(tE, tLinks) & lst ) {344 static inline tE & first( dlist(tE, tLinks) & lst ) { 345 345 verify (&lst != 0p); 346 346 dlink(tE) * firstLnk = lst.next; … … 349 349 return downcast$( firstLnkTagged ); 350 350 } 351 static inline tE & ?`last ( dlist(tE, tLinks) & lst ) {351 static inline tE & last ( dlist(tE, tLinks) & lst ) { 352 352 verify (&lst != 0p); 353 353 dlink(tE) * lastLnk = lst.prev; … … 357 357 } 358 358 359 static inline bool ?`isEmpty( dlist(tE, tLinks) & lst ) {359 static inline bool isEmpty( dlist(tE, tLinks) & lst ) { 360 360 verify (&lst != 0p); 361 if ( & lst`first == 0p || & lst`last== 0p ) {362 verify( & l st`last == 0p && & lst`last== 0p );361 if ( & first(lst) == 0p || & last(lst) == 0p ) { 362 verify( & last(lst) == 0p && & last(lst) == 0p ); 363 363 return true; 364 364 } … … 366 366 } 367 367 368 static inline bool ?`isListed( tE & e ) {368 static inline bool isListed( tE & e ) { 369 369 NOLOOSE( 370 370 verify (&e != 0p); … … 381 381 } 382 382 383 static inline tE & ?`elems( dlist(tE, tLinks) & lst ) {383 static inline tE & iter( dlist(tE, tLinks) & lst ) { 384 384 tE * origin = $get_list_origin_addr( lst ); 385 385 return *origin; … … 391 391 // tag as in bit manipulation on a funny pointer 392 392 393 static inline bool ?`moveNext( tE && refx ) {393 static inline bool advance( tE && refx ) { 394 394 tE && ref_inner = refx; 395 395 tE & oldReferent = * (tE*) ORIGIN_TAG_CLEAR( (size_t) & ref_inner ); … … 407 407 } 408 408 409 static inline bool ?`movePrev( tE && refx ) {409 static inline bool recede( tE && refx ) { 410 410 tE && ref_inner = refx; 411 411 tE & oldReferent = * (tE*) ORIGIN_TAG_CLEAR( (size_t) & ref_inner ); … … 423 423 } 424 424 425 static inline bool hasNext( tE & e ) { 426 return e`moveNext; 427 } 428 429 static inline bool hasPrev( tE & e ) { 430 return e`movePrev; 425 bool isFirst( tE & node ) { 426 // Probable bug copied from master 427 // should be `! recede(node)` 428 // correct: "is first iff cannot recede" 429 // used backward in test suite too, probably victim of a grep rename 430 return recede( node ); 431 } 432 433 bool isLast( tE & node ) { 434 // ditto, vice versa 435 return advance( node ); 431 436 } 432 437 433 438 static inline tE & next( tE & e ) { 434 if( e`moveNext) return e;439 if( advance(e) ) return e; 435 440 return * 0p; 436 441 } 437 442 438 443 static inline tE & prev( tE & e ) { 439 if( e`movePrev) return e;444 if( recede(e) ) return e; 440 445 return * 0p; 441 446 } … … 467 472 468 473 static inline void insert_last( dlist(tE, tLinks) &lst, tE & e ) { 469 // insert_before( lst`elems, e);474 // insert_before(iter(lst), e); 470 475 dlink(tE) & linkToInsert = e`inner; 471 476 verify(ORIGIN_TAG_QUERY((size_t)linkToInsert.next)); … … 490 495 static inline tE & remove_first( dlist(tE, tLinks) &lst ) { 491 496 verify (&lst != 0p); 492 dlink(tE) & before_links = lst; 493 verify (! ORIGIN_TAG_QUERY( (size_t) (before_links.next) ) ); 494 495 dlink(tE) & list_pos_links = * before_links.next; 496 dlink(tE) & before_raw = * list_pos_links.prev; 497 498 dlink(tE) & after_raw = * list_pos_links.next; 497 dlink(tE) & list_links = lst; 498 verify (! ORIGIN_TAG_QUERY( (size_t) (list_links.next) ) ); 499 500 dlink(tE) & fst_links = * list_links.next; 501 502 dlink(tE) & after_raw = * fst_links.next; 499 503 dlink(tE) & after_links = * (dlink(tE) *) ORIGIN_TAG_CLEAR( (size_t) & after_raw ); 500 size_t after_links_prev_tag = ORIGIN_TAG_QUERY( (size_t) (after_links.prev) );504 verify( ! ORIGIN_TAG_QUERY( (size_t) (after_links.prev) ) ); 501 505 502 506 size_t before_links_next_rslt = ((size_t) & after_raw); 503 size_t after_links_prev_rslt = ORIGIN_TAG_ ASGN( ((size_t) & before_raw), after_links_prev_tag);504 before_links.next = (dlink(tE) *) before_links_next_rslt;507 size_t after_links_prev_rslt = ORIGIN_TAG_ENABL( (size_t) & list_links ); 508 list_links.next = (dlink(tE) *) before_links_next_rslt; 505 509 after_links.prev = (dlink(tE) *) after_links_prev_rslt; 506 510 507 511 asm( "" : : : "memory" ); 508 size_t list_pos_links_num = (size_t) & list_pos_links;512 size_t list_pos_links_num = (size_t) &fst_links; 509 513 size_t list_pos_links_tagged_num = ORIGIN_TAG_ENABL( list_pos_links_num ); 510 list_pos_links.next = list_pos_links.prev = (dlink(tE)*) list_pos_links_tagged_num;511 asm( "" : : : "memory" ); 512 513 tytagref( tLinks, dlink(tE) ) lpLnkTagged = { list_pos_links};514 fst_links.next = fst_links.prev = (dlink(tE)*) list_pos_links_tagged_num; 515 asm( "" : : : "memory" ); 516 517 tytagref( tLinks, dlink(tE) ) lpLnkTagged = {fst_links}; 514 518 return downcast$( lpLnkTagged ); 515 519 } … … 517 521 static inline tE & remove_last( dlist(tE, tLinks) &lst ) { 518 522 verify (&lst != 0p); 519 dlink(tE) & after_links = lst; 520 verify (! ORIGIN_TAG_QUERY( (size_t) (after_links.prev) ) ); 521 522 dlink(tE) & list_pos_links = * after_links.prev; 523 dlink(tE) & after_raw = * list_pos_links.next; 524 525 dlink(tE) & before_raw = * list_pos_links.prev; 523 dlink(tE) & list_links = lst; 524 verify (! ORIGIN_TAG_QUERY( (size_t) (list_links.prev) ) ); 525 526 dlink(tE) & last_links = * list_links.prev; 527 528 dlink(tE) & before_raw = * last_links.prev; 526 529 dlink(tE) & before_links = * (dlink(tE) *) ORIGIN_TAG_CLEAR( (size_t) & before_raw ); 527 size_t before_links_next_tag = ORIGIN_TAG_QUERY( (size_t) (before_links.next) );530 verify( ! ORIGIN_TAG_QUERY( (size_t) (before_links.next) ) ); 528 531 529 532 size_t after_links_prev_rslt = ((size_t) & before_raw); 530 size_t before_links_next_rslt = ORIGIN_TAG_ ASGN( ((size_t) & after_raw), before_links_next_tag);531 after_links.prev = (dlink(tE) *) after_links_prev_rslt;533 size_t before_links_next_rslt = ORIGIN_TAG_ENABL( (size_t) & list_links ); 534 list_links.prev = (dlink(tE) *) after_links_prev_rslt; 532 535 before_links.next = (dlink(tE) *) before_links_next_rslt; 533 536 534 537 asm( "" : : : "memory" ); 535 size_t list_pos_links_num = (size_t) &l ist_pos_links;538 size_t list_pos_links_num = (size_t) &last_links; 536 539 size_t list_pos_links_tagged_num = ORIGIN_TAG_ENABL( list_pos_links_num ); 537 l ist_pos_links.prev = list_pos_links.next = (dlink(tE)*) list_pos_links_tagged_num;538 asm( "" : : : "memory" ); 539 540 tytagref( tLinks, dlink(tE) ) lpLnkTagged = {l ist_pos_links};540 last_links.prev = last_links.next = (dlink(tE)*) list_pos_links_tagged_num; 541 asm( "" : : : "memory" ); 542 543 tytagref( tLinks, dlink(tE) ) lpLnkTagged = {last_links}; 541 544 return downcast$( lpLnkTagged ); 542 545 } 543 546 544 static inline tE & try_pop_f ront( dlist(tE, tLinks) &lst ) {545 tE & first_inlist = lst`first;547 static inline tE & try_pop_first( dlist(tE, tLinks) &lst ) { 548 tE & first_inlist = first(lst); 546 549 tE & first_item = first_inlist; 547 550 if (&first_item) remove(first_inlist); // TODO: should it use pop_front? … … 549 552 } 550 553 551 static inline tE & try_pop_ back( dlist(tE, tLinks) &lst ) {552 tE & last_inlist = l st`last;554 static inline tE & try_pop_last( dlist(tE, tLinks) &lst ) { 555 tE & last_inlist = last(lst); 553 556 tE & last_item = last_inlist; 554 557 if (&last_item) remove(last_inlist); // TODO: should it use pop_back? … … 561 564 tE & lagElem = *0p; 562 565 563 while ( tE & it = this`elems; it`moveNext) {564 if (& lagElem == 0p && &it != & this`first) return false;566 while ( tE & it = iter(this); advance(it) ) { 567 if (& lagElem == 0p && &it != & first(this) ) return false; 565 568 & lagElem = & it; 566 569 } 567 570 568 if (& lagElem != & this`last) return false;569 570 // TODO: verify that it is back at this`elems;571 if (& lagElem != & last(this)) return false; 572 573 // TODO: verify that it is back at iter(this); 571 574 return true; 572 575 } … … 574 577 tE & lagElem = *0p; 575 578 576 while ( tE & it = this`elems; it`movePrev) {577 if (& lagElem == 0p && &it != & this`last) return false;579 while ( tE & it = iter(this); recede(it) ) { 580 if (& lagElem == 0p && &it != & last(this) ) return false; 578 581 & lagElem = & it; 579 582 } 580 583 581 if (& lagElem != & this`first) return false;582 583 // TODO: verify that it is back at this`elems;584 if (& lagElem != & first(this)) return false; 585 586 // TODO: verify that it is back at iter(this); 584 587 return true; 585 588 } 586 589 static inline bool validate( dlist(tE, tLinks) & this ) { 587 bool reportsHavingFirst = ((& this`first) == 0p);588 bool reportsHavingLast = ((& this`last) == 0p);590 bool reportsHavingFirst = ((& first(this)) == 0p); 591 bool reportsHavingLast = ((& last(this)) == 0p); 589 592 if ( reportsHavingFirst != reportsHavingLast ) return false; 590 593
Note:
See TracChangeset
for help on using the changeset viewer.