Changeset 8c2723f for libcfa/src
- Timestamp:
- Mar 14, 2025, 4:22:42 PM (4 weeks ago)
- Branches:
- master
- Children:
- 3d9831b
- Parents:
- a21aaff
- Location:
- libcfa/src/collections
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified libcfa/src/collections/string.cfa ¶
ra21aaff r8c2723f 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 5 23:12:05 202413 // Update Count : 27 312 // Last Modified On : Fri Mar 14 15:41:33 2025 13 // Update Count : 275 14 14 // 15 15 … … 139 139 // Alternate construction: request shared edits 140 140 141 string_ WithSharedEdits ?`shareEdits( string & s ) {142 string_ WithSharedEditsret = { &s };143 return ret; 144 } 145 146 void ?{}( string & s, string_ WithSharedEditssrc ) {141 string_Share ?`share( string & s ) { 142 string_Share ret = { &s }; 143 return ret; 144 } 145 146 void ?{}( string & s, string_Share src ) { 147 147 ?{}( s, *src.s->inner, 0, src.s->inner->Handle.lnth ); 148 148 } … … 255 255 string ?()( string & s, size_t start, size_t len ) { 256 256 string ret = { *s.inner, start, len }; 257 return ret`share Edits;257 return ret`share; 258 258 } 259 259 260 260 string ?()( string & s, size_t start ) { 261 261 string ret = { *s.inner, start, size( s ) - start }; 262 return ret`share Edits;262 return ret`share; 263 263 } 264 264 … … 403 403 string ?[?]( string & s, size_t index ) { 404 404 string ret = { *s.inner, index, 1 }; 405 return ret`share Edits;405 return ret`share; 406 406 } 407 407 -
TabularUnified libcfa/src/collections/string.hfa ¶
ra21aaff r8c2723f 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Oct 13 10:50:30 202413 // Update Count : 13 112 // Last Modified On : Fri Mar 14 15:33:38 2025 13 // Update Count : 132 14 14 // 15 15 … … 77 77 78 78 // Alternate construction: request shared edits 79 struct string_ WithSharedEdits{79 struct string_Share { 80 80 string * s; 81 81 }; 82 string_ WithSharedEdits ?`shareEdits( string & s );83 void ?{}( string & s, string_ WithSharedEditssrc );82 string_Share ?`share( string & s ); 83 void ?{}( string & s, string_Share src ); 84 84 85 85 // IO Operator -
TabularUnified libcfa/src/collections/string_res.cfa ¶
ra21aaff r8c2723f 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Aug 17 14:08:01 202413 // Update Count : 8 612 // Last Modified On : Fri Mar 14 15:45:24 2025 13 // Update Count : 88 14 14 // 15 15 … … 319 319 if( ambient_string_sharectx->activeHeap ) { 320 320 (Handle){ * ambient_string_sharectx->activeHeap }; 321 (share EditSet_owns_ulink){ false };321 (shareSet_owns_ulink){ false }; 322 322 verify( Handle.s == 0p && Handle.lnth == 0 ); 323 323 } else { 324 324 (Handle){ * new( (size_t) 10 ) }; // TODO: can I lazily avoid allocating for empty string 325 (share EditSet_owns_ulink){ true };325 (shareSet_owns_ulink){ true }; 326 326 Handle.s = Handle.ulink->StartVbyte; 327 327 verify( Handle.lnth == 0 ); 328 328 } 329 s.share EditSet_prev = &s;330 s.share EditSet_next = &s;329 s.shareSet_prev = &s; 330 s.shareSet_next = &s; 331 331 } 332 332 … … 334 334 if( ambient_string_sharectx->activeHeap ) { 335 335 (Handle){ * ambient_string_sharectx->activeHeap }; 336 (share EditSet_owns_ulink){ false };336 (shareSet_owns_ulink){ false }; 337 337 } else { 338 338 (Handle){ * new( rhslnth ) }; 339 (share EditSet_owns_ulink){ true };339 (shareSet_owns_ulink){ true }; 340 340 } 341 341 Handle.s = VbyteAlloc(*Handle.ulink, rhslnth); 342 342 Handle.lnth = rhslnth; 343 343 memmove( Handle.s, rhs, rhslnth ); 344 s.share EditSet_prev = &s;345 s.share EditSet_next = &s;344 s.shareSet_prev = &s; 345 s.shareSet_next = &s; 346 346 } 347 347 … … 393 393 Handle.s = VbyteAlloc(*Handle.ulink, rhslnth); 394 394 Handle.lnth = rhslnth; 395 (s.share EditSet_owns_ulink){ false };395 (s.shareSet_owns_ulink){ false }; 396 396 memmove( Handle.s, rhs, rhslnth ); 397 s.share EditSet_prev = &s;398 s.share EditSet_next = &s;397 s.shareSet_prev = &s; 398 s.shareSet_next = &s; 399 399 } 400 400 … … 408 408 // crossing heaps (including private): copy eagerly 409 409 eagerCopyCtorHelper(s, s2.Handle.s + start, end - start); 410 verify(s.share EditSet_prev == &s);411 verify(s.share EditSet_next == &s);410 verify(s.shareSet_prev == &s); 411 verify(s.shareSet_next == &s); 412 412 } else { 413 413 (s.Handle){}; … … 423 423 // requested logical copy in same heap: defer copy until write 424 424 425 (s.share EditSet_owns_ulink){ false };426 427 // make s alone in its share EditSet428 s.share EditSet_prev = &s;429 s.share EditSet_next = &s;425 (s.shareSet_owns_ulink){ false }; 426 427 // make s alone in its shareSet 428 s.shareSet_prev = &s; 429 s.shareSet_next = &s; 430 430 } else { 431 431 verify( mode == SHARE_EDITS ); 432 432 // sharing edits with source forces same heap as source (ignore context) 433 433 434 (s.share EditSet_owns_ulink){ s2.shareEditSet_owns_ulink };434 (s.shareSet_owns_ulink){ s2.shareSet_owns_ulink }; 435 435 436 436 // s2 is logically const but not implementation const 437 437 string_res & s2mod = (string_res &) s2; 438 438 439 // insert s after s2 on share EditSet440 s.share EditSet_next = s2mod.shareEditSet_next;441 s.share EditSet_prev = &s2mod;442 s.share EditSet_next->shareEditSet_prev = &s;443 s.share EditSet_prev->shareEditSet_next = &s;439 // insert s after s2 on shareSet 440 s.shareSet_next = s2mod.shareSet_next; 441 s.shareSet_prev = &s2mod; 442 s.shareSet_next->shareSet_prev = &s; 443 s.shareSet_prev->shareSet_next = &s; 444 444 } 445 445 } 446 446 } 447 447 448 static void assignEditSet(string_res & s, string_res * share EditSetStartPeer, string_res * shareEditSetEndPeer,448 static void assignEditSet(string_res & s, string_res * shareSetStartPeer, string_res * shareSetEndPeer, 449 449 char * resultSesStart, 450 450 size_t resultSesLnth, 451 451 HandleNode * resultPadPosition, size_t bsize ) { 452 452 453 char * beforeBegin = share EditSetStartPeer->Handle.s;453 char * beforeBegin = shareSetStartPeer->Handle.s; 454 454 size_t beforeLen = s.Handle.s - beforeBegin; 455 455 456 456 char * afterBegin = s.Handle.s + s.Handle.lnth; 457 size_t afterLen = share EditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth - afterBegin;457 size_t afterLen = shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth - afterBegin; 458 458 459 459 size_t oldLnth = s.Handle.lnth; … … 466 466 // adjust all substring string and handle locations, and check if any substring strings are outside the new base string 467 467 char *limit = resultSesStart + resultSesLnth; 468 for ( string_res * p = s.share EditSet_next; p != &s; p = p->shareEditSet_next ) {468 for ( string_res * p = s.shareSet_next; p != &s; p = p->shareSet_next ) { 469 469 verify (p->Handle.s >= beforeBegin); 470 470 if ( p->Handle.s >= afterBegin ) { … … 520 520 521 521 // traverse the share-edit set (SES) to recover the range of a base string to which `s` belongs 522 static void locateInShare EditSet( string_res & s, string_res *& shareEditSetStartPeer, string_res *& shareEditSetEndPeer ) {523 share EditSetStartPeer = & s;524 share EditSetEndPeer = & s;525 for (string_res * editPeer = s.share EditSet_next; editPeer != &s; editPeer = editPeer->shareEditSet_next) {526 if ( editPeer->Handle.s < share EditSetStartPeer->Handle.s ) {527 share EditSetStartPeer = editPeer;522 static void locateInShareSet( string_res & s, string_res *& shareSetStartPeer, string_res *& shareSetEndPeer ) { 523 shareSetStartPeer = & s; 524 shareSetEndPeer = & s; 525 for (string_res * editPeer = s.shareSet_next; editPeer != &s; editPeer = editPeer->shareSet_next) { 526 if ( editPeer->Handle.s < shareSetStartPeer->Handle.s ) { 527 shareSetStartPeer = editPeer; 528 528 } 529 if ( share EditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth < editPeer->Handle.s + editPeer->Handle.lnth) {530 share EditSetEndPeer = editPeer;529 if ( shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth < editPeer->Handle.s + editPeer->Handle.lnth) { 530 shareSetEndPeer = editPeer; 531 531 } 532 532 } … … 534 534 535 535 static string_res & assign_(string_res & s, const char * buffer, size_t bsize, const string_res & valSrc) { 536 string_res * share EditSetStartPeer;537 string_res * share EditSetEndPeer;538 locateInShare EditSet( s, shareEditSetStartPeer, shareEditSetEndPeer );539 540 verify( share EditSetEndPeer->Handle.s >= shareEditSetStartPeer->Handle.s );541 size_t origEditSetLength = share EditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth - shareEditSetStartPeer->Handle.s;536 string_res * shareSetStartPeer; 537 string_res * shareSetEndPeer; 538 locateInShareSet( s, shareSetStartPeer, shareSetEndPeer ); 539 540 verify( shareSetEndPeer->Handle.s >= shareSetStartPeer->Handle.s ); 541 size_t origEditSetLength = shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth - shareSetStartPeer->Handle.s; 542 542 verify( origEditSetLength >= s.Handle.lnth ); 543 543 544 if ( s.share EditSet_owns_ulink ) { // assigning to private context544 if ( s.shareSet_owns_ulink ) { // assigning to private context 545 545 // ok to overwrite old value within LHS 546 char * prefixStartOrig = share EditSetStartPeer->Handle.s;546 char * prefixStartOrig = shareSetStartPeer->Handle.s; 547 547 int prefixLen = s.Handle.s - prefixStartOrig; 548 548 char * suffixStartOrig = s.Handle.s + s.Handle.lnth; 549 int suffixLen = share EditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth - suffixStartOrig;549 int suffixLen = shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth - suffixStartOrig; 550 550 551 551 int delta = bsize - s.Handle.lnth; … … 556 556 destCursor += prefixLen; memcpy(destCursor, buffer , bsize ); 557 557 destCursor += bsize; memcpy(destCursor, suffixStartOrig, suffixLen); 558 assignEditSet(s, share EditSetStartPeer, shareEditSetEndPeer,558 assignEditSet(s, shareSetStartPeer, shareSetEndPeer, 559 559 dest, 560 560 origEditSetLength + delta, … … 566 566 memcpy( s.Handle.s, buffer, bsize ); 567 567 568 assignEditSet(s, share EditSetStartPeer, shareEditSetEndPeer,569 share EditSetStartPeer->Handle.s,568 assignEditSet(s, shareSetStartPeer, shareSetEndPeer, 569 shareSetStartPeer->Handle.s, 570 570 origEditSetLength + delta, 571 571 0p, bsize); … … 578 578 579 579 // SES's result will only use characters from the source string => reuse source 580 assignEditSet(s, share EditSetStartPeer, shareEditSetEndPeer,580 assignEditSet(s, shareSetStartPeer, shareSetEndPeer, 581 581 valSrc.Handle.s, 582 582 valSrc.Handle.lnth, … … 587 587 // OR we are importing characters: need to copy eagerly (can't refer to source) 588 588 589 // full string is from start of share EditSetStartPeer thru end of shareEditSetEndPeer589 // full string is from start of shareSetStartPeer thru end of shareSetEndPeer 590 590 // `s` occurs in the middle of it, to be replaced 591 591 // build up the new text in `pasting` … … 593 593 string_res pasting = { 594 594 * s.Handle.ulink, // maintain same heap, regardless of context 595 share EditSetStartPeer->Handle.s, // start of SES596 s.Handle.s - share EditSetStartPeer->Handle.s }; // length of SES, before s595 shareSetStartPeer->Handle.s, // start of SES 596 s.Handle.s - shareSetStartPeer->Handle.s }; // length of SES, before s 597 597 append( pasting, 598 598 buffer, // start of replacement for s … … 600 600 append( pasting, 601 601 s.Handle.s + s.Handle.lnth, // start of SES after s 602 share EditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth -602 shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth - 603 603 (s.Handle.s + s.Handle.lnth) ); // length of SES, after s 604 604 … … 607 607 // From s point on, they are stable. 608 608 609 assignEditSet(s, share EditSetStartPeer, shareEditSetEndPeer,609 assignEditSet(s, shareSetStartPeer, shareSetEndPeer, 610 610 pasting.Handle.s, 611 611 pasting.Handle.lnth, … … 675 675 676 676 // sever s from its share-edit peers, if any (four no-ops when already solo) 677 s.share EditSet_prev->shareEditSet_next = s.shareEditSet_next;678 s.share EditSet_next->shareEditSet_prev = s.shareEditSet_prev;679 // s.share EditSet_next = &s;680 // s.share EditSet_prev = &s;681 682 if (share EditSet_owns_ulink && s.shareEditSet_next == &s) { // last one out677 s.shareSet_prev->shareSet_next = s.shareSet_next; 678 s.shareSet_next->shareSet_prev = s.shareSet_prev; 679 // s.shareSet_next = &s; 680 // s.shareSet_prev = &s; 681 682 if (shareSet_owns_ulink && s.shareSet_next == &s) { // last one out 683 683 delete( s.Handle.ulink ); 684 684 } -
TabularUnified libcfa/src/collections/string_res.hfa ¶
ra21aaff r8c2723f 10 10 // Created On : Fri Sep 03 11:00:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Oct 13 10:51:11 202413 // Update Count : 6 012 // Last Modified On : Fri Mar 14 15:44:01 2025 13 // Update Count : 61 14 14 // 15 15 … … 46 46 struct string_res { 47 47 HandleNode Handle; // chars, start, end, global neighbours 48 bool share EditSet_owns_ulink;49 string_res * share EditSet_prev;50 string_res * share EditSet_next;48 bool shareSet_owns_ulink; 49 string_res * shareSet_prev; 50 string_res * shareSet_next; 51 51 }; 52 52
Note: See TracChangeset
for help on using the changeset viewer.