@@ -26,7 +26,7 @@ import std
26
26
27
27
// Structure to hold the buffered data
28
28
pub struct Buffer < CAPACITY : u32 > {
29
- contents : bits [CAPACITY ],
29
+ content : bits [CAPACITY ],
30
30
length : u32
31
31
}
32
32
@@ -50,19 +50,19 @@ pub fn buffer_can_fit<CAPACITY: u32, DSIZE: u32>(buffer: Buffer<CAPACITY>, data:
50
50
51
51
#[test ]
52
52
fn test_buffer_can_fit () {
53
- let buffer = Buffer < u32 :32 > { contents : u32 :0 , length : u32 :0 };
53
+ let buffer = Buffer < u32 :32 > { content : u32 :0 , length : u32 :0 };
54
54
assert_eq (buffer_can_fit (buffer , bits [0 ]:0 ), true);
55
55
assert_eq (buffer_can_fit (buffer , u16 :0 ), true);
56
56
assert_eq (buffer_can_fit (buffer , u32 :0 ), true);
57
57
assert_eq (buffer_can_fit (buffer , u33 :0 ), false);
58
58
59
- let buffer = Buffer < u32 :32 > { contents : u32 :0 , length : u32 :16 };
59
+ let buffer = Buffer < u32 :32 > { content : u32 :0 , length : u32 :16 };
60
60
assert_eq (buffer_can_fit (buffer , bits [0 ]:0 ), true);
61
61
assert_eq (buffer_can_fit (buffer , u16 :0 ), true);
62
62
assert_eq (buffer_can_fit (buffer , u17 :0 ), false);
63
63
assert_eq (buffer_can_fit (buffer , u32 :0 ), false);
64
64
65
- let buffer = Buffer < u32 :32 > { contents : u32 :0 , length : u32 :32 };
65
+ let buffer = Buffer < u32 :32 > { content : u32 :0 , length : u32 :32 };
66
66
assert_eq (buffer_can_fit (buffer , bits [0 ]:0 ), true);
67
67
assert_eq (buffer_can_fit (buffer , u1 :0 ), false);
68
68
assert_eq (buffer_can_fit (buffer , u16 :0 ), false);
@@ -76,19 +76,19 @@ pub fn buffer_has_at_least<CAPACITY: u32>(buffer: Buffer<CAPACITY>, length: u32)
76
76
77
77
#[test ]
78
78
fn test_buffer_has_at_least () {
79
- let buffer = Buffer { contents : u32 :0 , length : u32 :0 };
79
+ let buffer = Buffer { content : u32 :0 , length : u32 :0 };
80
80
assert_eq (buffer_has_at_least (buffer , u32 :0 ), true);
81
81
assert_eq (buffer_has_at_least (buffer , u32 :16 ), false);
82
82
assert_eq (buffer_has_at_least (buffer , u32 :32 ), false);
83
83
assert_eq (buffer_has_at_least (buffer , u32 :33 ), false);
84
84
85
- let buffer = Buffer { contents : u32 :0 , length : u32 :16 };
85
+ let buffer = Buffer { content : u32 :0 , length : u32 :16 };
86
86
assert_eq (buffer_has_at_least (buffer , u32 :0 ), true);
87
87
assert_eq (buffer_has_at_least (buffer , u32 :16 ), true);
88
88
assert_eq (buffer_has_at_least (buffer , u32 :32 ), false);
89
89
assert_eq (buffer_has_at_least (buffer , u32 :33 ), false);
90
90
91
- let buffer = Buffer { contents : u32 :0 , length : u32 :32 };
91
+ let buffer = Buffer { content : u32 :0 , length : u32 :32 };
92
92
assert_eq (buffer_has_at_least (buffer , u32 :0 ), true);
93
93
assert_eq (buffer_has_at_least (buffer , u32 :16 ), true);
94
94
assert_eq (buffer_has_at_least (buffer , u32 :32 ), true);
@@ -104,19 +104,19 @@ pub fn buffer_append<CAPACITY: u32, DSIZE: u32> (buffer: Buffer<CAPACITY>, data:
104
104
fail !("not_enough_space" , buffer )
105
105
} else {
106
106
Buffer {
107
- contents : (data as bits [CAPACITY ] << buffer .length ) | buffer .contents ,
107
+ content : (data as bits [CAPACITY ] << buffer .length ) | buffer .content ,
108
108
length : DSIZE + buffer .length
109
109
}
110
110
}
111
111
}
112
112
113
113
#[test ]
114
114
fn test_buffer_append () {
115
- let buffer = Buffer { contents : u32 :0 , length : u32 :0 };
115
+ let buffer = Buffer { content : u32 :0 , length : u32 :0 };
116
116
let buffer = buffer_append (buffer , u16 :0xBEEF );
117
- assert_eq (buffer , Buffer { contents : u32 :0xBEEF , length : u32 :16 });
117
+ assert_eq (buffer , Buffer { content : u32 :0xBEEF , length : u32 :16 });
118
118
let buffer = buffer_append (buffer , u16 :0xDEAD );
119
- assert_eq (buffer , Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 });
119
+ assert_eq (buffer , Buffer { content : u32 :0xDEADBEEF , length : u32 :32 });
120
120
}
121
121
122
122
// Returns a new buffer with the `data` appended to the original `buffer` if
@@ -129,7 +129,7 @@ pub fn buffer_append_checked<CAPACITY: u32, DSIZE: u32> (buffer: Buffer<CAPACITY
129
129
BufferResult {
130
130
status : BufferStatus ::OK ,
131
131
buffer : Buffer {
132
- contents : (data as bits [CAPACITY ] << buffer .length ) | buffer .contents ,
132
+ content : (data as bits [CAPACITY ] << buffer .length ) | buffer .content ,
133
133
length : DSIZE + buffer .length
134
134
}
135
135
}
@@ -138,18 +138,18 @@ pub fn buffer_append_checked<CAPACITY: u32, DSIZE: u32> (buffer: Buffer<CAPACITY
138
138
139
139
#[test ]
140
140
fn test_buffer_append_checked () {
141
- let buffer = Buffer { contents : u32 :0 , length : u32 :0 };
141
+ let buffer = Buffer { content : u32 :0 , length : u32 :0 };
142
142
143
143
let result1 = buffer_append_checked (buffer , u16 :0xBEEF );
144
144
assert_eq (result1 , BufferResult {
145
145
status : BufferStatus ::OK ,
146
- buffer : Buffer { contents : u32 :0xBEEF , length : u32 :16 }
146
+ buffer : Buffer { content : u32 :0xBEEF , length : u32 :16 }
147
147
});
148
148
149
149
let result2 = buffer_append_checked (result1 .buffer , u16 :0xDEAD );
150
150
assert_eq (result2 , BufferResult {
151
151
status : BufferStatus ::OK ,
152
- buffer : Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 }
152
+ buffer : Buffer { content : u32 :0xDEADBEEF , length : u32 :32 }
153
153
});
154
154
155
155
let result3 = buffer_append_checked (result2 .buffer , u16 :0xCAFE );
@@ -173,23 +173,23 @@ pub fn buffer_pop<CAPACITY: u32>(buffer: Buffer<CAPACITY>, length: u32) -> (Buff
173
173
let mask = (bits [CAPACITY ]:1 << length ) - bits [CAPACITY ]:1 ;
174
174
(
175
175
Buffer {
176
- contents : buffer .contents >> length ,
176
+ content : buffer .content >> length ,
177
177
length : buffer .length - length
178
178
},
179
- buffer .contents & mask
179
+ buffer .content & mask
180
180
)
181
181
}
182
182
}
183
183
184
184
#[test ]
185
185
fn test_buffer_pop () {
186
- let buffer = Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 };
186
+ let buffer = Buffer { content : u32 :0xDEADBEEF , length : u32 :32 };
187
187
let (buffer , data ) = buffer_pop (buffer , u32 :16 );
188
188
assert_eq (data , u32 :0xBEEF );
189
- assert_eq (buffer , Buffer { contents : u32 :0xDEAD , length : u32 :16 });
189
+ assert_eq (buffer , Buffer { content : u32 :0xDEAD , length : u32 :16 });
190
190
let (buffer , data ) = buffer_pop (buffer , u32 :16 );
191
191
assert_eq (data , u32 :0xDEAD );
192
- assert_eq (buffer , Buffer { contents : u32 :0 , length : u32 :0 });
192
+ assert_eq (buffer , Buffer { content : u32 :0 , length : u32 :0 });
193
193
}
194
194
195
195
// Returns `length` amount of data from a `buffer`, a new buffer with
@@ -210,30 +210,30 @@ pub fn buffer_pop_checked<CAPACITY: u32> (buffer: Buffer<CAPACITY>, length: u32)
210
210
BufferResult {
211
211
status : BufferStatus ::OK ,
212
212
buffer : Buffer {
213
- contents : buffer .contents >> length ,
213
+ content : buffer .content >> length ,
214
214
length : buffer .length - length
215
215
}
216
216
},
217
- buffer .contents & mask
217
+ buffer .content & mask
218
218
)
219
219
}
220
220
}
221
221
222
222
#[test ]
223
223
fn test_buffer_pop_checked () {
224
- let buffer = Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 };
224
+ let buffer = Buffer { content : u32 :0xDEADBEEF , length : u32 :32 };
225
225
226
226
let (result1 , data1 ) = buffer_pop_checked (buffer , u32 :16 );
227
227
assert_eq (result1 , BufferResult {
228
228
status : BufferStatus ::OK ,
229
- buffer : Buffer { contents : u32 :0xDEAD , length : u32 :16 }
229
+ buffer : Buffer { content : u32 :0xDEAD , length : u32 :16 }
230
230
});
231
231
assert_eq (data1 , u32 :0xBEEF );
232
232
233
233
let (result2 , data2 ) = buffer_pop_checked (result1 .buffer , u32 :16 );
234
234
assert_eq (result2 , BufferResult {
235
235
status : BufferStatus ::OK ,
236
- buffer : Buffer { contents : u32 :0 , length : u32 :0 }
236
+ buffer : Buffer { content : u32 :0 , length : u32 :0 }
237
237
});
238
238
assert_eq (data2 , u32 :0xDEAD );
239
239
@@ -255,13 +255,13 @@ pub fn buffer_fixed_pop<CAPACITY: u32, DSIZE: u32> (buffer: Buffer<CAPACITY>) ->
255
255
256
256
#[test ]
257
257
fn test_buffer_fixed_pop () {
258
- let buffer = Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 };
258
+ let buffer = Buffer { content : u32 :0xDEADBEEF , length : u32 :32 };
259
259
let (buffer , data ) = buffer_fixed_pop < u32 :32 , u32 :16 > (buffer );
260
260
assert_eq (data , u16 :0xBEEF );
261
- assert_eq (buffer , Buffer { contents : u32 :0xDEAD , length : u32 :16 });
261
+ assert_eq (buffer , Buffer { content : u32 :0xDEAD , length : u32 :16 });
262
262
let (buffer , data ) = buffer_fixed_pop < u32 :32 , u32 :16 > (buffer );
263
263
assert_eq (data , u16 :0xDEAD );
264
- assert_eq (buffer , Buffer { contents : u32 :0 , length : u32 :0 });
264
+ assert_eq (buffer , Buffer { content : u32 :0 , length : u32 :0 });
265
265
}
266
266
267
267
// Behaves like `buffer_pop_checked` except that the length of the popped data
@@ -273,18 +273,18 @@ pub fn buffer_fixed_pop_checked<CAPACITY: u32, DSIZE: u32> (buffer: Buffer<CAPAC
273
273
274
274
#[test ]
275
275
fn test_buffer_fixed_pop_checked () {
276
- let buffer = Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 };
276
+ let buffer = Buffer { content : u32 :0xDEADBEEF , length : u32 :32 };
277
277
let (result1 , data1 ) = buffer_fixed_pop_checked < u32 :32 , u32 :16 > (buffer );
278
278
assert_eq (result1 , BufferResult {
279
279
status : BufferStatus ::OK ,
280
- buffer : Buffer { contents : u32 :0xDEAD , length : u32 :16 }
280
+ buffer : Buffer { content : u32 :0xDEAD , length : u32 :16 }
281
281
});
282
282
assert_eq (data1 , u16 :0xBEEF );
283
283
284
284
let (result2 , data2 ) = buffer_fixed_pop_checked < u32 :32 , u32 :16 > (result1 .buffer );
285
285
assert_eq (result2 , BufferResult {
286
286
status : BufferStatus ::OK ,
287
- buffer : Buffer { contents : u32 :0 , length : u32 :0 }
287
+ buffer : Buffer { content : u32 :0 , length : u32 :0 }
288
288
});
289
289
assert_eq (data2 , u16 :0xDEAD );
290
290
@@ -305,13 +305,13 @@ pub fn buffer_peek<CAPACITY: u32>(buffer: Buffer<CAPACITY>, length: u32) -> bits
305
305
fail !("not_enough_data" , bits [CAPACITY ]:0 )
306
306
} else {
307
307
let mask = (bits [CAPACITY ]:1 << length ) - bits [CAPACITY ]:1 ;
308
- buffer .contents & mask
308
+ buffer .content & mask
309
309
}
310
310
}
311
311
312
312
#[test ]
313
313
fn test_buffer_peek () {
314
- let buffer = Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 };
314
+ let buffer = Buffer { content : u32 :0xDEADBEEF , length : u32 :32 };
315
315
assert_eq (buffer_peek (buffer , u32 :0 ), u32 :0 );
316
316
assert_eq (buffer_peek (buffer , u32 :16 ), u32 :0xBEEF );
317
317
assert_eq (buffer_peek (buffer , u32 :32 ), u32 :0xDEADBEEF );
@@ -325,13 +325,13 @@ pub fn buffer_peek_checked<CAPACITY: u32> (buffer: Buffer<CAPACITY>, length: u32
325
325
(BufferStatus ::NO_ENOUGH_DATA , bits [CAPACITY ]:0 )
326
326
} else {
327
327
let mask = (bits [CAPACITY ]:1 << length ) - bits [CAPACITY ]:1 ;
328
- (BufferStatus ::OK , buffer .contents & mask )
328
+ (BufferStatus ::OK , buffer .content & mask )
329
329
}
330
330
}
331
331
332
332
#[test ]
333
333
fn test_buffer_peek_checked () {
334
- let buffer = Buffer { contents : u32 :0xDEADBEEF , length : u32 :32 };
334
+ let buffer = Buffer { content : u32 :0xDEADBEEF , length : u32 :32 };
335
335
336
336
let (status1 , data1 ) = buffer_peek_checked (buffer , u32 :0 );
337
337
assert_eq (status1 , BufferStatus ::OK );
@@ -352,10 +352,73 @@ fn test_buffer_peek_checked() {
352
352
353
353
// Creates a new buffer
354
354
pub fn buffer_new < CAPACITY : u32 > () -> Buffer < CAPACITY > {
355
- Buffer { contents : bits [CAPACITY ]:0 , length : u32 :0 }
355
+ Buffer { content : bits [CAPACITY ]:0 , length : u32 :0 }
356
356
}
357
357
358
358
#[test ]
359
359
fn test_buffer_new () {
360
- assert_eq (buffer_new < u32 :32 > (), Buffer { contents : u32 :0 , length : u32 :0 });
360
+ assert_eq (buffer_new < u32 :32 > (), Buffer { content : u32 :0 , length : u32 :0 });
361
+ }
362
+
363
+ // Example use case
364
+ //
365
+ // The Buffer structure is meant to aggregate data received from the Proc's
366
+ // channels. This data may be collected in multiple evaluations of the next
367
+ // functions. Once the required amount of data is collected, it can be poped-out
368
+ // in chanks of any length. A simple example that shows how the Buffer structure
369
+ // can be used is presented below. It uses the structure to combine several
370
+ // smaller transactions into bigger ones.
371
+
372
+ proc BufferExampleUsage {
373
+ input_r : chan < u32 > in ;
374
+ output_s : chan < u48 > out ;
375
+
376
+ config (
377
+ input_r : chan < u32 > in ,
378
+ output_s : chan < u48 > out
379
+ ) { (input_r , output_s ) }
380
+
381
+ init { buffer_new < u32 :64 > () }
382
+
383
+ next (tok : token , buffer : Buffer < u32 :64 > ) {
384
+ let (tok , recv_data ) = recv (tok , input_r );
385
+ let buffer = buffer_append < u32 :64 > (buffer , recv_data );
386
+
387
+ if buffer .length >= u32 :48 {
388
+ let (buffer , data_to_send ) = buffer_fixed_pop < u32 :64 , u32 :48 > (buffer );
389
+ let tok = send (tok , output_s , data_to_send );
390
+ buffer
391
+ } else {
392
+ buffer
393
+ }
394
+ }
395
+ }
396
+
397
+ #[test_proc ]
398
+ proc BufferExampleUsageTest {
399
+ terminator : chan < bool > out ;
400
+ data32_s : chan < u32 > out ;
401
+ data48_r : chan < u48 > in ;
402
+
403
+ config (terminator : chan < bool > out ) {
404
+ let (data32_s , data32_r ) = chan < u32 > ;
405
+ let (data48_s , data48_r ) = chan < u48 > ;
406
+ spawn BufferExampleUsage (data32_r , data48_s );
407
+ (terminator , data32_s , data48_r )
408
+ }
409
+
410
+ init {}
411
+
412
+ next (tok : token , state : ()) {
413
+ let tok = send (tok , data32_s , u32 :0xDEADBEEF );
414
+ let tok = send (tok , data32_s , u32 :0xBEEFCAFE );
415
+ let tok = send (tok , data32_s , u32 :0xCAFEDEAD );
416
+
417
+ let (tok , received_data ) = recv (tok , data48_r );
418
+ assert_eq (received_data , u48 :0xCAFE _DEAD_BEEF );
419
+ let (tok , received_data ) = recv (tok , data48_r );
420
+ assert_eq (received_data , u48 :0xCAFE _DEAD_BEEF );
421
+
422
+ send (tok , terminator , true);
423
+ }
361
424
}
0 commit comments