Skip to content

Commit 40d4506

Browse files
committed
Change the signature for DispatchData.enumerateBytes() to match that of Data.enumerateBytes() for Swift 4.2 and obsolete the old version.
rdar://problem/40775762
1 parent bc7f11c commit 40d4506

File tree

3 files changed

+409
-335
lines changed

3 files changed

+409
-335
lines changed

stdlib/public/SDK/Dispatch/Data.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,22 @@ public struct DispatchData : RandomAccessCollection, _ObjectiveCBridgeable {
104104
return try body(contentPtr)
105105
}
106106

107+
@available(swift 4.2)
108+
public func enumerateBytes(
109+
_ block: (_ buffer: UnsafeBufferPointer<UInt8>, _ byteIndex: Int, _ stop: inout Bool) -> Void)
110+
{
111+
enumerateBytesCommon(block)
112+
}
113+
114+
@available(swift, obsoleted: 4.2, renamed: "enumerateBytes(_:)")
107115
public func enumerateBytes(
108116
block: (_ buffer: UnsafeBufferPointer<UInt8>, _ byteIndex: Int, _ stop: inout Bool) -> Void)
117+
{
118+
enumerateBytesCommon(block)
119+
}
120+
121+
private func enumerateBytesCommon(
122+
_ block: (_ buffer: UnsafeBufferPointer<UInt8>, _ byteIndex: Int, _ stop: inout Bool) -> Void)
109123
{
110124
_swift_dispatch_data_apply(__wrapped) { (_, offset: Int, ptr: UnsafeRawPointer, size: Int) in
111125
let bytePtr = ptr.bindMemory(to: UInt8.self, capacity: size)

test/stdlib/Dispatch.swift

Lines changed: 0 additions & 335 deletions
Original file line numberDiff line numberDiff line change
@@ -74,30 +74,6 @@ if #available(OSX 10.10, iOS 8.0, *) {
7474
}
7575
}
7676

77-
DispatchAPI.test("dispatch_data_t enumeration") {
78-
// Ensure we can iterate the empty iterator
79-
for _ in DispatchData.empty {
80-
_ = 1
81-
}
82-
}
83-
84-
DispatchAPI.test("dispatch_data_t deallocator") {
85-
let q = DispatchQueue(label: "dealloc queue")
86-
var t = 0
87-
88-
autoreleasepool {
89-
let size = 1024
90-
let p = UnsafeMutablePointer<UInt8>.allocate(capacity: size)
91-
let _ = DispatchData(bytesNoCopy: UnsafeBufferPointer(start: p, count: size), deallocator: .custom(q, {
92-
t = 1
93-
}))
94-
}
95-
96-
q.sync {
97-
expectEqual(1, t)
98-
}
99-
}
100-
10177
DispatchAPI.test("DispatchTime comparisons") {
10278
do {
10379
let now = DispatchTime.now()
@@ -203,317 +179,6 @@ DispatchAPI.test("DispatchTime.uptimeNanos") {
203179
expectEqual(NSEC_PER_SEC, diffNanos)
204180
}
205181

206-
DispatchAPI.test("DispatchData.copyBytes") {
207-
let source1: [UInt8] = [0, 1, 2, 3]
208-
let srcPtr1 = UnsafeBufferPointer(start: source1, count: source1.count)
209-
210-
var dest: [UInt8] = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
211-
let destPtr = UnsafeMutableBufferPointer(start: UnsafeMutablePointer(&dest),
212-
count: dest.count)
213-
214-
var dispatchData = DispatchData(bytes: srcPtr1)
215-
216-
// Copy from offset 0
217-
var count = dispatchData.copyBytes(to: destPtr, from: 0..<2)
218-
expectEqual(count, 2)
219-
expectEqual(destPtr[0], 0)
220-
expectEqual(destPtr[1], 1)
221-
expectEqual(destPtr[2], 0xFF)
222-
expectEqual(destPtr[3], 0xFF)
223-
expectEqual(destPtr[4], 0xFF)
224-
expectEqual(destPtr[5], 0xFF)
225-
226-
// Copy from offset 2
227-
count = dispatchData.copyBytes(to: destPtr, from: 2..<4)
228-
expectEqual(count, 2)
229-
expectEqual(destPtr[0], 2)
230-
expectEqual(destPtr[1], 3)
231-
expectEqual(destPtr[2], 0xFF)
232-
expectEqual(destPtr[3], 0xFF)
233-
expectEqual(destPtr[4], 0xFF)
234-
expectEqual(destPtr[5], 0xFF)
235-
236-
// Add two more regions
237-
let source2: [UInt8] = [0x10, 0x11, 0x12, 0x13]
238-
let srcPtr2 = UnsafeBufferPointer(start: source2, count: source2.count)
239-
dispatchData.append(DispatchData(bytes: srcPtr2))
240-
241-
let source3: [UInt8] = [0x14, 0x15, 0x16]
242-
let srcPtr3 = UnsafeBufferPointer(start: source3, count: source3.count)
243-
dispatchData.append(DispatchData(bytes: srcPtr3))
244-
245-
// Copy from offset 0. Copies across the first two regions
246-
count = dispatchData.copyBytes(to: destPtr, from: 0..<6)
247-
expectEqual(count, 6)
248-
expectEqual(destPtr[0], 0)
249-
expectEqual(destPtr[1], 1)
250-
expectEqual(destPtr[2], 2)
251-
expectEqual(destPtr[3], 3)
252-
expectEqual(destPtr[4], 0x10)
253-
expectEqual(destPtr[5], 0x11)
254-
255-
// Copy from offset 2. Copies across the first two regions
256-
count = dispatchData.copyBytes(to: destPtr, from: 2..<8)
257-
expectEqual(count, 6)
258-
expectEqual(destPtr[0], 2)
259-
expectEqual(destPtr[1], 3)
260-
expectEqual(destPtr[2], 0x10)
261-
expectEqual(destPtr[3], 0x11)
262-
expectEqual(destPtr[4], 0x12)
263-
expectEqual(destPtr[5], 0x13)
264-
265-
// Copy from offset 3. Copies across all three regions
266-
count = dispatchData.copyBytes(to: destPtr, from: 3..<9)
267-
expectEqual(count, 6)
268-
expectEqual(destPtr[0], 3)
269-
expectEqual(destPtr[1], 0x10)
270-
expectEqual(destPtr[2], 0x11)
271-
expectEqual(destPtr[3], 0x12)
272-
expectEqual(destPtr[4], 0x13)
273-
expectEqual(destPtr[5], 0x14)
274-
275-
// Copy from offset 5. Skips the first region and the first byte of the second
276-
count = dispatchData.copyBytes(to: destPtr, from: 5..<11)
277-
expectEqual(count, 6)
278-
expectEqual(destPtr[0], 0x11)
279-
expectEqual(destPtr[1], 0x12)
280-
expectEqual(destPtr[2], 0x13)
281-
expectEqual(destPtr[3], 0x14)
282-
expectEqual(destPtr[4], 0x15)
283-
expectEqual(destPtr[5], 0x16)
284-
285-
// Copy from offset 8. Skips the first two regions
286-
destPtr[3] = 0xFF
287-
destPtr[4] = 0xFF
288-
destPtr[5] = 0xFF
289-
count = dispatchData.copyBytes(to: destPtr, from: 8..<11)
290-
expectEqual(count, 3)
291-
expectEqual(destPtr[0], 0x14)
292-
expectEqual(destPtr[1], 0x15)
293-
expectEqual(destPtr[2], 0x16)
294-
expectEqual(destPtr[3], 0xFF)
295-
expectEqual(destPtr[4], 0xFF)
296-
expectEqual(destPtr[5], 0xFF)
297-
298-
// Copy from offset 9. Skips the first two regions and the first byte of the third
299-
destPtr[2] = 0xFF
300-
destPtr[3] = 0xFF
301-
destPtr[4] = 0xFF
302-
destPtr[5] = 0xFF
303-
count = dispatchData.copyBytes(to: destPtr, from: 9..<11)
304-
expectEqual(count, 2)
305-
expectEqual(destPtr[0], 0x15)
306-
expectEqual(destPtr[1], 0x16)
307-
expectEqual(destPtr[2], 0xFF)
308-
expectEqual(destPtr[3], 0xFF)
309-
expectEqual(destPtr[4], 0xFF)
310-
expectEqual(destPtr[5], 0xFF)
311-
312-
// Copy from offset 9, but only 1 byte. Ends before the end of the data
313-
destPtr[1] = 0xFF
314-
destPtr[2] = 0xFF
315-
destPtr[3] = 0xFF
316-
destPtr[4] = 0xFF
317-
destPtr[5] = 0xFF
318-
count = dispatchData.copyBytes(to: destPtr, from: 9..<10)
319-
expectEqual(count, 1)
320-
expectEqual(destPtr[0], 0x15)
321-
expectEqual(destPtr[1], 0xFF)
322-
expectEqual(destPtr[2], 0xFF)
323-
expectEqual(destPtr[3], 0xFF)
324-
expectEqual(destPtr[4], 0xFF)
325-
expectEqual(destPtr[5], 0xFF)
326-
327-
// Copy from offset 2, but only 1 byte. This copy is bounded within the
328-
// first region.
329-
destPtr[1] = 0xFF
330-
destPtr[2] = 0xFF
331-
destPtr[3] = 0xFF
332-
destPtr[4] = 0xFF
333-
destPtr[5] = 0xFF
334-
count = dispatchData.copyBytes(to: destPtr, from: 2..<3)
335-
expectEqual(count, 1)
336-
expectEqual(destPtr[0], 2)
337-
expectEqual(destPtr[1], 0xFF)
338-
expectEqual(destPtr[2], 0xFF)
339-
expectEqual(destPtr[3], 0xFF)
340-
expectEqual(destPtr[4], 0xFF)
341-
expectEqual(destPtr[5], 0xFF)
342-
}
343-
344-
DispatchAPI.test("DispatchData.copyBytesUnsafeRawBufferPointer") {
345-
let source1: [UInt8] = [0, 1, 2, 3]
346-
let srcPtr1 = UnsafeRawBufferPointer(start: source1, count: source1.count)
347-
348-
var dest: [UInt8] = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
349-
let destPtr = UnsafeMutableRawBufferPointer(start: UnsafeMutablePointer(&dest),
350-
count: dest.count)
351-
var dispatchData = DispatchData(bytes: srcPtr1)
352-
353-
// Copy from offset 0
354-
dispatchData.copyBytes(to: destPtr, from: 0..<2)
355-
expectEqual(destPtr[0], 0)
356-
expectEqual(destPtr[1], 1)
357-
expectEqual(destPtr[2], 0xFF)
358-
expectEqual(destPtr[3], 0xFF)
359-
expectEqual(destPtr[4], 0xFF)
360-
expectEqual(destPtr[5], 0xFF)
361-
362-
// Copy from offset 2
363-
dispatchData.copyBytes(to: destPtr, from: 2..<4)
364-
expectEqual(destPtr[0], 2)
365-
expectEqual(destPtr[1], 3)
366-
expectEqual(destPtr[2], 0xFF)
367-
expectEqual(destPtr[3], 0xFF)
368-
expectEqual(destPtr[4], 0xFF)
369-
expectEqual(destPtr[5], 0xFF)
370-
371-
// Add two more regions
372-
let source2: [UInt8] = [0x10, 0x11, 0x12, 0x13]
373-
let srcPtr2 = UnsafeRawBufferPointer(start: source2, count: source2.count)
374-
dispatchData.append(DispatchData(bytes: srcPtr2))
375-
376-
let source3: [UInt8] = [0x14, 0x15, 0x16]
377-
let srcPtr3 = UnsafeRawBufferPointer(start: source3, count: source3.count)
378-
dispatchData.append(DispatchData(bytes: srcPtr3))
379-
380-
// Copy from offset 0. Copies across the first two regions
381-
dispatchData.copyBytes(to: destPtr, from: 0..<6)
382-
expectEqual(destPtr[0], 0)
383-
expectEqual(destPtr[1], 1)
384-
expectEqual(destPtr[2], 2)
385-
expectEqual(destPtr[3], 3)
386-
expectEqual(destPtr[4], 0x10)
387-
expectEqual(destPtr[5], 0x11)
388-
389-
// Copy from offset 2. Copies across the first two regions
390-
dispatchData.copyBytes(to: destPtr, from: 2..<8)
391-
expectEqual(destPtr[0], 2)
392-
expectEqual(destPtr[1], 3)
393-
expectEqual(destPtr[2], 0x10)
394-
expectEqual(destPtr[3], 0x11)
395-
expectEqual(destPtr[4], 0x12)
396-
expectEqual(destPtr[5], 0x13)
397-
398-
// Copy from offset 3. Copies across all three regions
399-
dispatchData.copyBytes(to: destPtr, from: 3..<9)
400-
expectEqual(destPtr[0], 3)
401-
expectEqual(destPtr[1], 0x10)
402-
expectEqual(destPtr[2], 0x11)
403-
expectEqual(destPtr[3], 0x12)
404-
expectEqual(destPtr[4], 0x13)
405-
expectEqual(destPtr[5], 0x14)
406-
407-
// Copy from offset 5. Skips the first region and the first byte of the second
408-
dispatchData.copyBytes(to: destPtr, from: 5..<11)
409-
expectEqual(destPtr[0], 0x11)
410-
expectEqual(destPtr[1], 0x12)
411-
expectEqual(destPtr[2], 0x13)
412-
expectEqual(destPtr[3], 0x14)
413-
expectEqual(destPtr[4], 0x15)
414-
expectEqual(destPtr[5], 0x16)
415-
416-
// Copy from offset 8. Skips the first two regions
417-
destPtr[3] = 0xFF
418-
destPtr[4] = 0xFF
419-
destPtr[5] = 0xFF
420-
dispatchData.copyBytes(to: destPtr, from: 8..<11)
421-
expectEqual(destPtr[0], 0x14)
422-
expectEqual(destPtr[1], 0x15)
423-
expectEqual(destPtr[2], 0x16)
424-
expectEqual(destPtr[3], 0xFF)
425-
expectEqual(destPtr[4], 0xFF)
426-
expectEqual(destPtr[5], 0xFF)
427-
428-
// Copy from offset 9. Skips the first two regions and the first byte of the third
429-
destPtr[2] = 0xFF
430-
destPtr[3] = 0xFF
431-
destPtr[4] = 0xFF
432-
destPtr[5] = 0xFF
433-
dispatchData.copyBytes(to: destPtr, from: 9..<11)
434-
expectEqual(destPtr[0], 0x15)
435-
expectEqual(destPtr[1], 0x16)
436-
expectEqual(destPtr[2], 0xFF)
437-
expectEqual(destPtr[3], 0xFF)
438-
expectEqual(destPtr[4], 0xFF)
439-
expectEqual(destPtr[5], 0xFF)
440-
441-
// Copy from offset 9, but only 1 byte. Ends before the end of the data
442-
destPtr[1] = 0xFF
443-
destPtr[2] = 0xFF
444-
destPtr[3] = 0xFF
445-
destPtr[4] = 0xFF
446-
destPtr[5] = 0xFF
447-
dispatchData.copyBytes(to: destPtr, from: 9..<10)
448-
expectEqual(destPtr[0], 0x15)
449-
expectEqual(destPtr[1], 0xFF)
450-
expectEqual(destPtr[2], 0xFF)
451-
expectEqual(destPtr[3], 0xFF)
452-
expectEqual(destPtr[4], 0xFF)
453-
expectEqual(destPtr[5], 0xFF)
454-
455-
// Copy from offset 2, but only 1 byte. This copy is bounded within the
456-
// first region.
457-
destPtr[1] = 0xFF
458-
destPtr[2] = 0xFF
459-
destPtr[3] = 0xFF
460-
destPtr[4] = 0xFF
461-
destPtr[5] = 0xFF
462-
dispatchData.copyBytes(to: destPtr, from: 2..<3)
463-
expectEqual(destPtr[0], 2)
464-
expectEqual(destPtr[1], 0xFF)
465-
expectEqual(destPtr[2], 0xFF)
466-
expectEqual(destPtr[3], 0xFF)
467-
expectEqual(destPtr[4], 0xFF)
468-
expectEqual(destPtr[5], 0xFF)
469-
}
470-
471-
DispatchAPI.test("DispatchData.buffers") {
472-
let bytes = [UInt8(0), UInt8(1), UInt8(2), UInt8(2)]
473-
var ptr = UnsafeBufferPointer<UInt8>(start: bytes, count: bytes.count)
474-
var data = DispatchData(bytes: ptr)
475-
expectEqual(bytes.count, data.count)
476-
for i in 0..<data.count {
477-
expectEqual(data[i], bytes[i])
478-
}
479-
480-
data = DispatchData(bytesNoCopy: ptr, deallocator: .custom(nil, {}))
481-
expectEqual(bytes.count, data.count)
482-
for i in 0..<data.count {
483-
expectEqual(data[i], bytes[i])
484-
}
485-
486-
ptr = UnsafeBufferPointer<UInt8>(start: nil, count: 0)
487-
data = DispatchData(bytes: ptr)
488-
expectEqual(data.count, 0)
489-
490-
data = DispatchData(bytesNoCopy: ptr, deallocator: .custom(nil, {}))
491-
expectEqual(data.count, 0)
492-
}
493-
494-
DispatchAPI.test("DispatchData.bufferUnsafeRawBufferPointer") {
495-
let bytes = [UInt8(0), UInt8(1), UInt8(2), UInt8(2)]
496-
var ptr = UnsafeRawBufferPointer(start: bytes, count: bytes.count)
497-
var data = DispatchData(bytes: ptr)
498-
expectEqual(bytes.count, data.count)
499-
for i in 0..<data.count {
500-
expectEqual(data[i], bytes[i])
501-
}
502-
503-
data = DispatchData(bytesNoCopy: ptr, deallocator: .custom(nil, {}))
504-
expectEqual(bytes.count, data.count)
505-
for i in 0..<data.count {
506-
expectEqual(data[i], bytes[i])
507-
}
508-
509-
ptr = UnsafeRawBufferPointer(start: nil, count: 0)
510-
data = DispatchData(bytes: ptr)
511-
expectEqual(data.count, 0)
512-
513-
data = DispatchData(bytesNoCopy: ptr, deallocator: .custom(nil, {}))
514-
expectEqual(data.count, 0)
515-
}
516-
517182
DispatchAPI.test("DispatchIO.initRelativePath") {
518183
let q = DispatchQueue(label: "initRelativePath queue")
519184
#if swift(>=4.0)

0 commit comments

Comments
 (0)