Changeset 8c2723f for libcfa/src


Ignore:
Timestamp:
Mar 14, 2025, 4:22:42 PM (4 weeks ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
3d9831b
Parents:
a21aaff
Message:

change name shareEdit to share

Location:
libcfa/src/collections
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified libcfa/src/collections/string.cfa

    ra21aaff r8c2723f  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Aug  5 23:12:05 2024
    13 // Update Count     : 273
     12// Last Modified On : Fri Mar 14 15:41:33 2025
     13// Update Count     : 275
    1414//
    1515
     
    139139// Alternate construction: request shared edits
    140140
    141 string_WithSharedEdits ?`shareEdits( string & s ) {
    142     string_WithSharedEdits ret = { &s };
    143     return ret;
    144 }
    145 
    146 void ?{}( string & s, string_WithSharedEdits src ) {
     141string_Share ?`share( string & s ) {
     142    string_Share ret = { &s };
     143    return ret;
     144}
     145
     146void ?{}( string & s, string_Share src ) {
    147147    ?{}( s, *src.s->inner, 0, src.s->inner->Handle.lnth );
    148148}
     
    255255string ?()( string & s, size_t start, size_t len ) {
    256256    string ret = { *s.inner, start, len };
    257     return ret`shareEdits;
     257    return ret`share;
    258258}
    259259
    260260string ?()( string & s, size_t start ) {
    261261    string ret = { *s.inner, start, size( s ) - start };
    262     return ret`shareEdits;
     262    return ret`share;
    263263}
    264264
     
    403403string ?[?]( string & s, size_t index ) {
    404404    string ret = { *s.inner, index, 1 };
    405     return ret`shareEdits;
     405    return ret`share;
    406406}
    407407
  • TabularUnified libcfa/src/collections/string.hfa

    ra21aaff r8c2723f  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Oct 13 10:50:30 2024
    13 // Update Count     : 131
     12// Last Modified On : Fri Mar 14 15:33:38 2025
     13// Update Count     : 132
    1414//
    1515
     
    7777
    7878// Alternate construction: request shared edits
    79 struct string_WithSharedEdits {
     79struct string_Share {
    8080    string * s;
    8181};
    82 string_WithSharedEdits ?`shareEdits( string & s );
    83 void ?{}( string & s, string_WithSharedEdits src );
     82string_Share ?`share( string & s );
     83void ?{}( string & s, string_Share src );
    8484
    8585// IO Operator
  • TabularUnified libcfa/src/collections/string_res.cfa

    ra21aaff r8c2723f  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Aug 17 14:08:01 2024
    13 // Update Count     : 86
     12// Last Modified On : Fri Mar 14 15:45:24 2025
     13// Update Count     : 88
    1414//
    1515
     
    319319        if( ambient_string_sharectx->activeHeap ) {
    320320                (Handle){ * ambient_string_sharectx->activeHeap };
    321                 (shareEditSet_owns_ulink){ false };
     321                (shareSet_owns_ulink){ false };
    322322                verify( Handle.s == 0p && Handle.lnth == 0 );
    323323        } else {
    324324                (Handle){ * new( (size_t) 10 ) };  // TODO: can I lazily avoid allocating for empty string
    325                 (shareEditSet_owns_ulink){ true };
     325                (shareSet_owns_ulink){ true };
    326326                Handle.s = Handle.ulink->StartVbyte;
    327327                verify( Handle.lnth == 0 );
    328328        }
    329         s.shareEditSet_prev = &s;
    330         s.shareEditSet_next = &s;
     329        s.shareSet_prev = &s;
     330        s.shareSet_next = &s;
    331331                }
    332332
     
    334334        if( ambient_string_sharectx->activeHeap ) {
    335335                (Handle){ * ambient_string_sharectx->activeHeap };
    336                 (shareEditSet_owns_ulink){ false };
     336                (shareSet_owns_ulink){ false };
    337337        } else {
    338338                (Handle){ * new( rhslnth ) };
    339                 (shareEditSet_owns_ulink){ true };
     339                (shareSet_owns_ulink){ true };
    340340        }
    341341        Handle.s = VbyteAlloc(*Handle.ulink, rhslnth);
    342342        Handle.lnth = rhslnth;
    343343        memmove( Handle.s, rhs, rhslnth );
    344         s.shareEditSet_prev = &s;
    345         s.shareEditSet_next = &s;
     344        s.shareSet_prev = &s;
     345        s.shareSet_next = &s;
    346346}
    347347
     
    393393        Handle.s = VbyteAlloc(*Handle.ulink, rhslnth);
    394394        Handle.lnth = rhslnth;
    395         (s.shareEditSet_owns_ulink){ false };
     395        (s.shareSet_owns_ulink){ false };
    396396        memmove( Handle.s, rhs, rhslnth );
    397         s.shareEditSet_prev = &s;
    398         s.shareEditSet_next = &s;
     397        s.shareSet_prev = &s;
     398        s.shareSet_next = &s;
    399399}
    400400
     
    408408                // crossing heaps (including private): copy eagerly
    409409                eagerCopyCtorHelper(s, s2.Handle.s + start, end - start);
    410                 verify(s.shareEditSet_prev == &s);
    411                 verify(s.shareEditSet_next == &s);
     410                verify(s.shareSet_prev == &s);
     411                verify(s.shareSet_next == &s);
    412412        } else {
    413413                (s.Handle){};
     
    423423                        // requested logical copy in same heap: defer copy until write
    424424
    425                         (s.shareEditSet_owns_ulink){ false };
    426 
    427                         // make s alone in its shareEditSet
    428                         s.shareEditSet_prev = &s;
    429                         s.shareEditSet_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;
    430430                } else {
    431431                        verify( mode == SHARE_EDITS );
    432432                        // sharing edits with source forces same heap as source (ignore context)
    433433
    434                         (s.shareEditSet_owns_ulink){ s2.shareEditSet_owns_ulink };
     434                        (s.shareSet_owns_ulink){ s2.shareSet_owns_ulink };
    435435
    436436                        // s2 is logically const but not implementation const
    437437                        string_res & s2mod = (string_res &) s2;
    438438
    439                         // insert s after s2 on shareEditSet
    440                         s.shareEditSet_next = s2mod.shareEditSet_next;
    441                         s.shareEditSet_prev = &s2mod;
    442                         s.shareEditSet_next->shareEditSet_prev = &s;
    443                         s.shareEditSet_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;
    444444                }
    445445        }
    446446}
    447447
    448 static void assignEditSet(string_res & s, string_res * shareEditSetStartPeer, string_res * shareEditSetEndPeer,
     448static void assignEditSet(string_res & s, string_res * shareSetStartPeer, string_res * shareSetEndPeer,
    449449                                                  char * resultSesStart,
    450450                                                  size_t resultSesLnth,
    451451                                                  HandleNode * resultPadPosition, size_t bsize ) {
    452452
    453         char * beforeBegin = shareEditSetStartPeer->Handle.s;
     453        char * beforeBegin = shareSetStartPeer->Handle.s;
    454454        size_t beforeLen = s.Handle.s - beforeBegin;
    455455
    456456        char * afterBegin = s.Handle.s + s.Handle.lnth;
    457         size_t afterLen = shareEditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth - afterBegin;
     457        size_t afterLen = shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth - afterBegin;
    458458
    459459        size_t oldLnth = s.Handle.lnth;
     
    466466        // adjust all substring string and handle locations, and check if any substring strings are outside the new base string
    467467        char *limit = resultSesStart + resultSesLnth;
    468         for ( string_res * p = s.shareEditSet_next; p != &s; p = p->shareEditSet_next ) {
     468        for ( string_res * p = s.shareSet_next; p != &s; p = p->shareSet_next ) {
    469469                verify (p->Handle.s >= beforeBegin);
    470470                if ( p->Handle.s >= afterBegin ) {
     
    520520
    521521// traverse the share-edit set (SES) to recover the range of a base string to which `s` belongs
    522 static void locateInShareEditSet( string_res & s, string_res *& shareEditSetStartPeer, string_res *& shareEditSetEndPeer ) {
    523         shareEditSetStartPeer = & s;
    524         shareEditSetEndPeer = & s;
    525         for (string_res * editPeer = s.shareEditSet_next; editPeer != &s; editPeer = editPeer->shareEditSet_next) {
    526                 if ( editPeer->Handle.s < shareEditSetStartPeer->Handle.s ) {
    527                         shareEditSetStartPeer = editPeer;
     522static 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;
    528528                }
    529                 if ( shareEditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth < editPeer->Handle.s + editPeer->Handle.lnth) {
    530                         shareEditSetEndPeer = editPeer;
     529                if ( shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth < editPeer->Handle.s + editPeer->Handle.lnth) {
     530                        shareSetEndPeer = editPeer;
    531531                }
    532532        }
     
    534534
    535535static string_res & assign_(string_res & s, const char * buffer, size_t bsize, const string_res & valSrc) {
    536         string_res * shareEditSetStartPeer;
    537         string_res * shareEditSetEndPeer;
    538         locateInShareEditSet( s, shareEditSetStartPeer, shareEditSetEndPeer );
    539 
    540         verify( shareEditSetEndPeer->Handle.s >= shareEditSetStartPeer->Handle.s );
    541         size_t origEditSetLength = shareEditSetEndPeer->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;
    542542        verify( origEditSetLength >= s.Handle.lnth );
    543543
    544         if ( s.shareEditSet_owns_ulink ) {                               // assigning to private context
     544        if ( s.shareSet_owns_ulink ) {                           // assigning to private context
    545545                // ok to overwrite old value within LHS
    546                 char * prefixStartOrig = shareEditSetStartPeer->Handle.s;
     546                char * prefixStartOrig = shareSetStartPeer->Handle.s;
    547547                int prefixLen = s.Handle.s - prefixStartOrig;
    548548                char * suffixStartOrig = s.Handle.s + s.Handle.lnth;
    549                 int suffixLen = shareEditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth - suffixStartOrig;
     549                int suffixLen = shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth - suffixStartOrig;
    550550
    551551                int delta = bsize - s.Handle.lnth;
     
    556556                        destCursor += prefixLen;  memcpy(destCursor, buffer              , bsize        );
    557557                        destCursor += bsize;      memcpy(destCursor, suffixStartOrig, suffixLen);
    558                         assignEditSet(s, shareEditSetStartPeer, shareEditSetEndPeer,
     558                        assignEditSet(s, shareSetStartPeer, shareSetEndPeer,
    559559                                                  dest,
    560560                                                  origEditSetLength + delta,
     
    566566                        memcpy( s.Handle.s, buffer, bsize );
    567567
    568                         assignEditSet(s, shareEditSetStartPeer, shareEditSetEndPeer,
    569                                                   shareEditSetStartPeer->Handle.s,
     568                        assignEditSet(s, shareSetStartPeer, shareSetEndPeer,
     569                                                  shareSetStartPeer->Handle.s,
    570570                                                  origEditSetLength + delta,
    571571                                                  0p, bsize);
     
    578578
    579579                // SES's result will only use characters from the source string => reuse source
    580                 assignEditSet(s, shareEditSetStartPeer, shareEditSetEndPeer,
     580                assignEditSet(s, shareSetStartPeer, shareSetEndPeer,
    581581                                          valSrc.Handle.s,
    582582                                          valSrc.Handle.lnth,
     
    587587                // OR we are importing characters: need to copy eagerly (can't refer to source)
    588588
    589                 // full string is from start of shareEditSetStartPeer thru end of shareEditSetEndPeer
     589                // full string is from start of shareSetStartPeer thru end of shareSetEndPeer
    590590                // `s` occurs in the middle of it, to be replaced
    591591                // build up the new text in `pasting`
     
    593593                string_res pasting = {
    594594                        * s.Handle.ulink,                                                          // maintain same heap, regardless of context
    595                         shareEditSetStartPeer->Handle.s,                                   // start of SES
    596                         s.Handle.s - shareEditSetStartPeer->Handle.s }; // length of SES, before s
     595                        shareSetStartPeer->Handle.s,                               // start of SES
     596                        s.Handle.s - shareSetStartPeer->Handle.s }; // length of SES, before s
    597597                append( pasting,
    598598                                buffer,                                                                                 // start of replacement for s
     
    600600                append( pasting,
    601601                                s.Handle.s + s.Handle.lnth,                               // start of SES after s
    602                                 shareEditSetEndPeer->Handle.s + shareEditSetEndPeer->Handle.lnth -
     602                                shareSetEndPeer->Handle.s + shareSetEndPeer->Handle.lnth -
    603603                                (s.Handle.s + s.Handle.lnth) );                   // length of SES, after s
    604604
     
    607607                // From s point on, they are stable.
    608608
    609                 assignEditSet(s, shareEditSetStartPeer, shareEditSetEndPeer,
     609                assignEditSet(s, shareSetStartPeer, shareSetEndPeer,
    610610                                          pasting.Handle.s,
    611611                                          pasting.Handle.lnth,
     
    675675
    676676        // sever s from its share-edit peers, if any (four no-ops when already solo)
    677         s.shareEditSet_prev->shareEditSet_next = s.shareEditSet_next;
    678         s.shareEditSet_next->shareEditSet_prev = s.shareEditSet_prev;
    679         // s.shareEditSet_next = &s;
    680         // s.shareEditSet_prev = &s;
    681 
    682         if (shareEditSet_owns_ulink && s.shareEditSet_next == &s) { // last one out
     677        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
    683683                delete( s.Handle.ulink );
    684684        }
  • TabularUnified libcfa/src/collections/string_res.hfa

    ra21aaff r8c2723f  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Oct 13 10:51:11 2024
    13 // Update Count     : 60
     12// Last Modified On : Fri Mar 14 15:44:01 2025
     13// Update Count     : 61
    1414//
    1515
     
    4646struct string_res {
    4747    HandleNode Handle; // chars, start, end, global neighbours
    48     bool shareEditSet_owns_ulink;
    49     string_res * shareEditSet_prev;
    50     string_res * shareEditSet_next;
     48    bool shareSet_owns_ulink;
     49    string_res * shareSet_prev;
     50    string_res * shareSet_next;
    5151};
    5252
Note: See TracChangeset for help on using the changeset viewer.