Skip to content

Commit bd25af7

Browse files
committed
Synchronize the latest revision of Data.swift from the overlay
1 parent a539033 commit bd25af7

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

Foundation/Data.swift

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,22 @@ internal func __NSDataIsCompact(_ data: NSData) -> Bool {
3838
import _SwiftFoundationOverlayShims
3939
import _SwiftCoreFoundationOverlayShims
4040

41+
internal func __NSDataIsCompact(_ data: NSData) -> Bool {
42+
if #available(OSX 10.10, iOS 8.0, tvOS 9.0, watchOS 2.0, *) {
43+
return data._isCompact()
44+
} else {
45+
var compact = true
46+
let len = data.length
47+
data.enumerateBytes { (_, byteRange, stop) in
48+
if byteRange.length != len {
49+
compact = false
50+
}
51+
stop.pointee = true
52+
}
53+
return compact
54+
}
55+
}
56+
4157
#endif
4258

4359
public final class _DataStorage {
@@ -127,7 +143,7 @@ public final class _DataStorage {
127143
case .mutable:
128144
return try apply(UnsafeRawBufferPointer(start: _bytes?.advanced(by: range.lowerBound - _offset), count: Swift.min(range.count, _length)))
129145
case .customReference(let d):
130-
if d._isCompact() {
146+
if __NSDataIsCompact(d) {
131147
let len = d.length
132148
guard len > 0 else {
133149
return try apply(UnsafeRawBufferPointer(start: nil, count: 0))
@@ -136,6 +152,7 @@ public final class _DataStorage {
136152
} else {
137153
var buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: range.count, alignment: MemoryLayout<UInt>.alignment)
138154
defer { buffer.deallocate() }
155+
139156
let sliceRange = NSRange(location: range.lowerBound - _offset, length: range.count)
140157
var enumerated = 0
141158
d.enumerateBytes { (ptr, byteRange, stop) in
@@ -160,7 +177,7 @@ public final class _DataStorage {
160177
return try apply(UnsafeRawBufferPointer(buffer))
161178
}
162179
case .customMutableReference(let d):
163-
if d._isCompact() {
180+
if __NSDataIsCompact(d) {
164181
let len = d.length
165182
guard len > 0 else {
166183
return try apply(UnsafeRawBufferPointer(start: nil, count: 0))
@@ -169,6 +186,7 @@ public final class _DataStorage {
169186
} else {
170187
var buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: range.count, alignment: MemoryLayout<UInt>.alignment)
171188
defer { buffer.deallocate() }
189+
172190
let sliceRange = NSRange(location: range.lowerBound - _offset, length: range.count)
173191
var enumerated = 0
174192
d.enumerateBytes { (ptr, byteRange, stop) in
@@ -507,7 +525,7 @@ public final class _DataStorage {
507525
case .mutable:
508526
return _bytes!.advanced(by: index - _offset).assumingMemoryBound(to: UInt8.self).pointee
509527
case .customReference(let d):
510-
if d._isCompact() {
528+
if __NSDataIsCompact(d) {
511529
return d.bytes.advanced(by: index - _offset).assumingMemoryBound(to: UInt8.self).pointee
512530
} else {
513531
var byte: UInt8 = 0
@@ -521,7 +539,7 @@ public final class _DataStorage {
521539
return byte
522540
}
523541
case .customMutableReference(let d):
524-
if d._isCompact() {
542+
if __NSDataIsCompact(d) {
525543
return d.bytes.advanced(by: index - _offset).assumingMemoryBound(to: UInt8.self).pointee
526544
} else {
527545
var byte: UInt8 = 0
@@ -993,8 +1011,8 @@ public struct Data : ReferenceConvertible, Equatable, Hashable, RandomAccessColl
9931011
public typealias Index = Int
9941012
public typealias Indices = Range<Int>
9951013

996-
@_versioned internal var _backing : _DataStorage
997-
@_versioned internal var _sliceRange: Range<Index>
1014+
@usableFromInline internal var _backing : _DataStorage
1015+
@usableFromInline internal var _sliceRange: Range<Index>
9981016

9991017

10001018
// A standard or custom deallocator for `Data`.
@@ -1245,18 +1263,18 @@ public struct Data : ReferenceConvertible, Equatable, Hashable, RandomAccessColl
12451263
}
12461264
}
12471265

1248-
@_versioned
1266+
@usableFromInline
12491267
internal init(backing: _DataStorage, range: Range<Index>) {
12501268
_backing = backing
12511269
_sliceRange = range
12521270
}
12531271

1254-
@_versioned
1272+
@usableFromInline
12551273
internal func _validateIndex(_ index: Int, message: String? = nil) {
12561274
precondition(_sliceRange.contains(index), message ?? "Index \(index) is out of bounds of range \(_sliceRange)")
12571275
}
12581276

1259-
@_versioned
1277+
@usableFromInline
12601278
internal func _validateRange<R: RangeExpression>(_ range: R) where R.Bound == Int {
12611279
let lower = R.Bound(_sliceRange.lowerBound)
12621280
let upper = R.Bound(_sliceRange.upperBound)
@@ -1541,7 +1559,7 @@ public struct Data : ReferenceConvertible, Equatable, Hashable, RandomAccessColl
15411559
/// - parameter buffer: The replacement bytes.
15421560
@inline(__always)
15431561
public mutating func replaceSubrange<SourceType>(_ subrange: Range<Index>, with buffer: UnsafeBufferPointer<SourceType>) {
1544-
guard !buffer.isEmpty else { return }
1562+
guard !buffer.isEmpty else { return }
15451563
replaceSubrange(subrange, with: buffer.baseAddress!, count: buffer.count * MemoryLayout<SourceType>.stride)
15461564
}
15471565

0 commit comments

Comments
 (0)