Skip to content

Commit 7b0991f

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 456952e commit 7b0991f

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
@@ -72,30 +72,6 @@ if #available(OSX 10.10, iOS 8.0, *) {
7272
}
7373
}
7474

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

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

0 commit comments

Comments
 (0)