@@ -29,6 +29,7 @@ public let SubstringTest = [
29
29
BenchmarkInfo ( name: " SubstringEquatable " , runFunction: run_SubstringEquatable, tags: [ . validation, . api, . String] ) ,
30
30
BenchmarkInfo ( name: " SubstringFromLongString " , runFunction: run_SubstringFromLongString, tags: [ . validation, . api, . String] ) ,
31
31
BenchmarkInfo ( name: " SubstringFromLongStringGeneric " , runFunction: run_SubstringFromLongStringGeneric, tags: [ . validation, . api, . String] ) ,
32
+ BenchmarkInfo ( name: " SubstringTrimmingASCIIWhitespace " , runFunction: run_SubstringTrimmingASCIIWhitespace, tags: [ . validation, . api, . String] ) ,
32
33
]
33
34
34
35
// A string that doesn't fit in small string storage and doesn't fit in Latin-1
@@ -267,6 +268,38 @@ public func run_SubstringComparable(_ N: Int) {
267
268
CheckResults ( count == N*500)
268
269
}
269
270
271
+ extension Character {
272
+ fileprivate var isASCIIWhitespace : Bool {
273
+ return self == " " || self == " \t " || self == " \r " || self == " \n " || self == " \r \n "
274
+ }
275
+ }
276
+
277
+ extension Substring {
278
+ fileprivate func trimWhitespace( ) -> Substring {
279
+ var me = self
280
+ while me. first? . isASCIIWhitespace == . some( true ) {
281
+ me = me. dropFirst ( )
282
+ }
283
+ while me. last? . isASCIIWhitespace == . some( true ) {
284
+ me = me. dropLast ( )
285
+ }
286
+ return me
287
+ }
288
+ }
289
+
290
+ let _trimmableSubstrings = " pineapple,🍍, pineapple \t , \r \n \r \n \r \n , 🍍 , " . split ( separator: " , " )
291
+
292
+ @inline ( never)
293
+ public func run_SubstringTrimmingASCIIWhitespace( _ N: Int ) {
294
+ let substrings = _trimmableSubstrings // bringing this alias from above
295
+ var count = 0
296
+ for _ in 1 ... N*100 {
297
+ for substring in substrings {
298
+ blackHole ( substring. trimWhitespace ( ) )
299
+ }
300
+ }
301
+ }
302
+
270
303
/*
271
304
func checkLess<T, U>(_ x: T, _ y: U)
272
305
where T : StringProtocol, U : StringProtocol {
0 commit comments