@@ -462,10 +462,6 @@ ${Suite}.test("${ArrayType}/withUnsafeMutableBytes")
462
462
expectEqual(10, b[0])
463
463
}
464
464
465
- // FIXME: Implement these changes for ArraySlice and ContiguousArray
466
-
467
- %if ArrayType == 'Array':
468
-
469
465
//===----------------------------------------------------------------------===//
470
466
// reserveCapacity semantics
471
467
//===----------------------------------------------------------------------===//
@@ -478,36 +474,39 @@ ${Suite}.test("${ArrayType}/reserveCapacity") {
478
474
}
479
475
}
480
476
477
+ %if ArrayType in ['Array', 'ContiguousArray']:
478
+
481
479
//===----------------------------------------------------------------------===//
482
- // init(_unsafeUninitializedCapacity :initializingWith:)
480
+ // init(unsafeUninitializedCapacity :initializingWith:)
483
481
//===----------------------------------------------------------------------===//
484
482
485
483
extension Collection {
486
484
func stablyPartitioned(
487
485
by belongsInFirstPartition: (Element) -> Bool
488
486
) -> ${ArrayType}<Element> {
489
- let result = ${ArrayType}<Element>(_unsafeUninitializedCapacity : self.count) {
487
+ let result = ${ArrayType}<Element>(unsafeUninitializedCapacity : self.count) {
490
488
buffer, initializedCount in
491
- var lowIndex = 0
492
- var highIndex = buffer.count
489
+ var low = buffer.baseAddress!
490
+ var high = low + buffer.count
493
491
for element in self {
494
492
if belongsInFirstPartition(element) {
495
- buffer[lowIndex] = element
496
- lowIndex += 1
493
+ low.initialize(to: element)
494
+ low += 1
497
495
} else {
498
- highIndex -= 1
499
- buffer[highIndex] = element
496
+ high -= 1
497
+ high.initialize(to: element)
500
498
}
501
499
}
502
-
500
+
501
+ let highIndex = high - buffer.baseAddress!
503
502
buffer[highIndex...].reverse()
504
503
initializedCount = buffer.count
505
504
}
506
505
return result
507
506
}
508
507
}
509
508
510
- ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity :...:)") {
509
+ ${Suite}.test("${ArrayType}/init(unsafeUninitializedCapacity :...:)") {
511
510
var a = ${ArrayType}(0..<300)
512
511
let p = a.stablyPartitioned(by: { $0 % 2 == 0 })
513
512
expectEqualSequence(
@@ -516,7 +515,7 @@ ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)") {
516
515
)
517
516
}
518
517
519
- ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity :...:)/throwing") {
518
+ ${Suite}.test("${ArrayType}/init(unsafeUninitializedCapacity :...:)/throwing") {
520
519
final class InstanceCountedClass {
521
520
static var instanceCounter = 0
522
521
@@ -526,7 +525,8 @@ ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)/throwing") {
526
525
enum E: Error { case error }
527
526
528
527
do {
529
- var a = Array<InstanceCountedClass>(_unsafeUninitializedCapacity: 10) { buffer, c in
528
+ var a = ${ArrayType}<InstanceCountedClass>(unsafeUninitializedCapacity: 10) {
529
+ buffer, c in
530
530
let p = buffer.baseAddress!
531
531
for i in 0..<5 {
532
532
(p + i).initialize(to: InstanceCountedClass())
@@ -539,7 +539,7 @@ ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)/throwing") {
539
539
a = []
540
540
expectEqual(0, InstanceCountedClass.instanceCounter)
541
541
542
- a = try Array(_unsafeUninitializedCapacity : 10) { buffer, c in
542
+ a = try ${ArrayType}(unsafeUninitializedCapacity : 10) { buffer, c in
543
543
let p = buffer.baseAddress!
544
544
for i in 0..<5 {
545
545
(p + i).initialize(to: InstanceCountedClass())
@@ -548,10 +548,7 @@ ${Suite}.test("${ArrayType}/init(_unsafeUninitializedCapacity:...:)/throwing") {
548
548
throw E.error
549
549
}
550
550
551
- // The throw above should prevent reaching here, which should mean the
552
- // instances created in the closure should get deallocated before the final
553
- // expectation outside the do/catch block.
554
- expectTrue(false)
551
+ expectUnreachable()
555
552
} catch {}
556
553
expectEqual(0, InstanceCountedClass.instanceCounter)
557
554
}
0 commit comments