Skip to content

Commit 03abb1f

Browse files
authored
Merge pull request #76223 from ishon19/76220-string-should-conform-to-comparable
Add comparable conformance for C++ strings
2 parents ecd5803 + 49d9067 commit 03abb1f

File tree

2 files changed

+63
-3
lines changed

2 files changed

+63
-3
lines changed

stdlib/public/Cxx/std/String.swift

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,15 @@ extension std.u32string: ExpressibleByStringLiteral {
9898

9999
// MARK: Concatenating and comparing C++ strings
100100

101-
extension std.string: Equatable {
101+
extension std.string: Equatable, Comparable {
102102
public static func ==(lhs: std.string, rhs: std.string) -> Bool {
103103
return lhs.compare(rhs) == 0
104104
}
105105

106+
public static func <(lhs: std.string, rhs: std.string) -> Bool {
107+
return lhs.compare(rhs) < 0
108+
}
109+
106110
public static func +=(lhs: inout std.string, rhs: std.string) {
107111
lhs.append(rhs)
108112
}
@@ -119,11 +123,15 @@ extension std.string: Equatable {
119123
}
120124
}
121125

122-
extension std.u16string: Equatable {
126+
extension std.u16string: Equatable, Comparable {
123127
public static func ==(lhs: std.u16string, rhs: std.u16string) -> Bool {
124128
return lhs.compare(rhs) == 0
125129
}
126130

131+
public static func <(lhs: std.u16string, rhs: std.u16string) -> Bool {
132+
return lhs.compare(rhs) < 0
133+
}
134+
127135
public static func +=(lhs: inout std.u16string, rhs: std.u16string) {
128136
lhs.append(rhs)
129137
}
@@ -140,11 +148,15 @@ extension std.u16string: Equatable {
140148
}
141149
}
142150

143-
extension std.u32string: Equatable {
151+
extension std.u32string: Equatable, Comparable {
144152
public static func ==(lhs: std.u32string, rhs: std.u32string) -> Bool {
145153
return lhs.compare(rhs) == 0
146154
}
147155

156+
public static func <(lhs: std.u32string, rhs: std.u32string) -> Bool {
157+
return lhs.compare(rhs) < 0
158+
}
159+
148160
public static func +=(lhs: inout std.u32string, rhs: std.u32string) {
149161
lhs.append(rhs)
150162
}

test/Interop/Cxx/stdlib/use-std-string.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,54 @@ StdStringTestSuite.test("std::u32string::append") {
148148
expectEqual(s1, std.u32string("0123abc"))
149149
}
150150

151+
StdStringTestSuite.test("std::string comparison") {
152+
let s1 = std.string("abc")
153+
let s2 = std.string("def")
154+
let s3 = std.string("abc")
155+
156+
expectTrue(s1 < s2)
157+
expectFalse(s2 < s1)
158+
expectTrue(s1 <= s2)
159+
expectFalse(s2 <= s1)
160+
expectTrue(s2 > s1)
161+
expectFalse(s1 > s2)
162+
expectTrue(s2 >= s1)
163+
expectFalse(s1 >= s2)
164+
expectTrue(s1 == s3)
165+
}
166+
167+
StdStringTestSuite.test("std::u16string comparison") {
168+
let s1 = std.u16string("abc")
169+
let s2 = std.u16string("def")
170+
let s3 = std.u16string("abc")
171+
172+
expectTrue(s1 < s2)
173+
expectFalse(s2 < s1)
174+
expectTrue(s1 <= s2)
175+
expectFalse(s2 <= s1)
176+
expectTrue(s2 > s1)
177+
expectFalse(s1 > s2)
178+
expectTrue(s2 >= s1)
179+
expectFalse(s1 >= s2)
180+
expectTrue(s1 == s3)
181+
}
182+
183+
StdStringTestSuite.test("std::u32string comparison") {
184+
let s1 = std.u32string("abc")
185+
let s2 = std.u32string("def")
186+
let s3 = std.u32string("abc")
187+
188+
expectTrue(s1 < s2)
189+
expectFalse(s2 < s1)
190+
expectTrue(s1 <= s2)
191+
expectFalse(s2 <= s1)
192+
expectTrue(s2 > s1)
193+
expectFalse(s1 > s2)
194+
expectTrue(s2 >= s1)
195+
expectFalse(s1 >= s2)
196+
expectTrue(s1 == s3)
197+
}
198+
151199
StdStringTestSuite.test("std::string as Hashable") {
152200
let s0 = std.string()
153201
let h0 = s0.hashValue

0 commit comments

Comments
 (0)