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
|
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
extension Rope {
@frozen // Not really! This module isn't ABI stable.
public struct Index: @unchecked Sendable {
@usableFromInline internal typealias Summary = Rope.Summary
@usableFromInline internal typealias _Path = Rope._Path
@usableFromInline
internal var _version: _RopeVersion
@usableFromInline
internal var _path: _Path
/// A direct reference to the leaf node addressed by this index.
/// This must only be dereferenced while we own a tree with a matching
/// version.
@usableFromInline
internal var _leaf: _UnmanagedLeaf?
@inlinable
internal init(
version: _RopeVersion, path: _Path, leaf: __shared _UnmanagedLeaf?
) {
self._version = version
self._path = path
self._leaf = leaf
}
}
}
extension Rope.Index {
@inlinable
internal static var _invalid: Self {
Self(version: _RopeVersion(0), path: _RopePath(_value: .max), leaf: nil)
}
@inlinable
internal var _isValid: Bool {
_path._value != .max
}
}
extension Rope.Index: Equatable {
@inlinable
public static func ==(left: Self, right: Self) -> Bool {
left._path == right._path
}
}
extension Rope.Index: Hashable {
@inlinable
public func hash(into hasher: inout Hasher) {
hasher.combine(_path)
}
}
extension Rope.Index: Comparable {
@inlinable
public static func <(left: Self, right: Self) -> Bool {
left._path < right._path
}
}
extension Rope.Index: CustomStringConvertible {
public var description: String {
"\(_path)"
}
}
extension Rope.Index {
@inlinable
internal var _height: UInt8 {
_path.height
}
@inlinable
internal func _isEmpty(below height: UInt8) -> Bool {
_path.isEmpty(below: height)
}
@inlinable
internal mutating func _clear(below height: UInt8) {
_path.clear(below: height)
}
}
|