Skip to content

Commit 3f4f079

Browse files
authored
unicode-less equality for _StoredAttribute (embedded) (#78)
* utf8 equating for stored attribute * restore lost public
1 parent 0a1ae2a commit 3f4f079

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed

Sources/Elementary/Core/AttributeStorage.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,3 @@ private func nextflattenedAttribute(
148148
extension _StoredAttribute {
149149
fileprivate static let blankedOut = _StoredAttribute(name: "")
150150
}
151-
152-
extension String {
153-
@inline(__always)
154-
fileprivate func utf8Equals(_ other: borrowing String) -> Bool {
155-
// for embedded support
156-
utf8.elementsEqual(other.utf8)
157-
}
158-
}

Sources/Elementary/Core/StoredAttribute.swift

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,40 @@ public struct _StoredAttribute: Equatable, Sendable {
1313
case appendValue(_ separator: String = " ")
1414
case replaceValue
1515
case ignoreIfSet
16+
17+
@usableFromInline
18+
static func == (lhs: MergeMode, rhs: MergeMode) -> Bool {
19+
switch (lhs, rhs) {
20+
case let (.appendValue(lhsSeparator), .appendValue(rhsSeparator)): return lhsSeparator.utf8Equals(rhsSeparator)
21+
case (.replaceValue, .replaceValue): return true
22+
case (.ignoreIfSet, .ignoreIfSet): return true
23+
default:
24+
return false
25+
}
26+
}
1627
}
1728

18-
enum Value: Equatable {
29+
@usableFromInline
30+
enum Value: Equatable, Sendable {
1931
case empty
2032
case plain(String)
2133
case styles(Styles)
2234
case classes(Classes)
35+
36+
@usableFromInline
37+
static func == (lhs: Value, rhs: Value) -> Bool {
38+
switch (lhs, rhs) {
39+
case (.empty, .empty): return true
40+
case let (.plain(lhsValue), .plain(rhsValue)): return lhsValue.utf8Equals(rhsValue)
41+
case let (.styles(lhsStyles), .styles(rhsStyles)): return lhsStyles == rhsStyles
42+
case let (.classes(lhsClasses), .classes(rhsClasses)): return lhsClasses == rhsClasses
43+
default: return false
44+
}
45+
}
2346
}
2447

2548
public var name: String
49+
@usableFromInline
2650
var _value: Value
2751

2852
// NOTE: this is mainly here to not break API for now
@@ -105,6 +129,11 @@ public struct _StoredAttribute: Equatable, Sendable {
105129
break
106130
}
107131
}
132+
133+
@inlinable
134+
public static func == (lhs: _StoredAttribute, rhs: _StoredAttribute) -> Bool {
135+
lhs.name.utf8Equals(rhs.name) && lhs._value == rhs._value && lhs.mergeMode == rhs.mergeMode
136+
}
108137
}
109138

110139
extension _StoredAttribute {
@@ -120,6 +149,11 @@ extension _StoredAttribute {
120149
self.key = key
121150
self.value = value
122151
}
152+
153+
@usableFromInline
154+
static func == (lhs: Entry, rhs: Entry) -> Bool {
155+
lhs.value.utf8Equals(rhs.value) && lhs.key.utf8Equals(rhs.key)
156+
}
123157
}
124158

125159
@usableFromInline
@@ -203,13 +237,23 @@ extension _StoredAttribute {
203237
consuming func flatten() -> String {
204238
classes.joined(separator: " ")
205239
}
240+
241+
@usableFromInline
242+
static func == (lhs: Classes, rhs: Classes) -> Bool {
243+
lhs.classes.elementsEqual(rhs.classes, by: String.utf8Equals)
244+
}
206245
}
207246
}
208247

209248
extension String {
210249
@inline(__always)
211-
fileprivate func utf8Equals(_ other: borrowing String) -> Bool {
250+
@usableFromInline
251+
func utf8Equals(_ other: borrowing String) -> Bool {
212252
// for embedded support
213253
utf8.elementsEqual(other.utf8)
214254
}
255+
256+
fileprivate static func utf8Equals(_ lhs: borrowing String, _ rhs: borrowing String) -> Bool {
257+
lhs.utf8.elementsEqual(rhs.utf8)
258+
}
215259
}

0 commit comments

Comments
 (0)