File: AttributedString%2B_InternalRun.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (118 lines) | stat: -rw-r--r-- 3,382 bytes parent folder | download
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2020-2023 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
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#if FOUNDATION_FRAMEWORK
@_spi(Unstable) internal import CollectionsInternal
#elseif canImport(_RopeModule)
internal import _RopeModule
#elseif canImport(_FoundationCollections)
internal import _FoundationCollections
#endif

@available(macOS 12, iOS 15, tvOS 15, watchOS 8, *)
extension AttributedString {
    internal struct _InternalRun: Sendable {
        // UTF-8 Code Unit Length
        internal var length: Int
        internal var attributes: _AttributeStorage

        init(length: Int, attributes: _AttributeStorage) {
            self.length = length
            self.attributes = attributes
        }
    }
}

extension AttributedString._InternalRun: Equatable {
    internal static func == (left: Self, right: Self) -> Bool {
        left.length == right.length && left.attributes == right.attributes
    }
}

extension AttributedString._InternalRun: Hashable {
    internal func hash(into hasher: inout Hasher) {
        hasher.combine(length)
        hasher.combine(attributes)
    }
}

extension AttributedString._InternalRun: RopeElement {
    typealias Index = Int

    var summary: Summary { Summary(utf8Length: length) }
    var isEmpty: Bool { length == 0 }
    var isUndersized: Bool { false }

    func invariantCheck() {}

    mutating func rebalance(nextNeighbor right: inout Self) -> Bool {
        // We can never be undersized
        fatalError("Unimplemented")
    }

    mutating func rebalance(prevNeighbor left: inout Self) -> Bool {
        // We can never be undersized
        fatalError("Unimplemented")
    }

    mutating func split(at index: Self.Index) -> Self {
        precondition(index >= 0 && index <= length)
        let tail = Self(length: length - index, attributes: attributes)
        length = index
        return tail
    }
}

extension AttributedString._InternalRun {
    internal func get<T: AttributedStringKey>(_ k: T.Type) -> T.Value? where T.Value : Sendable {
        attributes[k]
    }
}

extension AttributedString._InternalRun {
    struct Summary: Sendable {
        var count: Int
        var utf8Length: Int

        init(utf8Length: Int) {
            self.count = 1
            self.utf8Length = utf8Length
        }

        init(count: Int, utf8Length: Int) {
            self.count = count
            self.utf8Length = utf8Length
        }
    }
}

extension AttributedString._InternalRun.Summary: RopeSummary {
    @inline(__always)
    static var maxNodeSize: Int { 15 }

    @inline(__always)
    static var nodeSizeBitWidth: Int { 4 }

    static var zero: Self { Self(count: 0, utf8Length: 0) }

    var isZero: Bool { count == 0 && utf8Length == 0 }

    mutating func add(_ other: Self) {
        count += other.count
        utf8Length += other.utf8Length
    }

    mutating func subtract(_ other: Self) {
        count -= other.count
        utf8Length -= other.utf8Length
    }
}