Skip to content

Commit dff319e

Browse files
authored
Merge pull request #1521 from phausler/data_sync_master
2 parents 5a32c12 + bd25af7 commit dff319e

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

Foundation/Data.swift

Lines changed: 23 additions & 5 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
@@ -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)