Skip to content

Commit

Permalink
Update Preference System (#56)
Browse files Browse the repository at this point in the history
* Update NextUpdate

* Add PreferenceInputs and PreferenceOutputs

* Update PreferenceBridge implementation

* Update VersionSeed implementation

* Add HostPreferencesCombiner implementation

* Add PreferenceCombiner implementation

* Remove unnecessary @_transparent

* Add wrapInputs and wrapOutputs

* Update HostPreferenceKey call

* Fix Linux build issue
  • Loading branch information
Kyle-Ye committed Apr 1, 2024
1 parent dbd7899 commit 664fbac
Show file tree
Hide file tree
Showing 20 changed files with 670 additions and 109 deletions.
4 changes: 4 additions & 0 deletions Sources/OpenSwiftUI/Core/Attribute/AsyncAttribute.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ internal import OpenGraphShims

protocol AsyncAttribute: _AttributeBody {}

extension AsyncAttribute {
static var flags: OGAttributeTypeFlags { [] }
}

extension Attribute {
func syncMainIfReferences<V>(do body: (Value) -> V) -> V {
fatalError("TODO")
Expand Down
1 change: 0 additions & 1 deletion Sources/OpenSwiftUI/Core/Data/BloomFilter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ struct BloomFilter: Equatable {
self.init(hashValue: Int(bitPattern: pointer))
}

@_transparent
@inline(__always)
func match(_ filter: BloomFilter) -> Bool {
(value & filter.value) == value
Expand Down
2 changes: 0 additions & 2 deletions Sources/OpenSwiftUI/Core/Data/Property/PropertyList.swift
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,6 @@ extension PropertyList {

// MARK: - PropertyList.Tracker Helper functions

@_transparent
@inline(__always)
private func match(data: TrackerData, plist: PropertyList) -> Bool {
if let elements = plist.elements,
Expand All @@ -396,7 +395,6 @@ private func match(data: TrackerData, plist: PropertyList) -> Bool {
}
}

@_transparent
@inline(__always)
private func match(data: TrackerData, from: PropertyList, to: PropertyList) -> UniqueID? {
if let fromElement = from.elements,
Expand Down
56 changes: 35 additions & 21 deletions Sources/OpenSwiftUI/Core/Data/VersionSeed.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,44 @@

struct VersionSeed: CustomStringConvertible {
var value: UInt32

var description: String {
switch value {
case VersionSeed.zero.value: "empty"
case VersionSeed.empty.value: "empty"
case VersionSeed.invalid.value: "invalid"
default: value.description
}
}

static var zero: VersionSeed { VersionSeed(value: .zero) }

@inline(__always)
static var empty: VersionSeed { VersionSeed(value: .zero) }

@inline(__always)
static var invalid: VersionSeed { VersionSeed(value: .max) }

var isValid: Bool { value != VersionSeed.invalid.value }

@_transparent

@inline(__always)
var isInvalid: Bool { value == VersionSeed.invalid.value }

@inline(__always)
var isEmpty: Bool { value == VersionSeed.empty.value }

@inline(__always)
func merge(_ seed: VersionSeed) -> VersionSeed {
if isValid, seed.value == .zero {
self
} else if value == .zero, seed.isValid {
seed
} else {
VersionSeed(value: merge32(value, seed.value))
mutating func merge(_ other: VersionSeed) {
guard !isInvalid, !other.isEmpty else {
return
}
guard !isEmpty, !other.isInvalid else {
self = other
return
}
self = VersionSeed(value: merge32(value, other.value))
}

@inline(__always)
func merging(_ seed: VersionSeed) -> VersionSeed {
var newValue = self
newValue.merge(seed)
return newValue
}
}

Expand All @@ -57,11 +71,11 @@ struct VersionSeedTracker<Key: HostPreferenceKey> {

struct VersionSeedSetTracker {
private var values: [Value]

mutating func addPreference<Key: HostPreferenceKey>(_: Key.Type) {
values.append(Value(key: _AnyPreferenceKey<Key>.self, seed: .invalid))
}

mutating func updateSeeds(to preferences: PreferenceList) {
for index in values.indices {
var visitor = UpdateSeedVisitor(preferences: preferences, seed: nil)
Expand All @@ -86,17 +100,17 @@ extension VersionSeedSetTracker {
let preferences: PreferenceList
var seed: VersionSeed
var matches: Bool?

mutating func visit(key: (some PreferenceKey).Type) {
let valueSeed = preferences[key].seed
matches = seed.isValid && valueSeed.isValid && seed.value == valueSeed.value
matches = !seed.isInvalid && !valueSeed.isInvalid && seed.value == valueSeed.value
}
}

private struct UpdateSeedVisitor: PreferenceKeyVisitor {
let preferences: PreferenceList
var seed: VersionSeed?

mutating func visit(key: (some PreferenceKey).Type) {
seed = preferences[key].seed
}
Expand Down
13 changes: 13 additions & 0 deletions Sources/OpenSwiftUI/Core/Render/DisplayList.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// FIXME
struct DisplayList {}

// FIXME
extension DisplayList {
struct Key: PreferenceKey {
static var defaultValue: Void = ()

static func reduce(value _: inout Void, nextValue _: () -> Void) {}

typealias Value = Void
}
}
14 changes: 8 additions & 6 deletions Sources/OpenSwiftUI/Core/View/TODO/_ViewInputs.swift
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
internal import OpenGraphShims

public struct _ViewInputs {
var base: _GraphInputs
// var preferences : PreferencesInputs
// var transform : Attribute<ViewTransform>
// var position : Attribute<ViewOrigin>
// var containerPosition : Attribute<ViewOrigin>
// var size : Attribute<ViewSize>
// var safeAreaInsets : OptionalAttribute<SafeAreaInsets>
var preferences: PreferencesInputs
var transform: Attribute<ViewTransform>
var position: Attribute<ViewOrigin>
var containerPosition: Attribute<ViewOrigin>
var size: Attribute<ViewSize>
// var safeAreaInsets: OptionalAttribute<SafeAreaInsets>
}
12 changes: 10 additions & 2 deletions Sources/OpenSwiftUI/Core/View/TODO/_ViewOutputs.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
internal import OpenGraphShims

public struct _ViewOutputs {
// var preferences : PreferencesOutputs
// var _layoutComputer : OptionalAttribute<LayoutComputer>
private var preferences = PreferencesOutputs()
@OptionalAttribute
var layoutComputer: LayoutComputer?

subscript<Key: PreferenceKey>(_ keyType: Key.Type) -> Attribute<Key.Value>? {
get { preferences[keyType] }
set { preferences[keyType] = newValue }
}
}
33 changes: 32 additions & 1 deletion Sources/OpenSwiftUI/Core/View/ViewGraph.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ final class ViewGraph: GraphHost {
var mainUpdates: Int = 0
var needsFocusUpdate: Bool = false
var nextUpdate: (views: NextUpdate, gestures: NextUpdate) = (NextUpdate(time: .infinity), NextUpdate(time: .infinity))
private weak var _preferenceBridge: PreferenceBridge?
var preferenceBridge: PreferenceBridge? {
get { _preferenceBridge }
// FIXME: TO BE CONFIRMED
set { setPreferenceBridge(to: newValue, isInvalidating: newValue == nil) }
}
#if canImport(Darwin) // FIXME: See #39
var bridgedPreferences: [(AnyPreferenceKey.Type, OGAttribute)] = []
#endif
// TODO

init<Body: View>(rootViewType: Body.Type, requestedOutputs: Outputs) {
Expand Down Expand Up @@ -148,6 +157,14 @@ final class ViewGraph: GraphHost {
return []
}

func clearPreferenceBridge() {
setPreferenceBridge(to: nil, isInvalidating: true)
}

private func setPreferenceBridge(to bridge: PreferenceBridge?, isInvalidating: Bool) {
// TODO
}

// MARK: - Override Methods

override var graphDelegate: GraphDelegate? { delegate }
Expand All @@ -165,7 +182,7 @@ final class ViewGraph: GraphHost {
}

override func timeDidChange() {
// TODO
nextUpdate.views = NextUpdate(time: .infinity)
}

override func isHiddenForReuseDidChange() {
Expand All @@ -185,6 +202,20 @@ extension ViewGraph {
_interval = .infinity
reasons = []
}

// TODO: AnimatorState.nextUpdate
mutating func interval(_ value: Double, reason: UInt32?) {
if value == .zero {
if _interval > 1 / 60 {
_interval = .infinity
}
} else {
_interval = min(value, _interval)
}
if let reason {
reasons.insert(reason)
}
}
}
}

Expand Down
12 changes: 0 additions & 12 deletions Sources/OpenSwiftUI/Data/Preference/HostPreferenceKey.swift

This file was deleted.

12 changes: 11 additions & 1 deletion Sources/OpenSwiftUI/Data/Preference/HostPreferencesKey.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,18 @@
// ID: 7429200566949B8FB892A77E01A988C8

struct HostPreferencesKey: PreferenceKey {
private static var nodeId: UInt32 = .zero
static var defaultValue: PreferenceList {
PreferenceList()
}

static func reduce(value: inout PreferenceList, nextValue: () -> PreferenceList) {
value.merge(nextValue())
}
}

extension HostPreferencesKey {
private static var nodeId: UInt32 = .zero

@inline(__always)
static func makeNodeID() -> UInt32 {
defer { nodeId &+= 1 }
Expand Down
Loading

0 comments on commit 664fbac

Please sign in to comment.