Skip to content

Commit 807b543

Browse files
authored
Merge pull request swiftlang#77688 from glessard/span-gardening
[stdlib] Span gardening
2 parents 3dfee33 + 9084af1 commit 807b543

File tree

2 files changed

+8
-86
lines changed

2 files changed

+8
-86
lines changed

stdlib/public/core/Span/RawSpan.swift

+1-2
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,6 @@ extension RawSpan {
426426
@available(SwiftStdlib 6.1, *)
427427
extension RawSpan {
428428

429-
//FIXME: mark closure parameter as non-escaping
430429
/// Calls the given closure with a pointer to the underlying bytes of
431430
/// the viewed contiguous storage.
432431
///
@@ -633,7 +632,7 @@ extension RawSpan {
633632
}
634633
}
635634

636-
//MARK: one-sided slicing operations
635+
//MARK: prefixes and suffixes
637636
@_disallowFeatureSuppression(NonescapableTypes)
638637
@available(SwiftStdlib 6.1, *)
639638
extension RawSpan {

stdlib/public/core/Span/Span.swift

+7-84
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ extension Span where Element: ~Copyable {
9595
public init(
9696
_unsafeElements buffer: borrowing UnsafeBufferPointer<Element>
9797
) {
98-
let baseAddress = buffer.baseAddress //FIXME: rdar://138665760
98+
//FIXME: Workaround for https://github.com/swiftlang/swift/issues/77235
99+
let baseAddress = buffer.baseAddress
99100
_precondition(
100101
((Int(bitPattern: baseAddress) &
101102
(MemoryLayout<Element>.alignment &- 1)) == 0),
@@ -204,7 +205,8 @@ extension Span where Element: BitwiseCopyable {
204205
public init(
205206
_unsafeBytes buffer: borrowing UnsafeRawBufferPointer
206207
) {
207-
let baseAddress = buffer.baseAddress //FIXME: rdar://138665760
208+
//FIXME: Workaround for https://github.com/swiftlang/swift/issues/77235
209+
let baseAddress = buffer.baseAddress
208210
_precondition(
209211
((Int(bitPattern: baseAddress) &
210212
(MemoryLayout<Element>.alignment &- 1)) == 0),
@@ -321,87 +323,6 @@ extension Span where Element: BitwiseCopyable {
321323
}
322324
}
323325

324-
@_disallowFeatureSuppression(NonescapableTypes)
325-
@available(SwiftStdlib 6.1, *)
326-
extension Span where Element: Equatable {
327-
328-
/// Returns a Boolean value indicating whether this and another span
329-
/// contain equal elements in the same order.
330-
///
331-
/// - Parameters:
332-
/// - other: A span to compare to this one.
333-
/// - Returns: `true` if this sequence and `other` contain equivalent items,
334-
/// using `areEquivalent` as the equivalence test; otherwise, `false.`
335-
///
336-
/// - Complexity: O(*m*), where *m* is the lesser of the length of the
337-
/// sequence and the length of `other`.
338-
@_disallowFeatureSuppression(NonescapableTypes)
339-
@_alwaysEmitIntoClient
340-
public func _elementsEqual(_ other: Self) -> Bool {
341-
guard count == other.count else { return false }
342-
if count == 0 { return true }
343-
344-
// This could be short-cut with a layout constraint
345-
// where stride equals size, as long as there is
346-
// at most 1 unused bit pattern, e.g.:
347-
// if Element is BitwiseEquatable {
348-
// return _swift_stdlib_memcmp(lhs.baseAddress, rhs.baseAddress, count) == 0
349-
// }
350-
if _pointer != other._pointer {
351-
for o in 0..<count {
352-
if self[unchecked: o] != other[unchecked: o] { return false }
353-
}
354-
}
355-
return true
356-
}
357-
358-
/// Returns a Boolean value indicating whether this span and a Collection
359-
/// contain equal elements in the same order.
360-
///
361-
/// - Parameters:
362-
/// - other: A Collection to compare to this span.
363-
/// - Returns: `true` if this sequence and `other` contain equivalent items,
364-
/// using `areEquivalent` as the equivalence test; otherwise, `false.`
365-
///
366-
/// - Complexity: O(*m*), where *m* is the lesser of the length of the
367-
/// sequence and the length of `other`.
368-
@_disallowFeatureSuppression(NonescapableTypes)
369-
@_alwaysEmitIntoClient
370-
public func _elementsEqual(_ other: some Collection<Element>) -> Bool {
371-
let equal = other.withContiguousStorageIfAvailable {
372-
_elementsEqual(Span(_unsafeElements: $0))
373-
}
374-
if let equal { return equal }
375-
376-
guard count == other.count else { return false }
377-
if count == 0 { return true }
378-
379-
return _elementsEqual(AnySequence(other))
380-
}
381-
382-
/// Returns a Boolean value indicating whether this span and a Sequence
383-
/// contain equal elements in the same order.
384-
///
385-
/// - Parameters:
386-
/// - other: A Sequence to compare to this span.
387-
/// - Returns: `true` if this sequence and `other` contain equivalent items,
388-
/// using `areEquivalent` as the equivalence test; otherwise, `false.`
389-
///
390-
/// - Complexity: O(*m*), where *m* is the lesser of the length of the
391-
/// sequence and the length of `other`.
392-
@_disallowFeatureSuppression(NonescapableTypes)
393-
@_alwaysEmitIntoClient
394-
public func _elementsEqual(_ other: some Sequence<Element>) -> Bool {
395-
var offset = 0
396-
for otherElement in other {
397-
if offset >= count { return false }
398-
if self[unchecked: offset] != otherElement { return false }
399-
offset += 1
400-
}
401-
return offset == count
402-
}
403-
}
404-
405326
@_disallowFeatureSuppression(NonescapableTypes)
406327
@available(SwiftStdlib 6.1, *)
407328
extension Span where Element: ~Copyable {
@@ -701,7 +622,9 @@ extension Span where Element: BitwiseCopyable {
701622
public func withUnsafeBytes<E: Error, Result: ~Copyable>(
702623
_ body: (_ buffer: UnsafeRawBufferPointer) throws(E) -> Result
703624
) throws(E) -> Result {
704-
try RawSpan(_elements: self).withUnsafeBytes(body)
625+
try body(
626+
.init(start: _pointer, count: _count * MemoryLayout<Element>.stride)
627+
)
705628
}
706629
}
707630

0 commit comments

Comments
 (0)