@@ -138,6 +138,9 @@ extension String.UTF16View: BidirectionalCollection {
138
138
@inlinable @inline ( __always)
139
139
public var endIndex : Index { return _guts. endIndex }
140
140
141
+ @inline ( __always)
142
+ internal var _breadcrumbStride : Int { _StringBreadcrumbs. breadcrumbStride }
143
+
141
144
@inlinable @inline ( __always)
142
145
public func index( after idx: Index ) -> Index {
143
146
var idx = _guts. ensureMatchingEncoding ( idx)
@@ -201,7 +204,9 @@ extension String.UTF16View: BidirectionalCollection {
201
204
return _foreignIndex ( i, offsetBy: n)
202
205
}
203
206
204
- if n. magnitude <= _StringBreadcrumbs. breadcrumbStride, !_guts. isASCII {
207
+ let threshold = (
208
+ i == startIndex ? _breadcrumbStride / 2 : _breadcrumbStride)
209
+ if n. magnitude < threshold, !_guts. isASCII {
205
210
// Do not use breadcrumbs if directly computing the result is expected to
206
211
// be cheaper.
207
212
return _index ( i, offsetBy: n) . _knownUTF8
@@ -225,7 +230,9 @@ extension String.UTF16View: BidirectionalCollection {
225
230
return _foreignIndex ( i, offsetBy: n, limitedBy: limit)
226
231
}
227
232
228
- if n. magnitude <= _StringBreadcrumbs. breadcrumbStride, !_guts. isASCII {
233
+ let threshold = (
234
+ _breadcrumbStride + ( i == startIndex ? 0 : _breadcrumbStride / 2 ) )
235
+ if n. magnitude < threshold, !_guts. isASCII {
229
236
// Do not use breadcrumbs if directly computing the result is expected to
230
237
// be cheaper.
231
238
return _index ( i, offsetBy: n, limitedBy: limit) ? . _knownUTF8
@@ -268,10 +275,10 @@ extension String.UTF16View: BidirectionalCollection {
268
275
}
269
276
270
277
let utf8Distance = end. _encodedOffset - start. _encodedOffset
271
- if
272
- utf8Distance . magnitude <= _StringBreadcrumbs . breadcrumbStride ,
273
- !_guts . isASCII
274
- {
278
+ let threshold = ( start == startIndex || end == startIndex
279
+ ? _breadcrumbStride / 2
280
+ : _breadcrumbStride )
281
+ if utf8Distance . magnitude < threshold , !_guts . isASCII {
275
282
// Do not use breadcrumbs if directly computing the result is expected to
276
283
// be cheaper. The conservative threshold above assumes that each UTF-16
277
284
// code unit will map to a single UTF-8 code unit, i.e., the worst
0 commit comments