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
//
//===----------------------------------------------------------------------===//
/// An ordered data structure of `Element` values that organizes itself into a tree.
/// The rope is augmented by the commutative group specified by `Element.Summary`, enabling
/// quick lookup operations.
@frozen // Not really! This module isn't ABI stable.
public struct Rope<Element: RopeElement> {
@usableFromInline
internal var _root: _Node?
@usableFromInline
internal var _version: _RopeVersion
@inlinable
public init() {
self._root = nil
self._version = _RopeVersion()
}
@inlinable
internal init(root: _Node?) {
self._root = root
self._version = _RopeVersion()
}
@inlinable
internal var root: _Node {
@inline(__always) get { _root.unsafelyUnwrapped }
@inline(__always) _modify { yield &_root! }
}
@inlinable
public init(_ value: Element) {
self._root = .createLeaf(_Item(value))
self._version = _RopeVersion()
}
}
extension Rope: Sendable where Element: Sendable {}
extension Rope {
@inlinable
internal mutating func _ensureUnique() {
guard _root != nil else { return }
root.ensureUnique()
}
}
extension Rope {
@inlinable
public var isSingleton: Bool {
guard _root != nil else { return false }
return root.isSingleton
}
}
extension Rope {
@inlinable
public func isIdentical(to other: Self) -> Bool {
self._root?.object === other._root?.object
}
}
|