- Timestamp:
- Apr 13, 2026, 9:41:59 AM (9 days ago)
- Branches:
- master
- Children:
- 0f9c67bf
- Parents:
- 1abcec9b
- Location:
- libcfa/src/collections
- Files:
-
- 2 edited
-
array.hfa (modified) (2 diffs)
-
string.cfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/collections/array.hfa
r1abcec9b r5b21636b 1 1 #pragma once 2 2 3 3 4 … … 175 176 } 176 177 177 // RAII for copying interacts poorly with CFA RAII's default (quasi-mandate) to take178 // 'src' parameters by value; note doc/proposals/autogen.md suggests changing this pattern.179 // If Timmed offers a by-value copy-ctor, then180 // - the array copy-ctor will make lots of memcpys of them181 // - the array assignment operator will make temporaries (and call their RAII, implying182 // the above memcpys) of them183 // - the array assignment operator will scale poorly to higher dimensionality due to #226184 // 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 params189 #ifdef EXPERIMENTAL_ARRAY_ALLOW_COPY_RAII190 // call copy ctor on elements191 // array(float, 5) y; // given192 // array(float, 5) x = y; // <- do193 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 elements205 // array(float, 5) x, y; // given206 // x = y; // <- do207 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_RAII218 219 178 220 179 // -
libcfa/src/collections/string.cfa
r1abcec9b r5b21636b 244 244 245 245 string ?()( 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; 251 250 string ret = { *s.inner, start, len }; 252 251 return ret`share;
Note:
See TracChangeset
for help on using the changeset viewer.