@@ -2,6 +2,7 @@ use crate::{unlikely, AllocAll, Owns};
2
2
use core:: {
3
3
alloc:: { AllocErr , AllocInit , AllocRef , Layout , MemoryBlock , ReallocPlacement } ,
4
4
fmt,
5
+ mem:: MaybeUninit ,
5
6
ptr:: { self , NonNull } ,
6
7
} ;
7
8
@@ -14,8 +15,9 @@ use core::{
14
15
///
15
16
/// use alloc_compose::{Owns, Region};
16
17
/// use core::alloc::{AllocInit, AllocRef, Layout};
18
+ /// use core::mem::MaybeUninit;
17
19
///
18
- /// let mut data = [0 ; 64];
20
+ /// let mut data = [MaybeUninit::new(0) ; 64];
19
21
/// let mut region = Region::new(&mut data);
20
22
///
21
23
/// let memory = region.alloc(Layout::new::<u32>(), AllocInit::Uninitialized)?;
@@ -27,22 +29,22 @@ use core::{
27
29
/// ```rust
28
30
/// # #![feature(allocator_api)]
29
31
/// # use alloc_compose::{Owns, Region};
30
- /// # use core::alloc::{AllocInit, AllocRef, Layout};
31
- /// # let mut data = [0 ; 64];
32
+ /// # use core::{ alloc::{AllocInit, AllocRef, Layout}, mem::MaybeUninit };
33
+ /// # let mut data = [MaybeUninit::new(0) ; 64];
32
34
/// # let mut region = Region::new(&mut data);
33
35
/// # let memory = region.alloc(Layout::new::<u32>(), AllocInit::Uninitialized)?;
34
36
/// unsafe { region.dealloc(memory.ptr, Layout::new::<u32>()) };
35
37
/// assert!(!region.owns(memory));
36
38
/// # Ok::<(), core::alloc::AllocErr>(())
37
39
/// ```
38
40
pub struct Region < ' a > {
39
- data : & ' a mut [ u8 ] ,
41
+ data : & ' a mut [ MaybeUninit < u8 > ] ,
40
42
ptr : usize ,
41
43
}
42
44
43
45
impl < ' a > Region < ' a > {
44
46
#[ inline]
45
- pub fn new ( data : & ' a mut [ u8 ] ) -> Self {
47
+ pub fn new ( data : & ' a mut [ MaybeUninit < u8 > ] ) -> Self {
46
48
let ptr = data. as_ptr ( ) as usize + data. len ( ) ;
47
49
let region = Self { data, ptr } ;
48
50
debug_assert ! ( region. is_empty( ) ) ;
@@ -252,23 +254,43 @@ mod tests {
252
254
253
255
#[ test]
254
256
fn alloc_zero ( ) {
255
- let mut data = [ 1 ; 32 ] ;
257
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
256
258
let mut region = Region :: new ( & mut data) ;
257
259
258
260
assert_eq ! ( region. capacity( ) , 32 ) ;
259
261
assert ! ( region. is_empty( ) ) ;
260
262
261
263
region
262
- . alloc ( Layout :: new :: < [ u8 ; 0 ] > ( ) , AllocInit :: Zeroed )
264
+ . alloc ( Layout :: new :: < [ u8 ; 0 ] > ( ) , AllocInit :: Uninitialized )
263
265
. expect ( "Could not allocated 0 bytes" ) ;
264
266
assert ! ( region. is_empty( ) ) ;
265
267
266
- assert_eq ! ( data, [ 1 ; 32 ] ) ;
268
+ unsafe {
269
+ assert_eq ! ( MaybeUninit :: slice_get_ref( & data) , & [ 1 ; 32 ] [ ..] ) ;
270
+ }
271
+ }
272
+
273
+ #[ test]
274
+ fn alloc_zeroed ( ) {
275
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
276
+ let mut region = Region :: new ( & mut data) ;
277
+
278
+ assert_eq ! ( region. capacity( ) , 32 ) ;
279
+ assert ! ( region. is_empty( ) ) ;
280
+
281
+ region
282
+ . alloc ( Layout :: new :: < [ u8 ; 32 ] > ( ) , AllocInit :: Zeroed )
283
+ . expect ( "Could not allocated 32 bytes" ) ;
284
+ assert ! ( !region. is_empty( ) ) ;
285
+
286
+ unsafe {
287
+ assert_eq ! ( MaybeUninit :: slice_get_ref( & data) , & [ 0 ; 32 ] [ ..] ) ;
288
+ }
267
289
}
268
290
269
291
#[ test]
270
292
fn alloc_all ( ) {
271
- let mut data = [ 1 ; 32 ] ;
293
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
272
294
let mut region = Region :: new ( & mut data) ;
273
295
274
296
assert_eq ! ( region. capacity( ) , 32 ) ;
@@ -299,7 +321,7 @@ mod tests {
299
321
300
322
#[ test]
301
323
fn alloc_small ( ) {
302
- let mut data = [ 1 ; 32 ] ;
324
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
303
325
let mut region = Region :: new ( & mut data) ;
304
326
305
327
assert_eq ! ( region. capacity( ) , 32 ) ;
@@ -310,39 +332,30 @@ mod tests {
310
332
. expect ( "Could not allocated 16 bytes" ) ;
311
333
assert_eq ! ( region. capacity_left( ) , 16 ) ;
312
334
313
- assert_eq ! ( & data[ 0 ..16 ] , & [ 1 ; 16 ] [ ..] ) ;
314
- assert_eq ! ( & data[ 16 ..] , & [ 0 ; 16 ] [ ..] ) ;
315
- }
316
-
317
- #[ test]
318
- fn alloc_full ( ) {
319
- let mut data = [ 1 ; 32 ] ;
320
- let mut region = Region :: new ( & mut data) ;
321
-
322
- region
323
- . alloc ( Layout :: new :: < [ u8 ; 32 ] > ( ) , AllocInit :: Zeroed )
324
- . expect ( "Could not allocated 32 bytes" ) ;
325
- assert_eq ! ( region. capacity_left( ) , 0 ) ;
326
-
327
- assert_eq ! ( data, [ 0 ; 32 ] ) ;
335
+ unsafe {
336
+ assert_eq ! ( MaybeUninit :: slice_get_ref( & data[ 0 ..16 ] ) , & [ 1 ; 16 ] [ ..] ) ;
337
+ assert_eq ! ( MaybeUninit :: slice_get_ref( & data[ 16 ..] ) , & [ 0 ; 16 ] [ ..] ) ;
338
+ }
328
339
}
329
340
330
341
#[ test]
331
342
fn alloc_uninitialzed ( ) {
332
- let mut data = [ 1 ; 32 ] ;
343
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
333
344
let mut region = Region :: new ( & mut data) ;
334
345
335
346
region
336
347
. alloc ( Layout :: new :: < [ u8 ; 32 ] > ( ) , AllocInit :: Uninitialized )
337
348
. expect ( "Could not allocated 32 bytes" ) ;
338
349
assert_eq ! ( region. capacity_left( ) , 0 ) ;
339
350
340
- assert_eq ! ( data, [ 1 ; 32 ] ) ;
351
+ unsafe {
352
+ assert_eq ! ( MaybeUninit :: slice_get_ref( & data) , & [ 1 ; 32 ] [ ..] ) ;
353
+ }
341
354
}
342
355
343
356
#[ test]
344
357
fn alloc_fail ( ) {
345
- let mut data = [ 1 ; 32 ] ;
358
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
346
359
let mut region = Region :: new ( & mut data) ;
347
360
348
361
region
@@ -380,7 +393,7 @@ mod tests {
380
393
381
394
#[ test]
382
395
fn dealloc ( ) {
383
- let mut data = [ 1 ; 32 ] ;
396
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
384
397
let mut region = Region :: new ( & mut data) ;
385
398
let layout = Layout :: from_size_align ( 8 , 1 ) . expect ( "Invalid layout" ) ;
386
399
@@ -417,7 +430,7 @@ mod tests {
417
430
418
431
#[ test]
419
432
fn realloc ( ) {
420
- let mut data = [ 1 ; 32 ] ;
433
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
421
434
let mut region = Region :: new ( & mut data) ;
422
435
let layout = Layout :: from_size_align ( 8 , 1 ) . expect ( "Invalid layout" ) ;
423
436
@@ -479,7 +492,7 @@ mod tests {
479
492
)
480
493
} ;
481
494
482
- let mut data = [ 1 ; 32 ] ;
495
+ let mut data = [ MaybeUninit :: new ( 1 ) ; 32 ] ;
483
496
let mut region = Region :: new ( & mut data) ;
484
497
test_output ( & region) ;
485
498
0 commit comments