Skip to content

Commit 68f0816

Browse files
committed
[stdlib] Add withContiguousStorageIfAvailable to SubString.UTF8View
Due to an oversight it seems that we never added a withContigousStorageIfAvailable implementation to SubString.UTF8View, which meant that if you sliced a String you lost the ability to get fast access to the backing storage. There's no good reason for this functionality to be missing, so this patch adds it in by delegating to the Slice implementation. Resolves SR-11999.
1 parent 4a9fc98 commit 68f0816

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)