source: libcfa/src/collections/string.cfa@ 65b851a

Last change on this file since 65b851a was f2898df, checked in by Michael Brooks <mlbrooks@…>, 20 months ago

Implement string initialization and assignment from various numeric types

  • Property mode set to 100644
File size: 11.5 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// string -- variable-length, mutable run of text, with value semantics
8//
9// Author : Michael L. Brooks
10// Created On : Fri Sep 03 11:00:00 2021
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Sun Jan 14 12:03:47 2024
13// Update Count : 240
14//
15
16#include "string.hfa"
17#include "string_res.hfa"
18#include <stdlib.hfa>
19
20#pragma GCC visibility push(default)
21
22/*
23Implementation Principle: typical operation translates to the equivalent
24operation on `inner`. Exceptions are implementing new RAII pattern for value
25semantics and some const-hell handling.
26*/
27
28////////////////////////////////////////////////////////
29// string RAII
30
31// private (not in header)
32static void ?{}( string & s, string_res & src, size_t start, size_t len ) {
33 (s.inner) { malloc() };
34 ?{}( *s.inner, src, SHARE_EDITS, start, len );
35}
36
37void ?{}( string & s ) {
38 (s.inner) { malloc() };
39 ?{}( *s.inner );
40}
41
42void ?{}( string & s, const string & c ) {
43 (s.inner) { malloc() };
44 ?{}( *s.inner, *c.inner, COPY_VALUE );
45}
46
47void ?{}( string & s, const string & s2, size_t maxlen) {
48 (s.inner) { malloc() };
49 ?{}( *s.inner, *s2.inner, COPY_VALUE, maxlen );
50}
51
52
53void ?{}( string & s, string & c ) {
54 ?{}( s, (const string &) c );
55}
56
57void ?{}( string & s, const char c ) {
58 (s.inner) { malloc() };
59 ?{}( *s.inner, c );
60}
61
62void ?{}( string & s, const char * c ) {
63 (s.inner) { malloc() };
64 ?{}( *s.inner, c );
65}
66
67void ?{}( string & s, const char * c, size_t size) {
68 (s.inner) { malloc() };
69 ?{}( *s.inner, c, size );
70}
71
72void ?{}( string & s, ssize_t rhs ) {
73 (s.inner) { malloc() };
74 ?{}( *s.inner, rhs );
75}
76
77void ?{}( string & s, size_t rhs ) {
78 (s.inner) { malloc() };
79 ?{}( *s.inner, rhs );
80}
81
82void ?{}( string & s, double rhs ) {
83 (s.inner) { malloc() };
84 ?{}( *s.inner, rhs );
85}
86
87void ?{}( string & s, long double rhs ) {
88 (s.inner) { malloc() };
89 ?{}( *s.inner, rhs );
90}
91
92void ?{}( string & s, double _Complex rhs ) {
93 (s.inner) { malloc() };
94 ?{}( *s.inner, rhs );
95}
96
97void ?{}( string & s, long double _Complex rhs ) {
98 (s.inner) { malloc() };
99 ?{}( *s.inner, rhs );
100}
101
102void ^?{}( string & s ) {
103 ^(*s.inner){};
104 free( s.inner );
105 s.inner = 0p;
106}
107
108////////////////////////////////////////////////////////
109// Alternate construction: request shared edits
110
111string_WithSharedEdits ?`shareEdits( string & s ) {
112 string_WithSharedEdits ret = { &s };
113 return ret;
114}
115
116void ?{}( string & s, string_WithSharedEdits src ) {
117 ?{}( s, *src.s->inner, 0, src.s->inner->Handle.lnth);
118}
119
120////////////////////////////////////////////////////////
121// Assignment
122
123string & ?=?(string & s, const string & c) {
124 (*s.inner) = (*c.inner);
125 return s;
126}
127
128string & ?=?(string & s, string & c) {
129 (*s.inner) = (*c.inner);
130 return s;
131}
132
133string & ?=?( string & s, const char * val ) {
134 (*s.inner) = val;
135 return s;
136}
137
138string & ?=?( string & s, char val ) {
139 (*s.inner) = val;
140 return s;
141}
142
143string & assign(string & s, const string & c, size_t n) {
144 assign(*s.inner, *c.inner, n);
145 return s;
146}
147
148string & assign(string & s, const char * c, size_t n) {
149 assign(*s.inner, c, n);
150 return s;
151}
152
153string & ?=?( string & s, ssize_t rhs ) {
154 (*s.inner) = rhs;
155 return s;
156}
157
158string & ?=?( string & s, size_t rhs ) {
159 (*s.inner) = rhs;
160 return s;
161}
162
163string & ?=?( string & s, double rhs ) {
164 (*s.inner) = rhs;
165 return s;
166}
167
168string & ?=?( string & s, long double rhs ) {
169 (*s.inner) = rhs;
170 return s;
171}
172
173string & ?=?( string & s, double _Complex rhs ) {
174 (*s.inner) = rhs;
175 return s;
176}
177
178string & ?=?( string & s, long double _Complex rhs ) {
179 (*s.inner) = rhs;
180 return s;
181}
182
183////////////////////////////////////////////////////////
184// Input-Output
185
186ofstream & ?|?( ofstream & out, const string & s ) {
187 return out | (*s.inner); // print internal string_res
188}
189
190void ?|?( ofstream & out, const string & s ) {
191 (ofstream &)(out | (*s.inner)); ends( out );
192}
193
194ofstream & ?|?( ofstream & os, _Ostream_Manip(string) f ) {
195 size_t len = size( f.val );
196 char cstr[len + 1]; // room for null terminator
197 for ( i; len ) cstr[i] = f.val[i]; // copy string
198 cstr[len] = '\0'; // terminate
199 _Ostream_Manip(const char *) cf @= { cstr, f.wd, f.pc, f.base, {f.all} };
200 os | cf | nonl;
201 return os;
202} // ?|?
203
204void ?|?( ofstream & os, _Ostream_Manip(string) f ) {
205 (ofstream &)(os | f); ends( os );
206}
207
208ifstream & ?|?(ifstream & in, string & s) {
209 return in | (*s.inner); // read to internal string_res
210}
211
212void ?|?( ifstream & in, string & s ) {
213 in | (*s.inner);
214}
215
216ifstream & ?|?( ifstream & is, _Istream_Sstr f ) {
217 _Istream_Rstr f2 = {f.s.inner, (_Istream_str_base)f};
218 return is | f2;
219} // ?|?
220
221void ?|?( ifstream & in, _Istream_Sstr f ) {
222 (ifstream &)(in | f);
223}
224
225////////////////////////////////////////////////////////
226// Slicing
227
228string ?()( string & s, size_t start, size_t len ) {
229 string ret = { *s.inner, start, len };
230 return ret`shareEdits;
231}
232
233string ?()( string & s, size_t start ) {
234 string ret = { *s.inner, start, size( s ) - start };
235 return ret`shareEdits;
236}
237
238////////////////////////////////////////////////////////
239// Comparison
240
241int strcmp(const string & s1, const string & s2) { return strcmp(*s1.inner, *s2.inner); }
242bool ?==?(const string & s1, const string & s2) { return *s1.inner == *s2.inner; }
243bool ?!=?(const string & s1, const string & s2) { return *s1.inner != *s2.inner; }
244bool ?>? (const string & s1, const string & s2) { return *s1.inner > *s2.inner; }
245bool ?>=?(const string & s1, const string & s2) { return *s1.inner >= *s2.inner; }
246bool ?<=?(const string & s1, const string & s2) { return *s1.inner <= *s2.inner; }
247bool ?<? (const string & s1, const string & s2) { return *s1.inner < *s2.inner; }
248
249int strcmp(const string & s1, const char * s2) { return strcmp(*s1.inner, s2 ); }
250bool ?==?(const string & s1, const char * s2) { return *s1.inner == s2; }
251bool ?!=?(const string & s1, const char * s2) { return *s1.inner != s2; }
252bool ?>? (const string & s1, const char * s2) { return *s1.inner > s2; }
253bool ?>=?(const string & s1, const char * s2) { return *s1.inner >= s2; }
254bool ?<=?(const string & s1, const char * s2) { return *s1.inner <= s2; }
255bool ?<? (const string & s1, const char * s2) { return *s1.inner < s2; }
256
257int strcmp(const char * s1, const string & s2) { return strcmp( s1, *s2.inner); }
258bool ?==?(const char * s1, const string & s2) { return s1 == *s2.inner; }
259bool ?!=?(const char * s1, const string & s2) { return s1 != *s2.inner; }
260bool ?>? (const char * s1, const string & s2) { return s1 > *s2.inner; }
261bool ?>=?(const char * s1, const string & s2) { return s1 >= *s2.inner; }
262bool ?<=?(const char * s1, const string & s2) { return s1 <= *s2.inner; }
263bool ?<? (const char * s1, const string & s2) { return s1 < *s2.inner; }
264
265
266////////////////////////////////////////////////////////
267// Getter
268
269size_t size(const string & s) {
270 return size( *s.inner );
271}
272
273////////////////////////////////////////////////////////
274// Concatenation
275
276void ?+=?(string & s, char c) {
277 (*s.inner) += c;
278}
279
280void ?+=?(string & s, const string & s2) {
281 (*s.inner) += (*s2.inner);
282}
283
284void append(string & s, const string & s2, size_t maxlen) {
285 append( (*s.inner), (*s2.inner), maxlen );
286}
287
288void ?+=?(string & s, const char * c) {
289 (*s.inner) += c;
290}
291
292void append(string & s, const char * buffer, size_t bsize) {
293 append( (*s.inner), buffer, bsize );
294}
295
296string ?+?(const string & s, char c) {
297 string ret = s;
298 ret += c;
299 return ret;
300}
301
302string ?+?(const string & s, const string & s2) {
303 string ret = s;
304 ret += s2;
305 return ret;
306}
307
308string ?+?(const char * s1, const char * s2) {
309 string ret = s1;
310 ret += s2;
311 return ret;
312}
313
314string ?+?(const string & s, const char * c) {
315 string ret = s;
316 ret += c;
317 return ret;
318}
319
320////////////////////////////////////////////////////////
321// Repetition
322
323void ?*=?(string & s, size_t factor) {
324 (*s.inner) *= factor;
325}
326
327string ?*?(const string & s, size_t factor) {
328 string ret = s;
329 ret *= factor;
330 return ret;
331}
332
333string ?*?(char c, size_t factor) {
334 string ret = c;
335 ret *= factor;
336 return ret;
337}
338
339string ?*?(const char * s, size_t factor) {
340 string ret = s;
341 ret *= factor;
342 return ret;
343}
344
345////////////////////////////////////////////////////////
346// Character access
347
348char ?[?](const string & s, size_t index) {
349 return (*s.inner)[index];
350}
351
352string ?[?](string & s, size_t index) {
353 string ret = { *s.inner, index, 1 };
354 return ret`shareEdits;
355}
356
357////////////////////////////////////////////////////////
358// Search
359
360bool contains(const string & s, char ch) {
361 return contains( *s.inner, ch );
362}
363
364int find(const string & s, char search) {
365 return find( *s.inner, search );
366}
367
368int find(const string & s, const string & search) {
369 return find( *s.inner, *search.inner );
370}
371
372int find(const string & s, const char * search) {
373 return find( *s.inner, search);
374}
375
376int find(const string & s, const char * search, size_t searchsize) {
377 return find( *s.inner, search, searchsize);
378}
379
380int findFrom(const string & s, size_t fromPos, char search) {
381 return findFrom( *s.inner, fromPos, search );
382}
383
384int findFrom(const string & s, size_t fromPos, const string & search) {
385 return findFrom( *s.inner, fromPos, *search.inner );
386}
387
388int findFrom(const string & s, size_t fromPos, const char * search) {
389 return findFrom( *s.inner, fromPos, search );
390}
391
392int findFrom(const string & s, size_t fromPos, const char * search, size_t searchsize) {
393 return findFrom( *s.inner, fromPos, search, searchsize );
394}
395
396bool includes(const string & s, const string & search) {
397 return includes( *s.inner, *search.inner );
398}
399
400bool includes(const string & s, const char * search) {
401 return includes( *s.inner, search );
402}
403
404bool includes(const string & s, const char * search, size_t searchsize) {
405 return includes( *s.inner, search, searchsize );
406}
407
408bool startsWith(const string & s, const string & prefix) {
409 return startsWith( *s.inner, *prefix.inner );
410}
411
412bool startsWith(const string & s, const char * prefix) {
413 return startsWith( *s.inner, prefix );
414}
415
416bool startsWith(const string & s, const char * prefix, size_t prefixsize) {
417 return startsWith( *s.inner, prefix, prefixsize );
418}
419
420bool endsWith(const string & s, const string & suffix) {
421 return endsWith( *s.inner, *suffix.inner );
422}
423
424bool endsWith(const string & s, const char * suffix) {
425 return endsWith( *s.inner, suffix );
426}
427
428bool endsWith(const string & s, const char * suffix, size_t suffixsize) {
429 return endsWith( *s.inner, suffix, suffixsize );
430}
431
432
433///////////////////////////////////////////////////////////////////////////
434// charclass, include, exclude
435
436void ?{}( charclass & s, const string & chars) {
437 (s.inner) { malloc() };
438 ?{}( *s.inner, *(const string_res *)chars.inner );
439}
440
441void ?{}( charclass & s, const char * chars ) {
442 (s.inner) { malloc() };
443 ?{}( *s.inner, chars );
444}
445
446void ?{}( charclass & s, const char * chars, size_t charssize ) {
447 (s.inner) { malloc() };
448 ?{}( *s.inner, chars, charssize );
449}
450
451void ^?{}( charclass & s ) {
452 ^(*s.inner){};
453 free( s.inner );
454 s.inner = 0p;
455}
456
457
458int exclude(const string & s, const charclass & mask) {
459 return exclude( *s.inner, *mask.inner );
460}
461/*
462StrSlice exclude(string & s, const charclass & mask) {
463}
464*/
465
466int include(const string & s, const charclass & mask) {
467 return include( *s.inner, *mask.inner );
468}
469
470/*
471StrSlice include(string & s, const charclass & mask) {
472}
473*/
474
Note: See TracBrowser for help on using the repository browser.