@@ -17,10 +17,14 @@ extension _StringGuts {
17
17
_internalInvariant ( hasMatchingEncoding ( i) )
18
18
_internalInvariant ( i. _encodedOffset <= count)
19
19
20
+ if _fastPath ( i. _isWordAligned) {
21
+ return i
22
+ }
23
+
20
24
let offset = i. _encodedOffset
21
25
22
26
if offset == 0 || offset == count {
23
- return i
27
+ return i. _wordAligned
24
28
}
25
29
26
30
return _slowRoundDownToNearestWord ( i)
@@ -33,15 +37,15 @@ extension _StringGuts {
33
37
34
38
let offset = i. _encodedOffset
35
39
let start = offset &- words. _uncheckedIndex ( before: i) . _encodedOffset
36
- let startIndex = String . Index ( _encodedOffset: start) . _scalarAligned
40
+ let startIndex = String . Index ( _encodedOffset: start) . _wordAligned
37
41
let stride = words. _uncheckedIndex ( after: startIndex) . _encodedOffset
38
42
_internalInvariant ( offset <= start + stride, " Word breaking inconsistency " )
39
43
40
44
if offset >= start + stride {
41
- return i
45
+ return i. _wordAligned
42
46
}
43
47
44
- let r = String . Index ( _encodedOffset: start) . _scalarAligned
48
+ let r = String . Index ( _encodedOffset: start) . _wordAligned
45
49
return markEncoding ( r)
46
50
}
47
51
}
@@ -170,7 +174,7 @@ extension String._WordView {
170
174
171
175
// WB3a and WB3b
172
176
case ( . newlineCRLF, _) ,
173
- ( _, . newlineCRLF) :
177
+ ( _, . newlineCRLF) :
174
178
return true
175
179
176
180
// WB3c
@@ -183,8 +187,8 @@ extension String._WordView {
183
187
184
188
// WB4
185
189
case ( _, . format) ,
186
- ( _, . extend) ,
187
- ( _, . zwj) :
190
+ ( _, . extend) ,
191
+ ( _, . zwj) :
188
192
if x != . format && x != . extend && x != . zwj {
189
193
state. previousProperty = x
190
194
}
@@ -212,9 +216,9 @@ extension String._WordView {
212
216
switch ( x, y) {
213
217
// WB5
214
218
case ( . aLetter, . aLetter) ,
215
- ( . aLetter, . hebrewLetter) ,
216
- ( . hebrewLetter, . aLetter) ,
217
- ( . hebrewLetter, . hebrewLetter) :
219
+ ( . aLetter, . hebrewLetter) ,
220
+ ( . hebrewLetter, . aLetter) ,
221
+ ( . hebrewLetter, . hebrewLetter) :
218
222
return false
219
223
220
224
// WB6
@@ -276,12 +280,12 @@ extension String._WordView {
276
280
277
281
// WB9
278
282
case ( . aLetter, . numeric) ,
279
- ( . hebrewLetter, . numeric) :
283
+ ( . hebrewLetter, . numeric) :
280
284
return false
281
285
282
286
// WB10
283
287
case ( . numeric, . aLetter) ,
284
- ( . numeric, . hebrewLetter) :
288
+ ( . numeric, . hebrewLetter) :
285
289
return false
286
290
287
291
// WB11
@@ -314,17 +318,17 @@ extension String._WordView {
314
318
315
319
// WB13a
316
320
case ( . aLetter, . extendNumLet) ,
317
- ( . hebrewLetter, . extendNumLet) ,
318
- ( . numeric, . extendNumLet) ,
319
- ( . katakana, . extendNumLet) ,
320
- ( . extendNumLet, . extendNumLet) :
321
+ ( . hebrewLetter, . extendNumLet) ,
322
+ ( . numeric, . extendNumLet) ,
323
+ ( . katakana, . extendNumLet) ,
324
+ ( . extendNumLet, . extendNumLet) :
321
325
return false
322
326
323
327
// WB13b
324
328
case ( . extendNumLet, . aLetter) ,
325
- ( . extendNumLet, . hebrewLetter) ,
326
- ( . extendNumLet, . numeric) ,
327
- ( . extendNumLet, . katakana) :
329
+ ( . extendNumLet, . hebrewLetter) ,
330
+ ( . extendNumLet, . numeric) ,
331
+ ( . extendNumLet, . katakana) :
328
332
return false
329
333
330
334
// WB15
@@ -370,7 +374,7 @@ extension String._WordView {
370
374
371
375
// WB3a and WB3b
372
376
case ( . newlineCRLF, _) ,
373
- ( _, . newlineCRLF) :
377
+ ( _, . newlineCRLF) :
374
378
return true
375
379
376
380
// WB3c
@@ -383,8 +387,8 @@ extension String._WordView {
383
387
384
388
// WB4
385
389
case ( . format, _) ,
386
- ( . extend, _) ,
387
- ( . zwj, _) :
390
+ ( . extend, _) ,
391
+ ( . zwj, _) :
388
392
if y != . format && y != . extend && y != . zwj {
389
393
state. previousProperty = y
390
394
state. previousIndex = state. index
@@ -394,8 +398,8 @@ extension String._WordView {
394
398
395
399
// WB4
396
400
case ( _, . format) ,
397
- ( _, . extend) ,
398
- ( _, . zwj) :
401
+ ( _, . extend) ,
402
+ ( _, . zwj) :
399
403
if state. previousProperty != nil {
400
404
fallthrough
401
405
}
@@ -426,18 +430,18 @@ extension String._WordView {
426
430
427
431
// WB5
428
432
case ( . aLetter, . aLetter) ,
429
- ( . aLetter, . hebrewLetter) ,
430
- ( . hebrewLetter, . aLetter) ,
431
- ( . hebrewLetter, . hebrewLetter) :
433
+ ( . aLetter, . hebrewLetter) ,
434
+ ( . hebrewLetter, . aLetter) ,
435
+ ( . hebrewLetter, . hebrewLetter) :
432
436
state. previousIndex = nil
433
437
return false
434
438
435
439
// WB6
436
440
case ( . aLetter, . midLetter) ,
437
- ( . hebrewLetter, . midLetter) ,
438
- ( . aLetter, . midNumLet) ,
439
- ( . hebrewLetter, . midNumLet) ,
440
- ( . aLetter, . singleQuote) :
441
+ ( . hebrewLetter, . midLetter) ,
442
+ ( . aLetter, . midNumLet) ,
443
+ ( . hebrewLetter, . midNumLet) ,
444
+ ( . aLetter, . singleQuote) :
441
445
if let constraint = state. constraint {
442
446
if constraint. question == . requireAHLetter {
443
447
state. constraint = nil
@@ -453,11 +457,11 @@ extension String._WordView {
453
457
454
458
// WB7
455
459
case ( . midLetter, . aLetter) ,
456
- ( . midLetter, . hebrewLetter) ,
457
- ( . midNumLet, . aLetter) ,
458
- ( . midNumLet, . hebrewLetter) ,
459
- ( . singleQuote, . aLetter) ,
460
- ( . singleQuote, . hebrewLetter) :
460
+ ( . midLetter, . hebrewLetter) ,
461
+ ( . midNumLet, . aLetter) ,
462
+ ( . midNumLet, . hebrewLetter) ,
463
+ ( . singleQuote, . aLetter) ,
464
+ ( . singleQuote, . hebrewLetter) :
461
465
state. constraint = ( question: . requireAHLetter, index: state. index)
462
466
463
467
return false
@@ -495,28 +499,28 @@ extension String._WordView {
495
499
496
500
// WB9
497
501
case ( . aLetter, . numeric) ,
498
- ( . hebrewLetter, . numeric) :
502
+ ( . hebrewLetter, . numeric) :
499
503
state. previousIndex = nil
500
504
return false
501
505
502
506
// WB10
503
507
case ( . numeric, . aLetter) ,
504
- ( . numeric, . hebrewLetter) :
508
+ ( . numeric, . hebrewLetter) :
505
509
state. previousIndex = nil
506
510
return false
507
511
508
512
// WB11
509
513
case ( . midNum, . numeric) ,
510
- ( . midNumLet, . numeric) ,
511
- ( . singleQuote, . numeric) :
514
+ ( . midNumLet, . numeric) ,
515
+ ( . singleQuote, . numeric) :
512
516
state. constraint = ( question: . requireNumeric, index: state. index)
513
517
514
518
return false
515
519
516
520
// WB12
517
521
case ( . numeric, . midNum) ,
518
- ( . numeric, . midNumLet) ,
519
- ( . numeric, . singleQuote) :
522
+ ( . numeric, . midNumLet) ,
523
+ ( . numeric, . singleQuote) :
520
524
if let constraint = state. constraint {
521
525
if constraint. question == . requireNumeric {
522
526
state. constraint = nil
@@ -537,18 +541,18 @@ extension String._WordView {
537
541
538
542
// WB13a
539
543
case ( . aLetter, . extendNumLet) ,
540
- ( . hebrewLetter, . extendNumLet) ,
541
- ( . numeric, . extendNumLet) ,
542
- ( . katakana, . extendNumLet) ,
543
- ( . extendNumLet, . extendNumLet) :
544
+ ( . hebrewLetter, . extendNumLet) ,
545
+ ( . numeric, . extendNumLet) ,
546
+ ( . katakana, . extendNumLet) ,
547
+ ( . extendNumLet, . extendNumLet) :
544
548
state. previousIndex = nil
545
549
return false
546
550
547
551
// WB13b
548
552
case ( . extendNumLet, . aLetter) ,
549
- ( . extendNumLet, . hebrewLetter) ,
550
- ( . extendNumLet, . numeric) ,
551
- ( . extendNumLet, . katakana) :
553
+ ( . extendNumLet, . hebrewLetter) ,
554
+ ( . extendNumLet, . numeric) ,
555
+ ( . extendNumLet, . katakana) :
552
556
state. previousIndex = nil
553
557
return false
554
558
0 commit comments