Skip to content

Commit 6209c97

Browse files
authored
Merge pull request #29094 from Lukasa/cb-substring-fast-access
[stdlib] Add withContiguousStorageIfAvailable to SubString.UTF8View
2 parents aba9c8b + 68f0816 commit 6209c97

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

stdlib/public/core/Substring.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,13 @@ extension Substring.UTF8View: BidirectionalCollection {
389389
return _slice.distance(from: start, to: end)
390390
}
391391

392+
@_alwaysEmitIntoClient
393+
public func withContiguousStorageIfAvailable<R>(
394+
_ body: (UnsafeBufferPointer<Element>) throws -> R
395+
) rethrows -> R? {
396+
return try _slice.withContiguousStorageIfAvailable(body)
397+
}
398+
392399
@inlinable
393400
public func _failEarlyRangeCheck(_ index: Index, bounds: Range<Index>) {
394401
_slice._failEarlyRangeCheck(index, bounds: bounds)

test/stdlib/subString.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,19 @@ func checkMatch<S: Collection, T: Collection>(_ x: S, _ y: T, _ i: S.Index)
1212
expectEqual(x[i], y[i])
1313
}
1414

15+
func checkMatchContiguousStorage<S: Collection, T: Collection>(_ x: S, _ y: T)
16+
where S.Element == T.Element, S.Element: Equatable
17+
{
18+
let xElement = x.withContiguousStorageIfAvailable { $0.first }
19+
let yElement = y.withContiguousStorageIfAvailable { $0.first }
20+
expectEqual(xElement, yElement)
21+
}
22+
23+
func checkHasContiguousStorage<S: Collection>(_ x: S) {
24+
let hasStorage = x.withContiguousStorageIfAvailable { _ in true } ?? false
25+
expectTrue(hasStorage)
26+
}
27+
1528
SubstringTests.test("Equality") {
1629
let s = "abcdefg"
1730
let s1 = s[s.index(s.startIndex, offsetBy: 2) ..<
@@ -228,6 +241,13 @@ SubstringTests.test("UTF8View") {
228241
expectEqual("", String(t.dropLast(100))!)
229242
expectEqual("", String(u.dropFirst(100))!)
230243
expectEqual("", String(u.dropLast(100))!)
244+
245+
checkHasContiguousStorage(s.utf8)
246+
checkHasContiguousStorage(t)
247+
checkHasContiguousStorage(u)
248+
checkMatchContiguousStorage(Array(s.utf8), s.utf8)
249+
checkMatchContiguousStorage(Array(t), t)
250+
checkMatchContiguousStorage(Array(u), u)
231251
}
232252
}
233253

0 commit comments

Comments
 (0)