@@ -76,7 +76,7 @@ DispatchAPI.test("dispatch_data_t deallocator") {
76
76
autoreleasepool {
77
77
let size = 1024
78
78
let p = UnsafeMutablePointer< UInt8> . allocate( capacity: size)
79
- let d = DispatchData ( bytesNoCopy: UnsafeBufferPointer ( start: p, count: size) , deallocator: . custom( q, {
79
+ let d = DispatchData ( bytesNoCopy: UnsafeRawBufferPointer ( start: p, count: size) , deallocator: . custom( q, {
80
80
t = 1
81
81
} ) )
82
82
}
@@ -278,6 +278,133 @@ DispatchAPI.test("DispatchData.copyBytes") {
278
278
expectEqual ( destPtr [ 5 ] , 0xFF )
279
279
}
280
280
281
+ DispatchAPI . test ( " DispatchData.copyBytesUnsafeRawBufferPointer " ) {
282
+ let source1 : [ UInt8 ] = [ 0 , 1 , 2 , 3 ]
283
+ let srcPtr1 = UnsafeRawBufferPointer ( start: source1, count: source1. count)
284
+
285
+ var dest : [ UInt8 ] = [ 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ]
286
+ let destPtr = UnsafeMutableRawBufferPointer ( start: UnsafeMutablePointer ( & dest) ,
287
+ count: dest. count)
288
+ var dispatchData = DispatchData ( bytes: srcPtr1)
289
+
290
+ // Copy from offset 0
291
+ dispatchData. copyBytes ( to: destPtr, from: 0 ..< 2 )
292
+ expectEqual ( destPtr [ 0 ] , 0 )
293
+ expectEqual ( destPtr [ 1 ] , 1 )
294
+ expectEqual ( destPtr [ 2 ] , 0xFF )
295
+ expectEqual ( destPtr [ 3 ] , 0xFF )
296
+ expectEqual ( destPtr [ 4 ] , 0xFF )
297
+ expectEqual ( destPtr [ 5 ] , 0xFF )
298
+
299
+ // Copy from offset 2
300
+ dispatchData. copyBytes ( to: destPtr, from: 2 ..< 4 )
301
+ expectEqual ( destPtr [ 0 ] , 2 )
302
+ expectEqual ( destPtr [ 1 ] , 3 )
303
+ expectEqual ( destPtr [ 2 ] , 0xFF )
304
+ expectEqual ( destPtr [ 3 ] , 0xFF )
305
+ expectEqual ( destPtr [ 4 ] , 0xFF )
306
+ expectEqual ( destPtr [ 5 ] , 0xFF )
307
+
308
+ // Add two more regions
309
+ let source2 : [ UInt8 ] = [ 0x10 , 0x11 , 0x12 , 0x13 ]
310
+ let srcPtr2 = UnsafeRawBufferPointer ( start: source2, count: source2. count)
311
+ dispatchData. append ( DispatchData ( bytes: srcPtr2) )
312
+
313
+ let source3 : [ UInt8 ] = [ 0x14 , 0x15 , 0x16 ]
314
+ let srcPtr3 = UnsafeRawBufferPointer ( start: source3, count: source3. count)
315
+ dispatchData. append ( DispatchData ( bytes: srcPtr3) )
316
+
317
+ // Copy from offset 0. Copies across the first two regions
318
+ dispatchData. copyBytes ( to: destPtr, from: 0 ..< 6 )
319
+ expectEqual ( destPtr [ 0 ] , 0 )
320
+ expectEqual ( destPtr [ 1 ] , 1 )
321
+ expectEqual ( destPtr [ 2 ] , 2 )
322
+ expectEqual ( destPtr [ 3 ] , 3 )
323
+ expectEqual ( destPtr [ 4 ] , 0x10 )
324
+ expectEqual ( destPtr [ 5 ] , 0x11 )
325
+
326
+ // Copy from offset 2. Copies across the first two regions
327
+ dispatchData. copyBytes ( to: destPtr, from: 2 ..< 8 )
328
+ expectEqual ( destPtr [ 0 ] , 2 )
329
+ expectEqual ( destPtr [ 1 ] , 3 )
330
+ expectEqual ( destPtr [ 2 ] , 0x10 )
331
+ expectEqual ( destPtr [ 3 ] , 0x11 )
332
+ expectEqual ( destPtr [ 4 ] , 0x12 )
333
+ expectEqual ( destPtr [ 5 ] , 0x13 )
334
+
335
+ // Copy from offset 3. Copies across all three regions
336
+ dispatchData. copyBytes ( to: destPtr, from: 3 ..< 9 )
337
+ expectEqual ( destPtr [ 0 ] , 3 )
338
+ expectEqual ( destPtr [ 1 ] , 0x10 )
339
+ expectEqual ( destPtr [ 2 ] , 0x11 )
340
+ expectEqual ( destPtr [ 3 ] , 0x12 )
341
+ expectEqual ( destPtr [ 4 ] , 0x13 )
342
+ expectEqual ( destPtr [ 5 ] , 0x14 )
343
+
344
+ // Copy from offset 5. Skips the first region and the first byte of the second
345
+ dispatchData. copyBytes ( to: destPtr, from: 5 ..< 11 )
346
+ expectEqual ( destPtr [ 0 ] , 0x11 )
347
+ expectEqual ( destPtr [ 1 ] , 0x12 )
348
+ expectEqual ( destPtr [ 2 ] , 0x13 )
349
+ expectEqual ( destPtr [ 3 ] , 0x14 )
350
+ expectEqual ( destPtr [ 4 ] , 0x15 )
351
+ expectEqual ( destPtr [ 5 ] , 0x16 )
352
+
353
+ // Copy from offset 8. Skips the first two regions
354
+ destPtr [ 3 ] = 0xFF
355
+ destPtr [ 4 ] = 0xFF
356
+ destPtr [ 5 ] = 0xFF
357
+ dispatchData. copyBytes ( to: destPtr, from: 8 ..< 11 )
358
+ expectEqual ( destPtr [ 0 ] , 0x14 )
359
+ expectEqual ( destPtr [ 1 ] , 0x15 )
360
+ expectEqual ( destPtr [ 2 ] , 0x16 )
361
+ expectEqual ( destPtr [ 3 ] , 0xFF )
362
+ expectEqual ( destPtr [ 4 ] , 0xFF )
363
+ expectEqual ( destPtr [ 5 ] , 0xFF )
364
+
365
+ // Copy from offset 9. Skips the first two regions and the first byte of the third
366
+ destPtr [ 2 ] = 0xFF
367
+ destPtr [ 3 ] = 0xFF
368
+ destPtr [ 4 ] = 0xFF
369
+ destPtr [ 5 ] = 0xFF
370
+ dispatchData. copyBytes ( to: destPtr, from: 9 ..< 11 )
371
+ expectEqual ( destPtr [ 0 ] , 0x15 )
372
+ expectEqual ( destPtr [ 1 ] , 0x16 )
373
+ expectEqual ( destPtr [ 2 ] , 0xFF )
374
+ expectEqual ( destPtr [ 3 ] , 0xFF )
375
+ expectEqual ( destPtr [ 4 ] , 0xFF )
376
+ expectEqual ( destPtr [ 5 ] , 0xFF )
377
+
378
+ // Copy from offset 9, but only 1 byte. Ends before the end of the data
379
+ destPtr [ 1 ] = 0xFF
380
+ destPtr [ 2 ] = 0xFF
381
+ destPtr [ 3 ] = 0xFF
382
+ destPtr [ 4 ] = 0xFF
383
+ destPtr [ 5 ] = 0xFF
384
+ dispatchData. copyBytes ( to: destPtr, from: 9 ..< 10 )
385
+ expectEqual ( destPtr [ 0 ] , 0x15 )
386
+ expectEqual ( destPtr [ 1 ] , 0xFF )
387
+ expectEqual ( destPtr [ 2 ] , 0xFF )
388
+ expectEqual ( destPtr [ 3 ] , 0xFF )
389
+ expectEqual ( destPtr [ 4 ] , 0xFF )
390
+ expectEqual ( destPtr [ 5 ] , 0xFF )
391
+
392
+ // Copy from offset 2, but only 1 byte. This copy is bounded within the
393
+ // first region.
394
+ destPtr [ 1 ] = 0xFF
395
+ destPtr [ 2 ] = 0xFF
396
+ destPtr [ 3 ] = 0xFF
397
+ destPtr [ 4 ] = 0xFF
398
+ destPtr [ 5 ] = 0xFF
399
+ dispatchData. copyBytes ( to: destPtr, from: 2 ..< 3 )
400
+ expectEqual ( destPtr [ 0 ] , 2 )
401
+ expectEqual ( destPtr [ 1 ] , 0xFF )
402
+ expectEqual ( destPtr [ 2 ] , 0xFF )
403
+ expectEqual ( destPtr [ 3 ] , 0xFF )
404
+ expectEqual ( destPtr [ 4 ] , 0xFF )
405
+ expectEqual ( destPtr [ 5 ] , 0xFF )
406
+ }
407
+
281
408
DispatchAPI . test ( " DispatchData.buffers " ) {
282
409
let bytes = [ UInt8 ( 0 ) , UInt8 ( 1 ) , UInt8 ( 2 ) , UInt8 ( 2 ) ]
283
410
var ptr = UnsafeBufferPointer < UInt8 > ( start: bytes, count: bytes. count)
@@ -301,3 +428,26 @@ DispatchAPI.test("DispatchData.buffers") {
301
428
expectEqual ( data. count, 0 )
302
429
}
303
430
431
+ DispatchAPI . test ( " DispatchData.bufferUnsafeRawBufferPointer " ) {
432
+ let bytes = [ UInt8 ( 0 ) , UInt8 ( 1 ) , UInt8 ( 2 ) , UInt8 ( 2 ) ]
433
+ var ptr = UnsafeRawBufferPointer ( start: bytes, count: bytes. count)
434
+ var data = DispatchData ( bytes: ptr)
435
+ expectEqual ( bytes. count, data. count)
436
+ for i in 0 ..< data. count {
437
+ expectEqual ( data [ i] , bytes [ i] )
438
+ }
439
+
440
+ data = DispatchData ( bytesNoCopy: ptr, deallocator: . custom( nil , { } ) )
441
+ expectEqual ( bytes. count, data. count)
442
+ for i in 0 ..< data. count {
443
+ expectEqual ( data [ i] , bytes [ i] )
444
+ }
445
+
446
+ ptr = UnsafeRawBufferPointer ( start: nil , count: 0 )
447
+ data = DispatchData ( bytes: ptr)
448
+ expectEqual ( data. count, 0 )
449
+
450
+ data = DispatchData ( bytesNoCopy: ptr, deallocator: . custom( nil , { } ) )
451
+ expectEqual ( data. count, 0 )
452
+ }
453
+
0 commit comments