1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
// RUN: %empty-directory(%t)
// RUN: %target-build-swift %s -o %t/main
// RUN: %target-build-swift %s -o %t/main-optimized
// RUN: %target-codesign %t/main
// RUN: %target-codesign %t/main-optimized
// RUN: %target-run %t/main | %FileCheck %s
// RUN: %target-run %t/main-optimized | %FileCheck %s
// REQUIRES: executable_test
protocol Preening {
func preen()
}
struct A : Preening, Hashable, Equatable {
private var value: Int
init(_ value: Int) { self.value = value }
func preen() {
print("A\(value)")
}
static func ==(lhs: A, rhs: A) -> Bool {
return lhs.value == rhs.value
}
func hash(into hasher: inout Hasher) {
hasher.combine(value)
}
}
do {
print("Arrays.")
// CHECK: Arrays.
let a_array = [ A(5), A(10), A(20) ]
a_array.forEach { $0.preen() }
// CHECK-NEXT: A5
// CHECK-NEXT: A10
// CHECK-NEXT: A20
let preening_array_1 = a_array as [Preening]
preening_array_1.forEach { $0.preen() }
// CHECK-NEXT: A5
// CHECK-NEXT: A10
// CHECK-NEXT: A20
let any_array_1 = preening_array_1 as [Any]
print(any_array_1.count)
// CHECK-NEXT: 3
let preening_array_2 = any_array_1 as! [Preening]
preening_array_2.forEach { $0.preen() }
// CHECK-NEXT: A5
// CHECK-NEXT: A10
// CHECK-NEXT: A20
let preening_array_3 = any_array_1 as? [Preening]
preening_array_3?.forEach { $0.preen() }
// CHECK-NEXT: A5
// CHECK-NEXT: A10
// CHECK-NEXT: A20
let a_array_2 = any_array_1 as! [A]
a_array_2.forEach { $0.preen() }
// CHECK-NEXT: A5
// CHECK-NEXT: A10
// CHECK-NEXT: A20
let a_array_3 = any_array_1 as? [Preening]
a_array_3?.forEach { $0.preen() }
// CHECK-NEXT: A5
// CHECK-NEXT: A10
// CHECK-NEXT: A20
let a_array_4 = preening_array_1 as! [A]
a_array_4.forEach { $0.preen() }
// CHECK-NEXT: A5
// CHECK-NEXT: A10
// CHECK-NEXT: A20
}
do {
print("Dictionaries.")
// CHECK-NEXT: Dictionaries.
let a_dict = ["one" : A(1), "two" : A(2), "three" : A(3)]
print("begin")
a_dict.forEach { $0.1.preen() }
print("end")
// CHECK-NEXT: begin
// CHECK-DAG: A1
// CHECK-DAG: A2
// CHECK-DAG: A3
// CHECK-NEXT: end
let preening_dict_1 = a_dict as [String: Preening]
print("begin")
preening_dict_1.forEach { $0.1.preen() }
print("end")
// CHECK-NEXT: begin
// CHECK-DAG: A1
// CHECK-DAG: A2
// CHECK-DAG: A3
// CHECK-NEXT: end
let any_dict_1 = preening_dict_1 as [String: Any]
print(any_dict_1.count)
// CHECK-NEXT: 3
let preening_dict_2 = any_dict_1 as! [String: Preening]
print("begin")
preening_dict_2.forEach { $0.1.preen() }
print("end")
// CHECK-NEXT: begin
// CHECK-DAG: A1
// CHECK-DAG: A2
// CHECK-DAG: A3
// CHECK-NEXT: end
let preening_dict_3 = any_dict_1 as? [String: Preening]
print("begin")
preening_dict_3?.forEach { $0.1.preen() }
print("end")
// CHECK-NEXT: begin
// CHECK-DAG: A1
// CHECK-DAG: A2
// CHECK-DAG: A3
// CHECK-NEXT: end
let a_dict_2 = any_dict_1 as! [String: A]
print("begin")
a_dict_2.forEach { $0.1.preen() }
print("end")
// CHECK-NEXT: begin
// CHECK-DAG: A1
// CHECK-DAG: A2
// CHECK-DAG: A3
// CHECK-NEXT: end
let a_dict_3 = any_dict_1 as? [String: A]
print("begin")
a_dict_3?.forEach { $0.1.preen() }
print("end")
// CHECK-NEXT: begin
// CHECK-DAG: A1
// CHECK-DAG: A2
// CHECK-DAG: A3
// CHECK-NEXT: end
}
// TODO: I can't think of any way to do this for sets and dictionary
// keys that doesn't involve bridging.
|