Skip to content

Commit 45f1aec

Browse files
committed
Address comments from Karoy and Michael
1 parent b9c94df commit 45f1aec

File tree

5 files changed

+30
-57
lines changed

5 files changed

+30
-57
lines changed

stdlib/private/StdlibUnicodeUnittest/WordBreaking.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,12 @@ func parseWordBreakTests(
2525
continue
2626
}
2727

28-
let info = line.split(separator: "#")
29-
let components = info[0].split(separator: " ")
30-
print(components)
28+
let components = line.split(separator: "#").first!.split(separator: " ")
3129

3230
var string = ""
3331
var words: [String] = [""]
3432

35-
for i in components.indices {
36-
guard i != 0 else {
37-
continue
38-
}
39-
33+
for i in components.indices.dropFirst() {
4034
// If we're an odd index, this is a scalar.
4135
if !i.isMultiple(of: 2) {
4236
let scalar = Unicode.Scalar(UInt32(components[i], radix: 16)!)!

stdlib/public/core/StringIndex.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,7 @@ extension String.Index {
368368
extension String.Index {
369369
@_alwaysEmitIntoClient // Swift 5.7
370370
internal func _copyingAlignment(from index: Self) -> Self {
371-
let mask = Self.__scalarAlignmentBit
372-
| Self.__characterAlignmentBit
371+
let mask = Self.__scalarAlignmentBit | Self.__characterAlignmentBit
373372
return Self((_rawBits & ~mask) | (index._rawBits & mask))
374373
}
375374
}

stdlib/public/core/StringIndexValidation.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,6 @@ extension _StringGuts {
401401

402402
// Word index validation (String)
403403
extension _StringGuts {
404-
@available(SwiftStdlib 5.7, *)
405404
internal func validateWordIndex(
406405
_ i: String._WordView.Index
407406
) -> String._WordView.Index {
@@ -412,7 +411,6 @@ extension _StringGuts {
412411
)
413412
}
414413

415-
@available(SwiftStdlib 5.7, *)
416414
internal func validateInclusiveWordIndex(
417415
_ i: String._WordView.Index
418416
) -> String._WordView.Index {

stdlib/public/core/StringWordBreaking.swift

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
//===----------------------------------------------------------------------===//
1111

1212
extension _StringGuts {
13-
@inline(__always)
1413
internal func roundDownToNearestWord(
1514
_ i: String._WordView.Index
1615
) -> String._WordView.Index {
@@ -30,11 +29,11 @@ extension _StringGuts {
3029
_ i: String._WordView.Index
3130
) -> String._WordView.Index {
3231
let offset = i._encodedOffset
33-
let start = _opaquePreviousWordIndex(endingAt: offset)
34-
let stride = _opaqueNextWordIndex(startingAt: start) &- start
35-
_internalInvariant(offset <= start + stride, "Word breaking inconsistency")
32+
let start = previousWordIndex(endingAt: offset)
33+
let end = nextWordIndex(startingAt: start)
34+
_internalInvariant(offset <= end, "Word breaking inconsistency")
3635

37-
if offset >= start + stride {
36+
if offset == end {
3837
return i
3938
}
4039

@@ -43,9 +42,9 @@ extension _StringGuts {
4342

4443
@inline(never)
4544
@_effects(releasenone)
46-
internal func _opaqueNextWordIndex(startingAt i: Int) -> Int {
45+
internal func nextWordIndex(startingAt i: Int) -> Int {
4746
if _slowPath(isForeign) {
48-
return _foreignOpaqueNextWordIndex(startingAt: i)
47+
return _foreignNextWordIndex(startingAt: i)
4948
}
5049

5150
return withFastUTF8 { utf8 in
@@ -62,7 +61,7 @@ extension _StringGuts {
6261
}
6362
}
6463

65-
internal func _foreignOpaqueNextWordIndex(startingAt i: Int) -> Int {
64+
internal func _foreignNextWordIndex(startingAt i: Int) -> Int {
6665
#if _runtime(_ObjC)
6766
return nextWordBoundary(startingAt: i) {
6867
_internalInvariant($0 >= 0)
@@ -84,9 +83,9 @@ extension _StringGuts {
8483
#endif
8584
}
8685

87-
internal func _opaquePreviousWordIndex(endingAt i: Int) -> Int {
86+
internal func previousWordIndex(endingAt i: Int) -> Int {
8887
if _slowPath(isForeign) {
89-
return _foreignOpaquePreviousWordIndex(endingAt: i)
88+
return _foreignPreviousWordIndex(endingAt: i)
9089
}
9190

9291
return withFastUTF8 { utf8 in
@@ -104,7 +103,7 @@ extension _StringGuts {
104103
}
105104

106105
@inline(never)
107-
internal func _foreignOpaquePreviousWordIndex(endingAt i: Int) -> Int {
106+
internal func _foreignPreviousWordIndex(endingAt i: Int) -> Int {
108107
#if _runtime(_ObjC)
109108
return previousWordBoundary(endingAt: i) {
110109
_internalInvariant($0 <= count)
@@ -160,14 +159,12 @@ extension _StringGuts {
160159
startingAt index: Int,
161160
nextScalar: (Int) -> (scalar: Unicode.Scalar, end: Int)?
162161
) -> Int {
162+
_precondition(index < endIndex._encodedOffset)
163+
163164
var (scalar, index) = nextScalar(index)!
164165
var state = _WordBreakingState(index: index)
165166

166-
while true {
167-
guard let (scalar2, nextIndex) = nextScalar(state.index) else {
168-
break
169-
}
170-
167+
while let (scalar2, nextIndex) = nextScalar(state.index) {
171168
if shouldBreak(between: scalar, and: scalar2, with: &state) {
172169
break
173170
}
@@ -192,11 +189,7 @@ extension _StringGuts {
192189
var (scalar2, index) = previousScalar(index)!
193190
var state = _WordBreakingState(index: index)
194191

195-
while true {
196-
guard let (scalar, previousIndex) = previousScalar(state.index) else {
197-
break
198-
}
199-
192+
while let (scalar, previousIndex) = previousScalar(state.index) {
200193
if shouldBreakBackward(between: scalar, and: scalar2, with: &state) {
201194
break
202195
}
@@ -271,11 +264,7 @@ extension _StringGuts {
271264
return false
272265

273266
default:
274-
var newX = x
275-
276-
if let previousProperty = state.previousProperty {
277-
newX = previousProperty
278-
}
267+
let newX = state.previousProperty ?? x
279268

280269
return decidePostFormat(between: newX, and: y, with: &state)
281270
}

stdlib/public/core/StringWordView.swift

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ extension String {
2020
}
2121

2222
extension String._WordView: Collection {
23-
internal struct Index {
24-
@usableFromInline
23+
internal struct Index: Hashable {
2524
internal var _encodedOffset: Int
2625
}
2726

@@ -36,32 +35,27 @@ extension String._WordView: Collection {
3635
}
3736

3837
func index(after i: Index) -> Index {
39-
_internalInvariant(i < endIndex)
38+
_precondition(i < endIndex)
4039

41-
let nextOffset = _guts._opaqueNextWordIndex(startingAt: i._encodedOffset)
40+
let nextOffset = _guts.nextWordIndex(startingAt: i._encodedOffset)
4241
return Index(_encodedOffset: nextOffset)
4342
}
4443

4544
subscript(position: Index) -> Element {
4645
let indexAfter = index(after: position)
4746

48-
let l = String.Index(_encodedOffset: position._encodedOffset)
49-
let u = String.Index(_encodedOffset: indexAfter._encodedOffset)
47+
let l = String.Index(
48+
_encodedOffset: position._encodedOffset
49+
)._characterAligned
50+
let u = String.Index(
51+
_encodedOffset: indexAfter._encodedOffset
52+
)._characterAligned
5053

5154
return String(_guts)[l ..< u]
5255
}
5356
}
5457

55-
extension String._WordView.Index: Equatable {
56-
@inlinable
57-
@inline(__always)
58-
static func == (lhs: Self, rhs: Self) -> Bool {
59-
lhs._encodedOffset == rhs._encodedOffset
60-
}
61-
}
62-
6358
extension String._WordView.Index: Comparable {
64-
@inlinable
6559
@inline(__always)
6660
static func < (lhs: Self, rhs: Self) -> Bool {
6761
lhs._encodedOffset < rhs._encodedOffset
@@ -78,11 +72,10 @@ extension String._WordView.Index: Sendable {}
7872

7973
extension String._WordView: BidirectionalCollection {
8074
func index(before i: Index) -> Index {
81-
_internalInvariant(i > startIndex)
75+
_precondition(i > startIndex)
76+
_precondition(i <= endIndex)
8277

83-
let previousOffset = _guts._opaquePreviousWordIndex(
84-
endingAt: i._encodedOffset
85-
)
78+
let previousOffset = _guts.previousWordIndex(endingAt: i._encodedOffset)
8679

8780
return Index(_encodedOffset: previousOffset)
8881
}

0 commit comments

Comments
 (0)