Skip to content

Commit 5815468

Browse files
authored
Merge pull request #30719 from milseman/tilde_equality
[String] Concrete String/Substring overloads for ~=
2 parents a8c0455 + 30c9257 commit 5815468

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

stdlib/public/core/StringComparable.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,25 @@ extension String: Comparable {
8282
}
8383

8484
extension Substring: Equatable {}
85+
86+
// TODO(SR-12457): Generalize `~=` over `StringProtocol`. Below are
87+
// concrete overloads to give us most of the benefit without potential harm
88+
// to expression type checking performance.
89+
extension String {
90+
@_alwaysEmitIntoClient
91+
@inline(__always)
92+
@_effects(readonly)
93+
public static func ~= (lhs: String, rhs: Substring) -> Bool {
94+
return lhs == rhs
95+
}
96+
}
97+
extension Substring {
98+
@_alwaysEmitIntoClient
99+
@inline(__always)
100+
@_effects(readonly)
101+
public static func ~= (lhs: Substring, rhs: String) -> Bool {
102+
return lhs == rhs
103+
}
104+
}
105+
106+

test/stdlib/StringSwitch.swift

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// RUN: %target-run-simple-swift
2+
3+
import StdlibUnittest
4+
5+
var StringSwitchTests = TestSuite("StringSwitchTests")
6+
7+
func switchOver(_ s: String) -> Character {
8+
let (first, second) = ("first", "second")
9+
10+
let ret1: Character
11+
switch s {
12+
case first: ret1 = "A"
13+
case second[...]: ret1 = "B"
14+
default: ret1 = "X"
15+
}
16+
17+
let ret2: Character
18+
switch s[...] {
19+
case first: ret2 = "A"
20+
case second[...]: ret2 = "B"
21+
default: ret2 = "X"
22+
}
23+
24+
expectEqual(ret1, ret2)
25+
return ret1
26+
}
27+
28+
func switchOver<S1: StringProtocol, S2: StringProtocol>(
29+
_ s1: S1, _ s2: S2
30+
) -> Character {
31+
let (first, second) = ("first", "second")
32+
33+
// TODO(SR-12457): Enable
34+
#if true
35+
fatalError()
36+
#else
37+
let ret1: Character
38+
switch s1 {
39+
case first: ret1 = "A"
40+
case second[...]: ret1 = "B"
41+
case s2: ret2 = "="
42+
default: ret1 = "X"
43+
}
44+
45+
let ret2: Character
46+
switch s2 {
47+
case first: ret1 = "A"
48+
case second[...]: ret1 = "B"
49+
case s1: ret2 = "="
50+
default: ret2 = "X"
51+
}
52+
53+
expectEqual(ret1, ret2)
54+
return ret1
55+
#endif
56+
}
57+
58+
StringSwitchTests.test("switch") {
59+
let (first, second) = ("first", "second")
60+
let same = "same"
61+
let (foo, bar) = ("foo", "bar")
62+
63+
expectEqual("A", switchOver(first))
64+
expectEqual("B", switchOver(second))
65+
expectEqual("X", switchOver(foo))
66+
67+
// TODO(SR-12457): Enable
68+
#if true
69+
#else
70+
expectEqual("A", switchOver(first, first))
71+
expectEqual("B", switchOver(second, second))
72+
expectEqual("=", switchOver(same, same))
73+
expectEqual("X", switchOver(foo, bar))
74+
expectEqual("A", switchOver(first[...], first))
75+
expectEqual("B", switchOver(second[...], second))
76+
expectEqual("=", switchOver(same[...], same))
77+
expectEqual("X", switchOver(foo[...], bar))
78+
#endif
79+
80+
}
81+
82+
runAllTests()

0 commit comments

Comments
 (0)