1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift Collections open source project
//
// Copyright (c) 2023 - 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//
#if swift(>=5.8)
@available(macOS 13.3, iOS 16.4, watchOS 9.4, tvOS 16.4, *)
extension BigString._Chunk {
@inline(__always)
var hasBreaks: Bool { counts.hasBreaks }
var firstBreak: String.Index {
get {
string._utf8Index(at: prefixCount)
}
set {
counts.prefix = string._utf8Offset(of: newValue)
}
}
var lastBreak: String.Index {
get {
string._utf8Index(at: utf8Count - suffixCount)
}
set {
counts.suffix = utf8Count - string._utf8Offset(of: newValue)
}
}
var prefix: Substring { string[..<firstBreak] }
var suffix: Substring { string[lastBreak...] }
var wholeCharacters: Substring { string[firstBreak...] }
}
@available(macOS 13.3, iOS 16.4, watchOS 9.4, tvOS 16.4, *)
extension BigString._Chunk {
var immediateLastBreakState: _CharacterRecognizer? {
guard hasBreaks else { return nil }
return _CharacterRecognizer(partialCharacter: string[lastBreak...])
}
func nearestBreak(before index: String.Index) -> String.Index? {
let index = string.unicodeScalars._index(roundingDown: index)
let first = firstBreak
guard index > first else { return nil }
let last = lastBreak
guard index <= last else { return last }
let w = string[first...]
let rounded = w._index(roundingDown: index)
guard rounded == index else { return rounded }
return w.index(before: rounded)
}
func immediateBreakState(
upTo index: String.Index
) -> (prevBreak: String.Index, state: _CharacterRecognizer)? {
guard let prev = nearestBreak(before: index) else { return nil }
let state = _CharacterRecognizer(partialCharacter: string[prev..<index])
return (prev, state)
}
}
#endif
|