Changeset 5b21636b for libcfa


Ignore:
Timestamp:
Apr 13, 2026, 9:41:59 AM (9 days ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
master
Children:
0f9c67bf
Parents:
1abcec9b
Message:

Retract work in progress mistakenly included in 1abcec9b.

Location:
libcfa/src/collections
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/collections/array.hfa

    r1abcec9b r5b21636b  
    11#pragma once
     2
    23
    34
     
    175176}
    176177
    177 // RAII for copying interacts poorly with CFA RAII's default (quasi-mandate) to take
    178 // 'src' parameters by value; note doc/proposals/autogen.md suggests changing this pattern.
    179 // If Timmed offers a by-value copy-ctor, then
    180 //  - the array copy-ctor will make lots of memcpys of them
    181 //  - the array assignment operator will make temporaries (and call their RAII, implying
    182 //    the above memcpys) of them
    183 //  - the array assignment operator will scale poorly to higher dimensionality due to #226
    184 // Furthermore, enabling this experimental flag breaks some multidimensional behaviour,
    185 // as illustraed by a test failure in array-md-sbscr-cases, which has not been investigated.
    186 // These limitations kick in upon calling the copy operation, not upon including the definitions.
    187 // Design choice here:
    188 //  - FIX ME: deal with `const &` on params
    189 #ifdef EXPERIMENTAL_ARRAY_ALLOW_COPY_RAII
    190         // call copy ctor on elements
    191         //   array(float, 5) y;     // given
    192         //   array(float, 5) x = y; // <- do
    193         forall( [N], S & | sized(S), Timmed *, Tbase & | { void ?{}( Timmed &, Timmed & ); } )
    194         static inline void ?{}( arpk( N, S, Timmed, Tbase ) & this, arpk( N, S, Timmed, Tbase ) & src ) {
    195                 ?{}( this, delay_init );
    196                 for (i; N) ?{}( (Timmed &)this.strides[i], src[i] );
    197         }
    198         forall( [N], S & | sized(S), Timmed *, Tbase & | { void ?{}( Timmed &, const Timmed & ); } )
    199         static inline void ?{}( arpk( N, S, Timmed, Tbase ) & this, arpk( N, S, Timmed, Tbase ) & src  ) {
    200                 ?{}( this, delay_init );
    201                 for (i; N) ?{}( (Timmed &)this.strides[i], src[i] );
    202         }
    203 
    204         // call assignment on elements
    205         //   array(float, 5) x, y;  // given
    206         //   x = y;                 // <- do
    207         forall( [N], S & | sized(S), Timmed & | is_value(Timmed), Tbase & )
    208         static inline void ?=?( arpk( N, S, Timmed, Tbase ) & this, arpk( N, S, Timmed, Tbase ) & src ) {
    209                 for (i; N) this[i] = src[i];
    210                 return src;
    211         }
    212         forall( [N], S & | sized(S), Timmed &, Tbase & | { void ?=?( Timmed &, const Timmed & ); } )
    213         static inline void ?=?( arpk( N, S, Timmed, Tbase ) & this, arpk( N, S, Timmed, Tbase ) & src  ) {
    214                 for (i; N) this[i] = src[i];
    215                 return src;
    216         }
    217 #endif // EXPERIMENTAL_ARRAY_ALLOW_COPY_RAII
    218 
    219178
    220179//
  • libcfa/src/collections/string.cfa

    r1abcec9b r5b21636b  
    244244
    245245string ?()( string & s, ssize_t start, ssize_t len ) {
    246         // if ( start < 0 ) start += len( s );
    247         // if ( len < 0 ) { len = -len; start -= len - 1; }
    248         // if ( start < 0 ) start = 0;
    249         // if ( start > len( s ) ) start = len( s );
    250         // if ( start + len > len( s ) ) len = len( s ) - start;
     246        if ( start < 0 ) start += len( s );
     247        if ( len < 0 ) { len = -len; start -= len - 1; }
     248        if ( start < 0 || start >= len( s ) ) return (string){ "" };
     249        if ( start + len > len( s ) ) len = len( s ) - start;
    251250        string ret = { *s.inner, start, len };
    252251        return ret`share;
Note: See TracChangeset for help on using the changeset viewer.