Skip to content

Commit 664fbac

Browse files
authored
Update Preference System (#56)
* 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
1 parent dbd7899 commit 664fbac

20 files changed

+670
-109
lines changed

Sources/OpenSwiftUI/Core/Attribute/AsyncAttribute.swift

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ internal import OpenGraphShims
99

1010
protocol AsyncAttribute: _AttributeBody {}
1111

12+
extension AsyncAttribute {
13+
static var flags: OGAttributeTypeFlags { [] }
14+
}
15+
1216
extension Attribute {
1317
func syncMainIfReferences<V>(do body: (Value) -> V) -> V {
1418
fatalError("TODO")

Sources/OpenSwiftUI/Core/Data/BloomFilter.swift

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ struct BloomFilter: Equatable {
2222
self.init(hashValue: Int(bitPattern: pointer))
2323
}
2424

25-
@_transparent
2625
@inline(__always)
2726
func match(_ filter: BloomFilter) -> Bool {
2827
(value & filter.value) == value

Sources/OpenSwiftUI/Core/Data/Property/PropertyList.swift

-2
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,6 @@ extension PropertyList {
383383

384384
// MARK: - PropertyList.Tracker Helper functions
385385

386-
@_transparent
387386
@inline(__always)
388387
private func match(data: TrackerData, plist: PropertyList) -> Bool {
389388
if let elements = plist.elements,
@@ -396,7 +395,6 @@ private func match(data: TrackerData, plist: PropertyList) -> Bool {
396395
}
397396
}
398397

399-
@_transparent
400398
@inline(__always)
401399
private func match(data: TrackerData, from: PropertyList, to: PropertyList) -> UniqueID? {
402400
if let fromElement = from.elements,

Sources/OpenSwiftUI/Core/Data/VersionSeed.swift

+35-21
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,44 @@
88

99
struct VersionSeed: CustomStringConvertible {
1010
var value: UInt32
11-
11+
1212
var description: String {
1313
switch value {
14-
case VersionSeed.zero.value: "empty"
14+
case VersionSeed.empty.value: "empty"
1515
case VersionSeed.invalid.value: "invalid"
1616
default: value.description
1717
}
1818
}
19-
20-
static var zero: VersionSeed { VersionSeed(value: .zero) }
19+
20+
@inline(__always)
21+
static var empty: VersionSeed { VersionSeed(value: .zero) }
22+
23+
@inline(__always)
2124
static var invalid: VersionSeed { VersionSeed(value: .max) }
22-
23-
var isValid: Bool { value != VersionSeed.invalid.value }
24-
25-
@_transparent
25+
26+
@inline(__always)
27+
var isInvalid: Bool { value == VersionSeed.invalid.value }
28+
29+
@inline(__always)
30+
var isEmpty: Bool { value == VersionSeed.empty.value }
31+
2632
@inline(__always)
27-
func merge(_ seed: VersionSeed) -> VersionSeed {
28-
if isValid, seed.value == .zero {
29-
self
30-
} else if value == .zero, seed.isValid {
31-
seed
32-
} else {
33-
VersionSeed(value: merge32(value, seed.value))
33+
mutating func merge(_ other: VersionSeed) {
34+
guard !isInvalid, !other.isEmpty else {
35+
return
3436
}
37+
guard !isEmpty, !other.isInvalid else {
38+
self = other
39+
return
40+
}
41+
self = VersionSeed(value: merge32(value, other.value))
42+
}
43+
44+
@inline(__always)
45+
func merging(_ seed: VersionSeed) -> VersionSeed {
46+
var newValue = self
47+
newValue.merge(seed)
48+
return newValue
3549
}
3650
}
3751

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

5872
struct VersionSeedSetTracker {
5973
private var values: [Value]
60-
74+
6175
mutating func addPreference<Key: HostPreferenceKey>(_: Key.Type) {
6276
values.append(Value(key: _AnyPreferenceKey<Key>.self, seed: .invalid))
6377
}
64-
78+
6579
mutating func updateSeeds(to preferences: PreferenceList) {
6680
for index in values.indices {
6781
var visitor = UpdateSeedVisitor(preferences: preferences, seed: nil)
@@ -86,17 +100,17 @@ extension VersionSeedSetTracker {
86100
let preferences: PreferenceList
87101
var seed: VersionSeed
88102
var matches: Bool?
89-
103+
90104
mutating func visit(key: (some PreferenceKey).Type) {
91105
let valueSeed = preferences[key].seed
92-
matches = seed.isValid && valueSeed.isValid && seed.value == valueSeed.value
106+
matches = !seed.isInvalid && !valueSeed.isInvalid && seed.value == valueSeed.value
93107
}
94108
}
95-
109+
96110
private struct UpdateSeedVisitor: PreferenceKeyVisitor {
97111
let preferences: PreferenceList
98112
var seed: VersionSeed?
99-
113+
100114
mutating func visit(key: (some PreferenceKey).Type) {
101115
seed = preferences[key].seed
102116
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// FIXME
2+
struct DisplayList {}
3+
4+
// FIXME
5+
extension DisplayList {
6+
struct Key: PreferenceKey {
7+
static var defaultValue: Void = ()
8+
9+
static func reduce(value _: inout Void, nextValue _: () -> Void) {}
10+
11+
typealias Value = Void
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
internal import OpenGraphShims
2+
13
public struct _ViewInputs {
24
var base: _GraphInputs
3-
// var preferences : PreferencesInputs
4-
// var transform : Attribute<ViewTransform>
5-
// var position : Attribute<ViewOrigin>
6-
// var containerPosition : Attribute<ViewOrigin>
7-
// var size : Attribute<ViewSize>
8-
// var safeAreaInsets : OptionalAttribute<SafeAreaInsets>
5+
var preferences: PreferencesInputs
6+
var transform: Attribute<ViewTransform>
7+
var position: Attribute<ViewOrigin>
8+
var containerPosition: Attribute<ViewOrigin>
9+
var size: Attribute<ViewSize>
10+
// var safeAreaInsets: OptionalAttribute<SafeAreaInsets>
911
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1+
internal import OpenGraphShims
2+
13
public struct _ViewOutputs {
2-
// var preferences : PreferencesOutputs
3-
// var _layoutComputer : OptionalAttribute<LayoutComputer>
4+
private var preferences = PreferencesOutputs()
5+
@OptionalAttribute
6+
var layoutComputer: LayoutComputer?
7+
8+
subscript<Key: PreferenceKey>(_ keyType: Key.Type) -> Attribute<Key.Value>? {
9+
get { preferences[keyType] }
10+
set { preferences[keyType] = newValue }
11+
}
412
}

Sources/OpenSwiftUI/Core/View/ViewGraph.swift

+32-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@ final class ViewGraph: GraphHost {
4141
var mainUpdates: Int = 0
4242
var needsFocusUpdate: Bool = false
4343
var nextUpdate: (views: NextUpdate, gestures: NextUpdate) = (NextUpdate(time: .infinity), NextUpdate(time: .infinity))
44+
private weak var _preferenceBridge: PreferenceBridge?
45+
var preferenceBridge: PreferenceBridge? {
46+
get { _preferenceBridge }
47+
// FIXME: TO BE CONFIRMED
48+
set { setPreferenceBridge(to: newValue, isInvalidating: newValue == nil) }
49+
}
50+
#if canImport(Darwin) // FIXME: See #39
51+
var bridgedPreferences: [(AnyPreferenceKey.Type, OGAttribute)] = []
52+
#endif
4453
// TODO
4554

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

160+
func clearPreferenceBridge() {
161+
setPreferenceBridge(to: nil, isInvalidating: true)
162+
}
163+
164+
private func setPreferenceBridge(to bridge: PreferenceBridge?, isInvalidating: Bool) {
165+
// TODO
166+
}
167+
151168
// MARK: - Override Methods
152169

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

167184
override func timeDidChange() {
168-
// TODO
185+
nextUpdate.views = NextUpdate(time: .infinity)
169186
}
170187

171188
override func isHiddenForReuseDidChange() {
@@ -185,6 +202,20 @@ extension ViewGraph {
185202
_interval = .infinity
186203
reasons = []
187204
}
205+
206+
// TODO: AnimatorState.nextUpdate
207+
mutating func interval(_ value: Double, reason: UInt32?) {
208+
if value == .zero {
209+
if _interval > 1 / 60 {
210+
_interval = .infinity
211+
}
212+
} else {
213+
_interval = min(value, _interval)
214+
}
215+
if let reason {
216+
reasons.insert(reason)
217+
}
218+
}
188219
}
189220
}
190221

Sources/OpenSwiftUI/Data/Preference/HostPreferenceKey.swift

-12
This file was deleted.

Sources/OpenSwiftUI/Data/Preference/HostPreferencesKey.swift

+11-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,18 @@
77
// ID: 7429200566949B8FB892A77E01A988C8
88

99
struct HostPreferencesKey: PreferenceKey {
10-
private static var nodeId: UInt32 = .zero
10+
static var defaultValue: PreferenceList {
11+
PreferenceList()
12+
}
1113

14+
static func reduce(value: inout PreferenceList, nextValue: () -> PreferenceList) {
15+
value.merge(nextValue())
16+
}
17+
}
18+
19+
extension HostPreferencesKey {
20+
private static var nodeId: UInt32 = .zero
21+
1222
@inline(__always)
1323
static func makeNodeID() -> UInt32 {
1424
defer { nodeId &+= 1 }

0 commit comments

Comments
 (0)