@@ -179,7 +179,7 @@ pub const RocStr = extern struct {
179
179
180
180
pub fn eq (self : RocStr , other : RocStr ) bool {
181
181
// If they are byte-for-byte equal, they're definitely equal!
182
- if (self .bytes == other .bytes and self .length == other .length and self . capacity_or_alloc_ptr == other . capacity_or_alloc_ptr ) {
182
+ if (self .bytes == other .bytes and self .length == other .length ) {
183
183
return true ;
184
184
}
185
185
@@ -2195,6 +2195,134 @@ test "withAsciiLowercased: seamless slice" {
2195
2195
try expect (str_result .eq (expected ));
2196
2196
}
2197
2197
2198
+ // Str.with_ascii_uppercased
2199
+ pub fn strWithAsciiUppercased (string : RocStr ) callconv (.C ) RocStr {
2200
+ var new_str = if (string .isUnique ())
2201
+ string
2202
+ else blk : {
2203
+ string .decref ();
2204
+ break :blk RocStr .fromSlice (string .asSlice ());
2205
+ };
2206
+
2207
+ const new_str_bytes = new_str .asU8ptrMut ()[0.. string .len ()];
2208
+ for (new_str_bytes ) | * c | {
2209
+ c .* = ascii .toUpper (c .* );
2210
+ }
2211
+ return new_str ;
2212
+ }
2213
+
2214
+ test "withAsciiUppercased: small str" {
2215
+ const original = RocStr .fromSlice ("coffé" );
2216
+ try expect (original .isSmallStr ());
2217
+
2218
+ const expected = RocStr .fromSlice ("COFFé" );
2219
+ defer expected .decref ();
2220
+
2221
+ const str_result = strWithAsciiUppercased (original );
2222
+ defer str_result .decref ();
2223
+
2224
+ try expect (str_result .isSmallStr ());
2225
+ try expect (str_result .eq (expected ));
2226
+ }
2227
+
2228
+ test "withAsciiUppercased: non small str" {
2229
+ const original = RocStr .fromSlice ("coffé coffé coffé coffé coffé coffé" );
2230
+ defer original .decref ();
2231
+ try expect (! original .isSmallStr ());
2232
+
2233
+ const expected = RocStr .fromSlice ("COFFé COFFé COFFé COFFé COFFé COFFé" );
2234
+ defer expected .decref ();
2235
+
2236
+ const str_result = strWithAsciiUppercased (original );
2237
+
2238
+ try expect (! str_result .isSmallStr ());
2239
+ try expect (str_result .eq (expected ));
2240
+ }
2241
+
2242
+ test "withAsciiUppercased: seamless slice" {
2243
+ const l = RocStr .fromSlice ("coffé coffé coffé coffé coffé coffé" );
2244
+ const original = substringUnsafeC (l , 1 , l .len () - 1 );
2245
+ defer original .decref ();
2246
+
2247
+ try expect (original .isSeamlessSlice ());
2248
+
2249
+ const expected = RocStr .fromSlice ("OFFé COFFé COFFé COFFé COFFé COFFé" );
2250
+ defer expected .decref ();
2251
+
2252
+ const str_result = strWithAsciiUppercased (original );
2253
+
2254
+ try expect (! str_result .isSmallStr ());
2255
+ try expect (str_result .eq (expected ));
2256
+ }
2257
+
2258
+ pub fn strCaselessAsciiEquals (self : RocStr , other : RocStr ) callconv (.C ) bool {
2259
+ if (self .bytes == other .bytes and self .length == other .length ) {
2260
+ return true ;
2261
+ }
2262
+
2263
+ return ascii .eqlIgnoreCase (self .asSlice (), other .asSlice ());
2264
+ }
2265
+
2266
+ test "caselessAsciiEquals: same str" {
2267
+ const str1 = RocStr .fromSlice ("coFféÉ" );
2268
+ defer str1 .decref ();
2269
+
2270
+ const are_equal = strCaselessAsciiEquals (str1 , str1 );
2271
+ try expect (are_equal );
2272
+ }
2273
+
2274
+ test "caselessAsciiEquals: differently capitalized non-ascii char" {
2275
+ const str1 = RocStr .fromSlice ("coffé" );
2276
+ defer str1 .decref ();
2277
+ try expect (str1 .isSmallStr ());
2278
+
2279
+ const str2 = RocStr .fromSlice ("coffÉ" );
2280
+ defer str2 .decref ();
2281
+
2282
+ const are_equal = strCaselessAsciiEquals (str1 , str2 );
2283
+ try expect (! are_equal );
2284
+ }
2285
+
2286
+ test "caselessAsciiEquals: small str" {
2287
+ const str1 = RocStr .fromSlice ("coffé" );
2288
+ defer str1 .decref ();
2289
+ try expect (str1 .isSmallStr ());
2290
+
2291
+ const str2 = RocStr .fromSlice ("COFFé" );
2292
+ defer str2 .decref ();
2293
+
2294
+ const are_equal = strCaselessAsciiEquals (str1 , str2 );
2295
+ try expect (are_equal );
2296
+ }
2297
+
2298
+ test "caselessAsciiEquals: non small str" {
2299
+ const str1 = RocStr .fromSlice ("coffé coffé coffé coffé coffé coffé" );
2300
+ defer str1 .decref ();
2301
+ try expect (! str1 .isSmallStr ());
2302
+
2303
+ const str2 = RocStr .fromSlice ("COFFé COFFé COFFé COFFé COFFé COFFé" );
2304
+ defer str2 .decref ();
2305
+
2306
+ const are_equal = strCaselessAsciiEquals (str1 , str2 );
2307
+
2308
+ try expect (are_equal );
2309
+ }
2310
+
2311
+ test "caselessAsciiEquals: seamless slice" {
2312
+ const l = RocStr .fromSlice ("coffé coffé coffé coffé coffé coffé" );
2313
+ const str1 = substringUnsafeC (l , 1 , l .len () - 1 );
2314
+ defer str1 .decref ();
2315
+
2316
+ try expect (str1 .isSeamlessSlice ());
2317
+
2318
+ const str2 = RocStr .fromSlice ("OFFé COFFé COFFé COFFé COFFé COFFé" );
2319
+ defer str2 .decref ();
2320
+
2321
+ const are_equal = strCaselessAsciiEquals (str1 , str2 );
2322
+
2323
+ try expect (are_equal );
2324
+ }
2325
+
2198
2326
fn rcNone (_ : ? [* ]u8 ) callconv (.C ) void {}
2199
2327
2200
2328
fn decStr (ptr : ? [* ]u8 ) callconv (.C ) void {
0 commit comments