Changeset 5ad6f0d


Ignore:
Timestamp:
Apr 13, 2025, 9:15:33 PM (5 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
b0296dba
Parents:
a514fed
Message:

more inlining, add strnlen and strncmp for string type

Location:
libcfa/src/collections
Files:
3 edited

Legend:

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

    ra514fed r5ad6f0d  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Apr 11 18:18:07 2025
    13 // Update Count     : 370
     12// Last Modified On : Sun Apr 13 07:58:55 2025
     13// Update Count     : 390
    1414//
    1515
     
    202202        return s;
    203203}
     204
     205////////////////////////////////////////////////////////
     206// Getter
     207
     208size_t strnlen( const string & s, size_t maxlen ) { return min( len( s ), maxlen ); }
    204209
    205210////////////////////////////////////////////////////////
     
    265270
    266271////////////////////////////////////////////////////////
    267 // Comparison
    268 
    269 int strcmp( const string & s1, const string & s2 ) { return strcmp( *s1.inner, *s2.inner ); }
    270 bool ?==?( const string & s1, const string & s2 ) { return *s1.inner == *s2.inner; }
    271 bool ?!=?( const string & s1, const string & s2 ) { return *s1.inner != *s2.inner; }
    272 bool ?>? ( const string & s1, const string & s2 ) { return *s1.inner >  *s2.inner; }
    273 bool ?>=?( const string & s1, const string & s2 ) { return *s1.inner >= *s2.inner; }
    274 bool ?<=?( const string & s1, const string & s2 ) { return *s1.inner <= *s2.inner; }
    275 bool ?<? ( const string & s1, const string & s2 ) { return *s1.inner <  *s2.inner; }
    276 
    277 int strcmp( const string & s1, const char * s2 ) { return strcmp( *s1.inner, s2 ); }
    278 bool ?==?( const string & s1, const char * s2 ) { return *s1.inner == s2; }
    279 bool ?!=?( const string & s1, const char * s2 ) { return *s1.inner != s2; }
    280 bool ?>? ( const string & s1, const char * s2 ) { return *s1.inner >  s2; }
    281 bool ?>=?( const string & s1, const char * s2 ) { return *s1.inner >= s2; }
    282 bool ?<=?( const string & s1, const char * s2 ) { return *s1.inner <= s2; }
    283 bool ?<? ( const string & s1, const char * s2 ) { return *s1.inner <  s2; }
    284 
    285 int strcmp( const char * s1, const string & s2 ) { return strcmp( s1, *s2.inner ); }
    286 bool ?==?( const char * s1, const string & s2 ) { return s1 == *s2.inner; }
    287 bool ?!=?( const char * s1, const string & s2 ) { return s1 != *s2.inner; }
    288 bool ?>? ( const char * s1, const string & s2 ) { return s1 >  *s2.inner; }
    289 bool ?>=?( const char * s1, const string & s2 ) { return s1 >= *s2.inner; }
    290 bool ?<=?( const char * s1, const string & s2 ) { return s1 <= *s2.inner; }
    291 bool ?<? ( const char * s1, const string & s2 ) { return s1 <  *s2.inner; }
    292 
    293 ////////////////////////////////////////////////////////
    294272// Concatenation
    295273
     
    403381        string ret = { *s.inner, index, 1 };
    404382        return ret`share;
     383}
     384
     385////////////////////////////////////////////////////////
     386// Comparison
     387
     388#define STRNCPY_FMT "**** Error **** strncpy: maximum length %zu is greater than string lengths %zd or %zd."
     389
     390int strncmp( const string & s1, const string & s2, size_t maxlen ) {
     391        if ( maxlen > len( s1 ) || maxlen > len( s2 ) ) {
     392                abort( STRNCPY_FMT, maxlen, len( s1 ), len( s2 ) );
     393        } // if
     394        return strcmp$( s1.inner->Handle.s, maxlen, s2.inner->Handle.s, maxlen );
     395}
     396
     397int strncmp( const string & s1, const char * s2, size_t maxlen ) {
     398        size_t s2len = len( s2 );
     399        if ( maxlen > len( s1 ) || maxlen > s2len ) {
     400                abort( STRNCPY_FMT, maxlen, len( s1 ), s2len );
     401        } // if
     402        return strcmp$( s1.inner->Handle.s, maxlen, s2, maxlen );
     403}
     404
     405int strncmp( const char * s1, const string & s2, size_t maxlen ) {
     406        size_t s1len = len( s1 );
     407        if ( maxlen > s1len || maxlen > len( s2 ) ) {
     408                abort( STRNCPY_FMT, maxlen, s1len, len( s2 ) );
     409        } // if
     410        return strcmp$( s1, maxlen, s2.inner->Handle.s, maxlen );
    405411}
    406412
     
    523529}
    524530
    525 size_t test( const string & s, int (*f)( int ) ) {
     531size_t include( const string & s, int (*f)( int ) ) {
    526532        size_t l = len( s );
    527533        for ( i; l ) {
     
    531537}
    532538
    533 string replace( string & s, const string & from, const string & to ) {
     539size_t exclude( const string & s, int (*f)( int ) ) {
     540        size_t l = len( s );
     541        for ( i; l ) {
     542                if ( f( s[i] ) ) return i;
     543        } // for
     544        return l;
     545}
     546
     547string replace( const string & s, const string & from, const string & to ) {
    534548        ssize_t pos;
    535549    string r;
  • libcfa/src/collections/string.hfa

    ra514fed r5ad6f0d  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Apr 11 18:13:35 2025
    13 // Update Count     : 261
     12// Last Modified On : Sun Apr 13 21:03:35 2025
     13// Update Count     : 284
    1414//
    1515
     
    8080static inline size_t len( const char * cs ) { return strlen( cs ); };
    8181static inline size_t strlen( const string & s ) { return len( s ); }
     82size_t strnlen( const string & s, size_t maxlen );
    8283
    8384// IO Operator
     
    125126        _Istream_Swidth wdi( unsigned int rwd, string & s ) { return (_Istream_Swidth)@{ .s = s, { {.scanset = 0p}, .wd = rwd, {.flags.rwd = true} } }; }
    126127        _Istream_Sstr getline( string & s, const char delimiter = '\n' ) {
    127 //              return (_Istream_Sstr)@{ { .s = s, { {.delimiters = { delimiter, '\0' } }, .wd = -1, {.flags.delimiter = true} } } };
    128128                return (_Istream_Sstr)@{ .s = s, { {.delimiters = { delimiter, '\0' } }, .wd = -1, {.flags.delimiter = true} } };
    129129        }
     
    138138                return (_Istream_Squote &)f;
    139139        }
    140 //      _Istream_Sstr incl( const char scanset[], string & s ) { return (_Istream_Sstr)@{ { .s = s, { {.scanset = scanset}, .wd = -1, {.flags.inex = false} } } }; }
    141140        _Istream_Sstr incl( const char scanset[], string & s ) { return (_Istream_Sstr)@{ .s = s, { {.scanset = scanset}, .wd = -1, {.flags.inex = false} } }; }
    142141        _Istream_Sstr & incl( const char scanset[], _Istream_Swidth & f ) { f.scanset = scanset; f.flags.inex = false; return (_Istream_Sstr &)f; }
    143 //      _Istream_Sstr excl( const char scanset[], string & s ) { return (_Istream_Sstr)@{ { .s = s, { {.scanset = scanset}, .wd = -1, {.flags.inex = true} } } }; }
    144142        _Istream_Sstr excl( const char scanset[], string & s ) { return (_Istream_Sstr)@{ .s = s, { {.scanset = scanset}, .wd = -1, {.flags.inex = true} } }; }
    145143        _Istream_Sstr & excl( const char scanset[], _Istream_Swidth & f ) { f.scanset = scanset; f.flags.inex = true; return (_Istream_Sstr &)f; }
    146 //      _Istream_Sstr ignore( string & s ) { return (_Istream_Sstr)@{ { .s = s, { {.scanset = 0p}, .wd = -1, {.flags.ignore = true} } } }; }
    147144        _Istream_Sstr ignore( string & s ) { return (_Istream_Sstr)@{ .s = s, { {.scanset = 0p}, .wd = -1, {.flags.ignore = true} } }; }
    148145        _Istream_Sstr & ignore( _Istream_Swidth & f ) { f.flags.ignore = true; return (_Istream_Sstr &)f; }
    149146        _Istream_Squote & ignore( _Istream_Squote & f ) { f.sstr.flags.ignore = true; return (_Istream_Squote &)f; }
    150 //      _Istream_Sstr & ignore( _Istream_Sstr & f ) { f.sstr.flags.ignore = true; return (_Istream_Sstr &)f; }
    151147        _Istream_Sstr & ignore( _Istream_Sstr & f ) { f.flags.ignore = true; return (_Istream_Sstr &)f; }
    152148} // distribution
     
    201197
    202198// Comparisons
    203 int strcmp ( const string &, const string & );
    204 bool ?==?( const string &, const string & );
    205 bool ?!=?( const string &, const string & );
    206 bool ?>? ( const string &, const string & );
    207 bool ?>=?( const string &, const string & );
    208 bool ?<=?( const string &, const string & );
    209 bool ?<? ( const string &, const string & );
    210 
    211 int strcmp( const string &, const char * );
    212 bool ?==?( const string &, const char * );
    213 bool ?!=?( const string &, const char * );
    214 bool ?>? ( const string &, const char * );
    215 bool ?>=?( const string &, const char * );
    216 bool ?<=?( const string &, const char * );
    217 bool ?<? ( const string &, const char * );
    218 
    219 int strcmp( const char *, const string & );
    220 bool ?==?( const char *, const string & );
    221 bool ?!=?( const char *, const string & );
    222 bool ?>? ( const char *, const string & );
    223 bool ?>=?( const char *, const string & );
    224 bool ?<=?( const char *, const string & );
    225 bool ?<? ( const char *, const string & );
     199static inline int strcmp( const string & s1, const string & s2 ) { return strcmp( *s1.inner, *s2.inner ); }
     200int strncmp( const string & s1, const string & s2, size_t maxlen );
     201static inline bool ?==?( const string & s1, const string & s2 ) { return *s1.inner == *s2.inner; }
     202static inline bool ?!=?( const string & s1, const string & s2 ) { return *s1.inner != *s2.inner; }
     203static inline bool ?>? ( const string & s1, const string & s2 ) { return *s1.inner >  *s2.inner; }
     204static inline bool ?>=?( const string & s1, const string & s2 ) { return *s1.inner >= *s2.inner; }
     205static inline bool ?<=?( const string & s1, const string & s2 ) { return *s1.inner <= *s2.inner; }
     206static inline bool ?<? ( const string & s1, const string & s2 ) { return *s1.inner <  *s2.inner; }
     207
     208static inline int strcmp( const string & s1, const char * s2 ) { return strcmp( *s1.inner, s2 ); }
     209int strncmp( const string & s1, const char * s2, size_t maxlen );
     210static inline bool ?==?( const string & s1, const char * s2 ) { return *s1.inner == s2; }
     211static inline bool ?!=?( const string & s1, const char * s2 ) { return *s1.inner != s2; }
     212static inline bool ?>? ( const string & s1, const char * s2 ) { return *s1.inner >  s2; }
     213static inline bool ?>=?( const string & s1, const char * s2 ) { return *s1.inner >= s2; }
     214static inline bool ?<=?( const string & s1, const char * s2 ) { return *s1.inner <= s2; }
     215static inline bool ?<? ( const string & s1, const char * s2 ) { return *s1.inner <  s2; }
     216
     217static inline int strcmp( const char * s1, const string & s2 ) { return strcmp( s1, *s2.inner ); }
     218int strncmp( const char * s1, const string & s2, size_t maxlen );
     219static inline bool ?==?( const char * s1, const string & s2 ) { return s1 == *s2.inner; }
     220static inline bool ?!=?( const char * s1, const string & s2 ) { return s1 != *s2.inner; }
     221static inline bool ?>? ( const char * s1, const string & s2 ) { return s1 >  *s2.inner; }
     222static inline bool ?>=?( const char * s1, const string & s2 ) { return s1 >= *s2.inner; }
     223static inline bool ?<=?( const char * s1, const string & s2 ) { return s1 <= *s2.inner; }
     224static inline bool ?<? ( const char * s1, const string & s2 ) { return s1 <  *s2.inner; }
    226225
    227226// String search
     
    279278
    280279size_t include( const string & s, const charclass & mask );
    281 static inline size_t include( const char * s, const charclass & mask ) { string temp = s; return include( temp, mask ); }
    282 static inline string include( const string & s, const charclass & mask ) { ssize_t i = include( s, mask ); return s( 0, i )`share; }
    283 static inline string include( const char * s, const charclass & mask ) { string temp = s; ssize_t i = include( temp, mask ); return temp( 0, i ); }
     280static inline size_t include( const char * cs, const charclass & mask ) { const string s = cs; return include( s, mask ); }
     281static inline string include( const string & s, const charclass & mask ) { return s( 0, include( s, mask ) ); }
     282static inline string include( const char * cs, const charclass & mask ) { const string s = cs; return s( 0, include( s, mask ) ); }
    284283
    285284size_t exclude( const string & s, const charclass & mask );
    286 static inline size_t exclude( const char * s, const charclass & mask ) { string temp = s; return exclude( temp, mask ); }
    287 static inline string exclude( const string & s, const charclass & mask ) { ssize_t i = exclude( s, mask ); return s( 0, i )`share; }
    288 static inline string exclude( const char * s, const charclass & mask ) { string temp = s; ssize_t i = exclude( temp, mask ); return temp( 0, i ); }
    289 
    290 size_t test( const string & s, int (*f)( int ) );
    291 static inline size_t test( const char * c, int (*f)( int ) ) {
    292         const string S = c;
    293         return test( S, f );
    294 }
    295 
    296 string replace( string & s, const string & from, const string & to );
    297 static inline string replace( const char * s, const char * from, const char * to ) {
    298         string S = s, From = from, To = to;
    299         return replace( S, From, To );
    300 }
    301 static inline string replace( string & s, const char * from, const char * to ) {
    302         string From = from, To = to;
    303         return replace( s, From, To );
    304 }
    305 static inline string replace( string & s, const char * from, const string & to ) {
    306         string From = from;
    307         return replace( s, From, to );
    308 }
    309 static inline string replace( string & s, string & from, const char * to ) {
    310         string To = to;
    311         return replace( s, from, To );
    312 }
     285static inline size_t exclude( const char * cs, const charclass & mask ) { const string s = cs; return exclude( s, mask ); }
     286static inline string exclude( const string & s, const charclass & mask ) { return s( 0, exclude( s, mask ) ); }
     287static inline string exclude( const char * cs, const charclass & mask ) { const string s = cs; return s( 0, exclude( s, mask ) ); }
     288
     289size_t include( const string & s, int (*f)( int ) );
     290static inline size_t include( const char * cs, int (*f)( int ) ) { const string S = cs; return include( S, f ); }
     291static inline string include( const string & s, int (*f)( int ) ) { return s( 0, include( s, f ) ); }
     292static inline string include( const char * cs, int (*f)( int ) ) { const string s = cs; return s( 0, include( s, f ) ); }
     293
     294size_t exclude( const string & s, int (*f)( int ) );
     295static inline size_t exclude( const char * cs, int (*f)( int ) ) { const string s = cs; return exclude( s, f ); }
     296static inline string exclude( const string & s, int (*f)( int ) ) { return s( 0, exclude( s, f ) ); }
     297static inline string exclude( const char * cs, int (*f)( int ) ) { const string s = cs; return s( 0, exclude( s, f ) ); }
     298
     299string replace( const string & s, const string & from, const string & to );
     300static inline string replace( const char * s, const char * from, const char * to ) { string S = s, From = from, To = to; return replace( S, From, To ); }
     301static inline string replace( const string & s, const char * from, const char * to ) { const string From = from, To = to; return replace( s, From, To ); }
     302static inline string replace( const string & s, const char * from, const string & to ) { const string From = from; return replace( s, From, to ); }
     303static inline string replace( const string & s, string & from, const char * to ) { const string To = to; return replace( s, from, To ); }
    313304
    314305string translate( const string & s, int (*f)( int ) );
    315 static inline string translate( const char * c, int (*f)( int ) ) {
    316         const string S = c;
    317         return translate( S, f );
    318 }
     306static inline string translate( const char * c, int (*f)( int ) ) { const string S = c; return translate( S, f ); }
    319307
    320308#ifndef _COMPILING_STRING_CFA_
  • libcfa/src/collections/string_res.hfa

    ra514fed r5ad6f0d  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Apr 11 18:11:05 2025
    13 // Update Count     : 77
     12// Last Modified On : Sun Apr 13 21:03:37 2025
     13// Update Count     : 79
    1414//
    1515
     
    148148        _Istream_Rwidth wdi( unsigned int rwd, string_res & s ) { return (_Istream_Rwidth)@{ .s = &s, { {.scanset = 0p}, .wd = rwd, {.flags.rwd = true} } }; }
    149149        _Istream_Rstr getline( string_res & s, const char delimiter = '\n' ) {
    150 //              return (_Istream_Rstr)@{ { .s = &s, { {.delimiters = { delimiter, '\0' } }, .wd = -1, {.flags.delimiter = true} } } };
    151150                return (_Istream_Rstr)@{ .s = &s, { {.delimiters = { delimiter, '\0' } }, .wd = -1, {.flags.delimiter = true} } };
    152151        }
Note: See TracChangeset for help on using the changeset viewer.