@@ -357,14 +357,14 @@ ${Suite}.test("${ArrayType}/reserveCapacity") {
357
357
}
358
358
359
359
//===----------------------------------------------------------------------===//
360
- // init(_unsafeUninitializedCapacity :initializingWith:)
360
+ // init(unsafeUninitializedCapacity :initializingWith:)
361
361
//===----------------------------------------------------------------------===//
362
362
363
363
extension Collection {
364
364
func stablyPartitioned(
365
365
by belongsInFirstPartition: (Element) -> Bool
366
366
) -> ${ArrayType}<Element> {
367
- let result = ${ArrayType}<Element>(_unsafeUninitializedCapacity : self.count) {
367
+ let result = ${ArrayType}<Element>(unsafeUninitializedCapacity : self.count) {
368
368
buffer, initializedCount in
369
369
var lowIndex = 0
370
370
var highIndex = buffer.count
@@ -385,7 +385,15 @@ extension Collection {
385
385
}
386
386
}
387
387
388
- ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)") {
388
+ final class InstanceCountedClass {
389
+ static var instanceCounter = 0
390
+
391
+ init() { InstanceCountedClass.instanceCounter += 1 }
392
+ deinit { InstanceCountedClass.instanceCounter -= 1 }
393
+ }
394
+ enum E: Error { case error }
395
+
396
+ ${Suite}.test("${ArrayType}/init(unsafeUninitializedCapacity:...:)") {
389
397
var a = ${ArrayType}(0..<300)
390
398
let p = a.stablyPartitioned(by: { $0 % 2 == 0 })
391
399
expectEqualSequence(
@@ -394,17 +402,59 @@ ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)") {
394
402
)
395
403
}
396
404
397
- ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)/throwing") {
398
- final class InstanceCountedClass {
399
- static var instanceCounter = 0
405
+ ${Suite}.test("${ArrayType}/init(unsafeUninitializedCapacity:...:)/throwing") {
406
+ do {
407
+ var a = Array<InstanceCountedClass>(unsafeUninitializedCapacity: 10) { buffer, c in
408
+ let p = buffer.baseAddress!
409
+ for i in 0..<5 {
410
+ (p + i).initialize(to: InstanceCountedClass())
411
+ }
412
+ c = 5
413
+ }
414
+ expectEqual(5, a.count)
415
+ expectEqual(5, InstanceCountedClass.instanceCounter)
416
+
417
+ a = []
418
+ expectEqual(0, InstanceCountedClass.instanceCounter)
400
419
401
- init() { InstanceCountedClass.instanceCounter += 1 }
402
- deinit { InstanceCountedClass.instanceCounter -= 1 }
420
+ a = try Array(unsafeUninitializedCapacity: 10) { buffer, c in
421
+ let p = buffer.baseAddress!
422
+ for i in 0..<5 {
423
+ (p + i).initialize(to: InstanceCountedClass())
424
+ }
425
+ c = 5
426
+ throw E.error
427
+ }
428
+
429
+ // The throw above should prevent reaching here, which should mean the
430
+ // instances created in the closure should get deallocated before the final
431
+ // expectation outside the do/catch block.
432
+ expectUnreachable()
433
+ } catch {}
434
+ expectEqual(0, InstanceCountedClass.instanceCounter)
435
+ }
436
+
437
+ ${Suite}.test("${ArrayType}/withUnsafeMutableBufferPointerToFullCapacity") {
438
+ var a = Array<Int>()
439
+ let result: Int = a.withUnsafeMutableBufferPointerToFullCapacity(reservingCapacity: 10) {
440
+ buffer, initializedCount in
441
+ expectEqual(10, buffer.count)
442
+ expectEqual(0, initializedCount)
443
+
444
+ for i in 0..<5 {
445
+ buffer[i] = i
446
+ }
447
+ initializedCount = 5
448
+ return buffer[0..<5].reduce(0, +)
403
449
}
404
- enum E: Error { case error }
450
+ expectEqual(10, a.reduce(0, +))
451
+ expectEqual(5, a.count)
452
+ }
405
453
454
+ ${Suite}.test("${ArrayType}/withUnsafeMutableBufferPointerToFullCapacity/throwing") {
406
455
do {
407
- var a = Array<InstanceCountedClass>(_unsafeUninitializedCapacity: 10) { buffer, c in
456
+ var a = Array<InstanceCountedClass>()
457
+ a.withUnsafeMutableBufferPointerToFullCapacity(capacity: 10) { buffer, c in
408
458
let p = buffer.baseAddress!
409
459
for i in 0..<5 {
410
460
(p + i).initialize(to: InstanceCountedClass())
@@ -416,8 +466,7 @@ ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)/throwing") {
416
466
417
467
a = []
418
468
expectEqual(0, InstanceCountedClass.instanceCounter)
419
-
420
- a = try Array(_unsafeUninitializedCapacity: 10) { buffer, c in
469
+ try a.withUnsafeMutableBufferPointerToFullCapacity(capacity: 10) { buffer, c in
421
470
let p = buffer.baseAddress!
422
471
for i in 0..<5 {
423
472
(p + i).initialize(to: InstanceCountedClass())
@@ -426,10 +475,10 @@ ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)/throwing") {
426
475
throw E.error
427
476
}
428
477
429
- // The throw above should prevent reaching here, which should mean the
478
+ // The throw above should prevent reaching here, which means that the
430
479
// instances created in the closure should get deallocated before the final
431
480
// expectation outside the do/catch block.
432
- expectTrue(false )
481
+ expectUnreachable( )
433
482
} catch {}
434
483
expectEqual(0, InstanceCountedClass.instanceCounter)
435
484
}
0 commit comments