Changeset 737988b for libcfa


Ignore:
Timestamp:
Sep 5, 2023, 4:22:53 PM (16 months ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
master
Children:
efe39bb
Parents:
ff56dd2e
Message:

Deduplicate manipulator read-to-string by delegating from string to string_res.

File:
1 edited

Legend:

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

    rff56dd2e r737988b  
    129129
    130130void ?|?( ifstream & in, string & this ) {
    131     (ifstream &)(in | this); ends( in );
     131    in | (*this.inner);
    132132}
    133133
    134134ifstream & ?|?( ifstream & is, _Istream_Sstr f ) {
    135         // .---------------,
    136         // | | | | |...|0|0| null terminator and guard if missing
    137         // `---------------'
    138         enum { gwd = 128 + 1, wd = gwd - 1 };                           // guard and unguard width
    139         char cstr[gwd];                                                                         // read in chunks
    140         bool cont = false;
    141 
    142         _Istream_Cstr cf = { cstr, (_Istream_str_base)f };
    143         if ( ! cf.flags.rwd ) cf.wd = wd;
    144 
    145         cstr[wd] = '\0';                                                                        // guard null terminate string
    146         try {
    147                 is | cf;
    148         } catch( cstring_length * ) {
    149                 cont = true;
    150         } finally {
    151         if ( ! cf.flags.ignore ) f.s = cstr;                    // ok to initialize string
    152         } // try
    153         for ( ; cont; )  {                                                                      // overflow read ?
    154                 cont = false;
    155                 try {
    156                         is | cf;
    157                 } catch( cstring_length * ) {
    158                         cont = true;                                                            // continue not allowed
    159                 } finally {
    160                         if ( ! cf.flags.ignore ) f.s += cstr;           // build string chunk at a time
    161                 } // try
    162         } // for
    163         return is;
     135        _Istream_Rstr f2 = {f.s.inner, (_Istream_str_base)f};
     136    return is | f2;
    164137} // ?|?
    165138
Note: See TracChangeset for help on using the changeset viewer.