12
12
13
13
struct NCContainer : ~ Copyable {
14
14
let ptr : UnsafeRawBufferPointer
15
- init ( _ ptr: UnsafeRawBufferPointer ) {
15
+ let c : Int
16
+ init ( _ ptr: UnsafeRawBufferPointer , _ c: Int ) {
16
17
self . ptr = ptr
18
+ self . c = c
17
19
}
18
20
}
19
21
20
22
struct NEContainer : ~ Escapable {
21
23
let ptr : UnsafeRawBufferPointer
24
+ let c : Int
22
25
@_unsafeNonescapableResult
23
- init ( _ ptr: UnsafeRawBufferPointer ) {
26
+ init ( _ ptr: UnsafeRawBufferPointer , _ c : Int ) {
24
27
self . ptr = ptr
28
+ self . c = c
25
29
}
26
30
}
27
31
28
32
struct View : ~ Escapable {
29
33
let ptr : UnsafeRawBufferPointer
34
+ let c : Int
30
35
@_unsafeNonescapableResult
31
- init ( _ ptr: UnsafeRawBufferPointer ) {
36
+ init ( _ ptr: UnsafeRawBufferPointer , _ c : Int ) {
32
37
self . ptr = ptr
38
+ self . c = c
33
39
}
34
40
init ( _ otherBV: borrowing View ) {
35
41
self . ptr = otherBV. ptr
42
+ self . c = otherBV. c
36
43
}
37
44
init ( _ k: borrowing NCContainer ) {
38
45
self . ptr = k. ptr
46
+ self . c = k. c
39
47
}
40
48
init ( _ k: consuming NEContainer ) {
41
49
self . ptr = k. ptr
50
+ self . c = k. c
42
51
}
43
52
}
44
53
45
54
struct MutableView : ~ Copyable, ~ Escapable {
46
55
let ptr : UnsafeRawBufferPointer
56
+ let c : Int
47
57
@_unsafeNonescapableResult
48
- init ( _ ptr: UnsafeRawBufferPointer ) {
58
+ init ( _ ptr: UnsafeRawBufferPointer , _ c : Int ) {
49
59
self . ptr = ptr
60
+ self . c = c
50
61
}
51
62
init ( _ otherBV: borrowing View ) {
52
63
self . ptr = otherBV. ptr
64
+ self . c = otherBV. c
53
65
}
54
66
init ( _ k: borrowing NCContainer ) {
55
67
self . ptr = k. ptr
68
+ self . c = k. c
56
69
}
57
70
init ( _ k: consuming NEContainer ) {
58
71
self . ptr = k. ptr
72
+ self . c = k. c
59
73
}
60
74
}
61
75
@@ -72,24 +86,24 @@ func getConsumingView(_ x: consuming NEContainer) -> _consume(x) View {
72
86
}
73
87
74
88
func getConsumingView( _ x: consuming View ) -> _consume( x ) View {
75
- return View ( x. ptr)
89
+ return View ( x. ptr, x . c )
76
90
}
77
91
78
92
func getBorrowingView( _ x: borrowing View ) -> _borrow( x ) View {
79
- return View ( x. ptr)
93
+ return View ( x. ptr, x . c )
80
94
}
81
95
82
96
func getBorrowingView( _ x: borrowing NCContainer ) -> _borrow( x ) View {
83
- return View ( x. ptr)
97
+ return View ( x. ptr, x . c )
84
98
}
85
99
86
100
func getBorrowingView( _ x: borrowing NEContainer ) -> _borrow( x ) View {
87
- return View ( x. ptr)
101
+ return View ( x. ptr, x . c )
88
102
}
89
103
90
104
func test1( _ a: Array < Int > ) {
91
105
a. withUnsafeBytes {
92
- var x = NEContainer ( $0)
106
+ var x = NEContainer ( $0, a . count )
93
107
mutate ( & x)
94
108
let view = getConsumingView ( x)
95
109
let newView = View ( view)
@@ -100,7 +114,7 @@ func test1(_ a: Array<Int>) {
100
114
101
115
func test2( _ a: Array < Int > ) {
102
116
a. withUnsafeBytes {
103
- var x = NCContainer ( $0)
117
+ var x = NCContainer ( $0, a . count )
104
118
mutate ( & x)
105
119
let view = getBorrowingView ( x)
106
120
use ( view)
@@ -110,7 +124,7 @@ func test2(_ a: Array<Int>) {
110
124
111
125
func test3( _ a: Array < Int > ) {
112
126
a. withUnsafeBytes {
113
- var x = View ( $0)
127
+ var x = View ( $0, a . count )
114
128
mutate ( & x)
115
129
let view = getConsumingView ( x)
116
130
use ( view)
@@ -123,7 +137,7 @@ func test3(_ a: Array<Int>) {
123
137
// def-use chain involving a stack temporary
124
138
func test4(_ a: Array<Int>) {
125
139
a.withUnsafeBytes {
126
- var x = NCContainer($0)
140
+ var x = NCContainer($0, a.count )
127
141
mutate(&x)
128
142
let view = MutableView(x)
129
143
use(view)
@@ -134,7 +148,7 @@ func test4(_ a: Array<Int>) {
134
148
135
149
func test5( _ a: Array < Int > ) {
136
150
a. withUnsafeBytes {
137
- let x = NEContainer ( $0)
151
+ let x = NEContainer ( $0, a . count )
138
152
let view = getBorrowingView ( x)
139
153
let anotherView = getConsumingView ( view)
140
154
use ( anotherView)
@@ -144,7 +158,7 @@ func test5(_ a: Array<Int>) {
144
158
func test6( _ a: Array < Int > ) {
145
159
var p : View ?
146
160
a. withUnsafeBytes {
147
- var x = NCContainer ( $0)
161
+ var x = NCContainer ( $0, a . count )
148
162
mutate ( & x)
149
163
let view = View ( x)
150
164
p = view
@@ -153,7 +167,7 @@ func test6(_ a: Array<Int>) {
153
167
}
154
168
155
169
func test7( _ a: UnsafeRawBufferPointer ) {
156
- var x = NEContainer ( a)
170
+ var x = NEContainer ( a, a . count )
157
171
do {
158
172
let view = getBorrowingView ( x)
159
173
use ( view)
@@ -163,10 +177,36 @@ func test7(_ a: UnsafeRawBufferPointer) {
163
177
164
178
func test8( _ a: Array < Int > ) {
165
179
a. withUnsafeBytes {
166
- var x = NEContainer ( $0)
180
+ var x = NEContainer ( $0, a . count )
167
181
mutate ( & x)
168
182
let view = MutableView ( x)
169
183
use ( view)
170
184
consume ( view)
171
185
}
172
186
}
187
+
188
+ struct Wrapper : ~ Escapable {
189
+ var _view : View
190
+ var view : View {
191
+ _read {
192
+ yield _view
193
+ }
194
+ _modify {
195
+ yield & _view
196
+ }
197
+ }
198
+ init ( _ view: consuming View ) {
199
+ self . _view = view
200
+ }
201
+ }
202
+
203
+ func test9( ) {
204
+ let a = [ Int] ( repeating: 0 , count: 4 )
205
+ a. withUnsafeBytes {
206
+ let view = View ( $0, a. count)
207
+ var c = Wrapper ( view)
208
+ use ( c. view)
209
+ mutate ( & c. view)
210
+ }
211
+ }
212
+
0 commit comments