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 72 73 74 75 76 77 78 79 80 81 82
|
//===----------------------------------------------------------------------===//
//
// 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 {
struct Summary {
// FIXME: We only need 48 * 3 = 192 bits to represent a nonnegative value; pack these better
// (Unfortunately we also need to represent negative values right now.)
private(set) var characters: Int
private(set) var unicodeScalars: Int
private(set) var utf16: Int
private(set) var utf8: Int
init() {
characters = 0
unicodeScalars = 0
utf16 = 0
utf8 = 0
}
init(_ chunk: BigString._Chunk) {
self.utf8 = chunk.utf8Count
self.utf16 = Int(chunk.counts.utf16)
self.unicodeScalars = Int(chunk.counts.unicodeScalars)
self.characters = Int(chunk.counts.characters)
}
}
}
@available(macOS 13.3, iOS 16.4, watchOS 9.4, tvOS 16.4, *)
extension BigString.Summary: CustomStringConvertible {
var description: String {
"❨\(utf8)⋅\(utf16)⋅\(unicodeScalars)⋅\(characters)❩"
}
}
@available(macOS 13.3, iOS 16.4, watchOS 9.4, tvOS 16.4, *)
extension BigString.Summary: RopeSummary {
@inline(__always)
static var maxNodeSize: Int {
#if DEBUG
return 10
#else
return 15
#endif
}
@inline(__always)
static var nodeSizeBitWidth: Int { 4 }
@inline(__always)
static var zero: Self { Self() }
@inline(__always)
var isZero: Bool { utf8 == 0 }
mutating func add(_ other: BigString.Summary) {
characters += other.characters
unicodeScalars += other.unicodeScalars
utf16 += other.utf16
utf8 += other.utf8
}
mutating func subtract(_ other: BigString.Summary) {
characters -= other.characters
unicodeScalars -= other.unicodeScalars
utf16 -= other.utf16
utf8 -= other.utf8
}
}
#endif
|