Index: libcfa/src/containers/string.cfa
===================================================================
--- libcfa/src/containers/string.cfa	(revision b5e725a08cfb0cd8ca08fc4c9afb6f82a6db8f82)
+++ libcfa/src/containers/string.cfa	(revision 62640874b77291f907b902d66d66ebba2c774f15)
@@ -10,6 +10,6 @@
 // Created On       : Fri Sep 03 11:00:00 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 12 15:24:18 2023
-// Update Count     : 6
+// Last Modified On : Sun Aug 13 22:50:08 2023
+// Update Count     : 7
 //
 
@@ -55,5 +55,5 @@
 }
 
-void ?{}( string & this, const char* buffer, size_t bsize) {
+void ?{}( string & this, const char * buffer, size_t bsize) {
     (this.inner) { malloc() };
     ?{}( *this.inner, buffer, bsize );
@@ -110,8 +110,11 @@
 }
 
-ifstream & ?|?(ifstream &in, string &this) {
+ifstream & ?|?(ifstream & in, string & this) {
     return in | (*this.inner); // read to internal string_res
 }
 
+void ?|?( ifstream & in, string & this ) {
+    (ifstream &)(in | this); ends( in );
+}
 
 ////////////////////////////////////////////////////////
@@ -131,17 +134,17 @@
 // Comparison
 
-bool ?==?(const string &s, const string &other) {
+bool ?==?(const string & s, const string & other) {
     return *s.inner == *other.inner;
 }
 
-bool ?!=?(const string &s, const string &other) {
+bool ?!=?(const string & s, const string & other) {
     return *s.inner != *other.inner;
 }
 
-bool ?==?(const string &s, const char* other) {
+bool ?==?(const string & s, const char * other) {
     return *s.inner == other;
 }
 
-bool ?!=?(const string &s, const char* other) {
+bool ?!=?(const string & s, const char * other) {
     return *s.inner != other;
 }
@@ -150,5 +153,5 @@
 // Getter
 
-size_t size(const string &s) {
+size_t size(const string & s) {
     return size( * s.inner );
 }
@@ -157,17 +160,17 @@
 // Concatenation
 
-void ?+=?(string &s, char other) {
+void ?+=?(string & s, char other) {
     (*s.inner) += other;
 }
 
-void ?+=?(string &s, const string &s2) {
+void ?+=?(string & s, const string & s2) {
     (*s.inner) += (*s2.inner);
 }
 
-void ?+=?(string &s, const char* other) {
+void ?+=?(string & s, const char * other) {
     (*s.inner) += other;
 }
 
-string ?+?(const string &s, char other) {
+string ?+?(const string & s, char other) {
     string ret = s;
     ret += other;
@@ -175,5 +178,5 @@
 }
 
-string ?+?(const string &s, const string &s2) {
+string ?+?(const string & s, const string & s2) {
     string ret = s;
     ret += s2;
@@ -181,5 +184,5 @@
 }
 
-string ?+?(const char* s1, const char* s2) {
+string ?+?(const char * s1, const char * s2) {
     string ret = s1;
     ret += s2;
@@ -187,5 +190,5 @@
 }
 
-string ?+?(const string &s, const char* other) {
+string ?+?(const string & s, const char * other) {
     string ret = s;
     ret += other;
@@ -196,5 +199,5 @@
 // Repetition
 
-string ?*?(const string &s, size_t factor) {
+string ?*?(const string & s, size_t factor) {
     string ret = "";
     for (factor) ret += s;
@@ -216,9 +219,9 @@
 // Character access
 
-char ?[?](const string &s, size_t index) {
+char ?[?](const string & s, size_t index) {
     return (*s.inner)[index];
 }
 
-string ?[?](string &s, size_t index) {
+string ?[?](string & s, size_t index) {
     string ret = { *s.inner, index, index + 1 };
     return ret`shareEdits;
@@ -228,73 +231,73 @@
 // Search
 
-bool contains(const string &s, char ch) {
+bool contains(const string & s, char ch) {
     return contains( *s.inner, ch );
 }
 
-int find(const string &s, char search) {
+int find(const string & s, char search) {
     return find( *s.inner, search );
 }
 
-int find(const string &s, const string &search) {
+int find(const string & s, const string & search) {
     return find( *s.inner, *search.inner );
 }
 
-int find(const string &s, const char* search) {
+int find(const string & s, const char * search) {
     return find( *s.inner, search);
 }
 
-int find(const string &s, const char* search, size_t searchsize) {
+int find(const string & s, const char * search, size_t searchsize) {
     return find( *s.inner, search, searchsize);
 }
 
-int findFrom(const string &s, size_t fromPos, char search) {
+int findFrom(const string & s, size_t fromPos, char search) {
     return findFrom( *s.inner, fromPos, search );
 }
 
-int findFrom(const string &s, size_t fromPos, const string &search) {
+int findFrom(const string & s, size_t fromPos, const string & search) {
     return findFrom( *s.inner, fromPos, *search.inner );
 }
 
-int findFrom(const string &s, size_t fromPos, const char* search) {
+int findFrom(const string & s, size_t fromPos, const char * search) {
     return findFrom( *s.inner, fromPos, search );
 }
 
-int findFrom(const string &s, size_t fromPos, const char* search, size_t searchsize) {
+int findFrom(const string & s, size_t fromPos, const char * search, size_t searchsize) {
     return findFrom( *s.inner, fromPos, search, searchsize );
 }
 
-bool includes(const string &s, const string &search) {
+bool includes(const string & s, const string & search) {
     return includes( *s.inner, *search.inner );
 }
 
-bool includes(const string &s, const char* search) {
+bool includes(const string & s, const char * search) {
     return includes( *s.inner, search );
 }
 
-bool includes(const string &s, const char* search, size_t searchsize) {
+bool includes(const string & s, const char * search, size_t searchsize) {
     return includes( *s.inner, search, searchsize );
 }
 
-bool startsWith(const string &s, const string &prefix) {
+bool startsWith(const string & s, const string & prefix) {
     return startsWith( *s.inner, *prefix.inner );
 }
 
-bool startsWith(const string &s, const char* prefix) {
+bool startsWith(const string & s, const char * prefix) {
     return startsWith( *s.inner, prefix );
 }
 
-bool startsWith(const string &s, const char* prefix, size_t prefixsize) {
+bool startsWith(const string & s, const char * prefix, size_t prefixsize) {
     return startsWith( *s.inner, prefix, prefixsize );
 }
 
-bool endsWith(const string &s, const string &suffix) {
+bool endsWith(const string & s, const string & suffix) {
     return endsWith( *s.inner, *suffix.inner );
 }
 
-bool endsWith(const string &s, const char* suffix) {
+bool endsWith(const string & s, const char * suffix) {
     return endsWith( *s.inner, suffix );
 }
 
-bool endsWith(const string &s, const char* suffix, size_t suffixsize) {
+bool endsWith(const string & s, const char * suffix, size_t suffixsize) {
     return endsWith( *s.inner, suffix, suffixsize );
 }
@@ -326,18 +329,18 @@
 
 
-int exclude(const string &s, const charclass &mask) {
+int exclude(const string & s, const charclass & mask) {
     return exclude( *s.inner, *mask.inner );
 }
 /*
-StrSlice exclude(string &s, const charclass &mask) {
+StrSlice exclude(string & s, const charclass & mask) {
 }
 */
 
-int include(const string &s, const charclass &mask) {
+int include(const string & s, const charclass & mask) {
     return include( *s.inner, *mask.inner );
 }
 
 /*
-StrSlice include(string &s, const charclass &mask) {
+StrSlice include(string & s, const charclass & mask) {
 }
 */
Index: libcfa/src/containers/string.hfa
===================================================================
--- libcfa/src/containers/string.hfa	(revision b5e725a08cfb0cd8ca08fc4c9afb6f82a6db8f82)
+++ libcfa/src/containers/string.hfa	(revision 62640874b77291f907b902d66d66ebba2c774f15)
@@ -9,7 +9,7 @@
 // Author           : Michael L. Brooks
 // Created On       : Fri Sep 03 11:00:00 2021
-// Last Modified By : Michael L. Brooks
-// Last Modified On : Fri Sep 03 11:00:00 2021
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Aug 13 22:46:46 2023
+// Update Count     : 4
 //
 
@@ -28,20 +28,20 @@
 
 // Getters
-size_t size(const string &s);
+size_t size(const string & s);
 
 // RAII, assignment
-void ?{}( string & this ); // empty string
-void ?{}(string &s, const char* initial); // copy from string literal (NULL-terminated)
-void ?{}(string &s, const char* buffer, size_t bsize); // copy specific length from buffer
+void ?{}(string & this); // empty string
+void ?{}(string & s, const char * initial); // copy from string literal (NULL-terminated)
+void ?{}(string & s, const char * buffer, size_t bsize); // copy specific length from buffer
 
-void ?{}(string &s, const string & s2);
-void ?{}(string &s, string & s2);
+void ?{}(string & s, const string & s2);
+void ?{}(string & s, string & s2);
 
-void ?=?(string &s, const char* other); // copy assignment from literal
-void ?=?(string &s, const string &other);
-void ?=?(string &s, char other);
-string & ?=?(string &s, string &other);  // surprising ret seems to help avoid calls to autogen
+void ?=?(string & s, const char * other); // copy assignment from literal
+void ?=?(string & s, const string & other);
+void ?=?(string & s, char other);
+string & ?=?(string & s, string & other);  // surprising ret seems to help avoid calls to autogen
 //string ?=?( string &, string ) = void;
-void ^?{}(string &s);
+void ^?{}(string & s);
 
 // Alternate construction: request shared edits
@@ -53,32 +53,33 @@
 
 // IO Operator
-ofstream & ?|?(ofstream &out, const string &s);
-void ?|?(ofstream &out, const string &s);
-ifstream & ?|?(ifstream &in, string &s);
+ofstream & ?|?(ofstream & out, const string & s);
+void ?|?(ofstream & out, const string & s);
+ifstream & ?|?(ifstream & in, string & s);
+void ?|?( ifstream & in, string & this );
 
 // Concatenation
-void ?+=?(string &s, char other); // append a character
-void ?+=?(string &s, const string &s2); // append-concatenate to first string
-void ?+=?(string &s, const char* other); // append-concatenate to first string
-string ?+?(const string &s, char other); // add a character to a copy of the string
-string ?+?(const string &s, const string &s2); // copy and concatenate both strings
-string ?+?(const char* s1, const char* s2); // concatenate both strings
-string ?+?(const string &s, const char* other); // copy and concatenate with NULL-terminated string
+void ?+=?(string & s, char other); // append a character
+void ?+=?(string & s, const string & s2); // append-concatenate to first string
+void ?+=?(string & s, const char * other); // append-concatenate to first string
+string ?+?(const string & s, char other); // add a character to a copy of the string
+string ?+?(const string & s, const string & s2); // copy and concatenate both strings
+string ?+?(const char * s1, const char * s2); // concatenate both strings
+string ?+?(const string & s, const char * other); // copy and concatenate with NULL-terminated string
 
 // Repetition
-string ?*?(const string &s, size_t factor);
+string ?*?(const string & s, size_t factor);
 string ?*?(char c, size_t size);
 string ?*?(const char *s, size_t size);
 
 // Character access
-char ?[?](const string &s, size_t index);
-string ?[?](string &s, size_t index);  // mutable length-1 slice of original
-//char codePointAt(const string &s, size_t index);  // to revisit under Unicode
+char ?[?](const string & s, size_t index);
+string ?[?](string & s, size_t index);  // mutable length-1 slice of original
+//char codePointAt(const string & s, size_t index);  // to revisit under Unicode
 
 // Comparisons
-bool ?==?(const string &s, const string &other);
-bool ?!=?(const string &s, const string &other);
-bool ?==?(const string &s, const char* other);
-bool ?!=?(const string &s, const char* other);
+bool ?==?(const string & s, const string & other);
+bool ?!=?(const string & s, const string & other);
+bool ?==?(const string & s, const char * other);
+bool ?!=?(const string & s, const char * other);
 
 // Slicing
@@ -87,33 +88,33 @@
 
 // String search
-bool contains(const string &s, char ch); // single character
+bool contains(const string & s, char ch); // single character
 
-int find(const string &s, char search);
-int find(const string &s, const string &search);
-int find(const string &s, const char* search);
-int find(const string &s, const char* search, size_t searchsize);
+int find(const string & s, char search);
+int find(const string & s, const string & search);
+int find(const string & s, const char * search);
+int find(const string & s, const char * search, size_t searchsize);
 
-int findFrom(const string &s, size_t fromPos, char search);
-int findFrom(const string &s, size_t fromPos, const string &search);
-int findFrom(const string &s, size_t fromPos, const char* search);
-int findFrom(const string &s, size_t fromPos, const char* search, size_t searchsize);
+int findFrom(const string & s, size_t fromPos, char search);
+int findFrom(const string & s, size_t fromPos, const string & search);
+int findFrom(const string & s, size_t fromPos, const char * search);
+int findFrom(const string & s, size_t fromPos, const char * search, size_t searchsize);
 
-bool includes(const string &s, const string &search);
-bool includes(const string &s, const char* search);
-bool includes(const string &s, const char* search, size_t searchsize);
+bool includes(const string & s, const string & search);
+bool includes(const string & s, const char * search);
+bool includes(const string & s, const char * search, size_t searchsize);
 
-bool startsWith(const string &s, const string &prefix);
-bool startsWith(const string &s, const char* prefix);
-bool startsWith(const string &s, const char* prefix, size_t prefixsize);
+bool startsWith(const string & s, const string & prefix);
+bool startsWith(const string & s, const char * prefix);
+bool startsWith(const string & s, const char * prefix, size_t prefixsize);
 
-bool endsWith(const string &s, const string &suffix);
-bool endsWith(const string &s, const char* suffix);
-bool endsWith(const string &s, const char* suffix, size_t suffixsize);
+bool endsWith(const string & s, const string & suffix);
+bool endsWith(const string & s, const char * suffix);
+bool endsWith(const string & s, const char * suffix, size_t suffixsize);
 
 // Modifiers
-void padStart(string &s, size_t n);
-void padStart(string &s, size_t n, char padding);
-void padEnd(string &s, size_t n);
-void padEnd(string &s, size_t n, char padding);
+void padStart(string & s, size_t n);
+void padStart(string & s, size_t n, char padding);
+void padEnd(string & s, size_t n);
+void padEnd(string & s, size_t n, char padding);
 
 
@@ -132,13 +133,11 @@
 void ^?{}( charclass & );
 
-int include(const string &s, const charclass &mask);
+int include(const string & s, const charclass & mask);
 
-int exclude(const string &s, const charclass &mask);
+int exclude(const string & s, const charclass & mask);
 
 /*
 What to do with?
-StrRet include(string &s, const charclass &mask);
-StrRet exclude(string &s, const charclass &mask);
+StrRet include(string & s, const charclass & mask);
+StrRet exclude(string & s, const charclass & mask);
 */
-
-
