Skip to content

Commit b508206

Browse files
committed
[span] improve indices(of:) and byteOffsets(of:)
1 parent 5d49bd6 commit b508206

File tree

2 files changed

+11
-13
lines changed

2 files changed

+11
-13
lines changed

stdlib/public/core/Span/RawSpan.swift

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -568,14 +568,13 @@ extension RawSpan {
568568
@_alwaysEmitIntoClient
569569
public func byteOffsets(of span: borrowing Self) -> Range<Int>? {
570570
if span._count > _count { return nil }
571-
guard let subspanStart = span._pointer, _count > 0 else {
572-
return _pointer == span._pointer ? Range(uncheckedBounds: (0, 0)) : nil
571+
guard let spanStart = span._pointer, _count > 0 else {
572+
return _pointer == span._pointer ? Range(_uncheckedBounds: (0, 0)) : nil
573573
}
574-
if subspanStart < _start { return nil }
575-
let lower = _start.distance(to: subspanStart)
576-
let upper = lower + span._count
577-
guard upper <= _count else { return nil }
578-
return Range(uncheckedBounds: (lower, upper))
574+
let spanEnd = spanStart + span._count
575+
if spanStart < _start || (_start + _count) < spanEnd { return nil }
576+
let lower = _start.distance(to: spanStart)
577+
return Range(_uncheckedBounds: (lower, lower &+ span._count))
579578
}
580579
}
581580

stdlib/public/core/Span/Span.swift

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -695,17 +695,16 @@ extension Span where Element: ~Copyable {
695695
@_alwaysEmitIntoClient
696696
public func indices(of span: borrowing Self) -> Range<Index>? {
697697
if span._count > _count { return nil }
698-
guard let subspanStart = span._pointer, _count > 0 else {
698+
guard let spanStart = span._pointer, _count > 0 else {
699699
return _pointer == span._pointer ? Range(_uncheckedBounds: (0, 0)) : nil
700700
}
701-
if subspanStart < _start { return nil }
702-
let byteOffset = _start.distance(to: subspanStart)
703701
let stride = MemoryLayout<Element>.stride
702+
let spanEnd = spanStart + stride&*span._count
703+
if spanStart < _start || spanEnd > (_start + stride&*_count) { return nil }
704+
let byteOffset = _start.distance(to: spanStart)
704705
let (lower, r) = byteOffset.quotientAndRemainder(dividingBy: stride)
705706
guard r == 0 else { return nil }
706-
let upper = lower + span._count
707-
guard upper <= _count else { return nil }
708-
return Range(_uncheckedBounds: (lower, upper))
707+
return Range(_uncheckedBounds: (lower, lower &+ span._count))
709708
}
710709
}
711710

0 commit comments

Comments
 (0)