@@ -236,7 +236,7 @@ use ptr;
236
236
/// See the [module-level documentation](index.html) for more.
237
237
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
238
238
#[ repr( transparent) ]
239
- pub struct Cell < T > {
239
+ pub struct Cell < T : ? Sized > {
240
240
value : UnsafeCell < T > ,
241
241
}
242
242
@@ -287,10 +287,10 @@ impl<T:Copy> Cell<T> {
287
287
}
288
288
289
289
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
290
- unsafe impl < T > Send for Cell < T > where T : Send { }
290
+ unsafe impl < T : ? Sized > Send for Cell < T > where T : Send { }
291
291
292
292
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
293
- impl < T > !Sync for Cell < T > { }
293
+ impl < T : ? Sized > !Sync for Cell < T > { }
294
294
295
295
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
296
296
impl < T : Copy > Clone for Cell < T > {
@@ -381,46 +381,6 @@ impl<T> Cell<T> {
381
381
}
382
382
}
383
383
384
- /// Returns a raw pointer to the underlying data in this cell.
385
- ///
386
- /// # Examples
387
- ///
388
- /// ```
389
- /// use std::cell::Cell;
390
- ///
391
- /// let c = Cell::new(5);
392
- ///
393
- /// let ptr = c.as_ptr();
394
- /// ```
395
- #[ inline]
396
- #[ stable( feature = "cell_as_ptr" , since = "1.12.0" ) ]
397
- pub fn as_ptr ( & self ) -> * mut T {
398
- self . value . get ( )
399
- }
400
-
401
- /// Returns a mutable reference to the underlying data.
402
- ///
403
- /// This call borrows `Cell` mutably (at compile-time) which guarantees
404
- /// that we possess the only reference.
405
- ///
406
- /// # Examples
407
- ///
408
- /// ```
409
- /// use std::cell::Cell;
410
- ///
411
- /// let mut c = Cell::new(5);
412
- /// *c.get_mut() += 1;
413
- ///
414
- /// assert_eq!(c.get(), 6);
415
- /// ```
416
- #[ inline]
417
- #[ stable( feature = "cell_get_mut" , since = "1.11.0" ) ]
418
- pub fn get_mut ( & mut self ) -> & mut T {
419
- unsafe {
420
- & mut * self . value . get ( )
421
- }
422
- }
423
-
424
384
/// Sets the contained value.
425
385
///
426
386
/// # Examples
@@ -499,6 +459,70 @@ impl<T> Cell<T> {
499
459
}
500
460
}
501
461
462
+ impl < T : ?Sized > Cell < T > {
463
+ /// Returns a raw pointer to the underlying data in this cell.
464
+ ///
465
+ /// # Examples
466
+ ///
467
+ /// ```
468
+ /// use std::cell::Cell;
469
+ ///
470
+ /// let c = Cell::new(5);
471
+ ///
472
+ /// let ptr = c.as_ptr();
473
+ /// ```
474
+ #[ inline]
475
+ #[ stable( feature = "cell_as_ptr" , since = "1.12.0" ) ]
476
+ pub fn as_ptr ( & self ) -> * mut T {
477
+ self . value . get ( )
478
+ }
479
+
480
+ /// Returns a mutable reference to the underlying data.
481
+ ///
482
+ /// This call borrows `Cell` mutably (at compile-time) which guarantees
483
+ /// that we possess the only reference.
484
+ ///
485
+ /// # Examples
486
+ ///
487
+ /// ```
488
+ /// use std::cell::Cell;
489
+ ///
490
+ /// let mut c = Cell::new(5);
491
+ /// *c.get_mut() += 1;
492
+ ///
493
+ /// assert_eq!(c.get(), 6);
494
+ /// ```
495
+ #[ inline]
496
+ #[ stable( feature = "cell_get_mut" , since = "1.11.0" ) ]
497
+ pub fn get_mut ( & mut self ) -> & mut T {
498
+ unsafe {
499
+ & mut * self . value . get ( )
500
+ }
501
+ }
502
+
503
+ /// Returns a `&Cell<T>` from a `&mut T`
504
+ ///
505
+ /// # Examples
506
+ ///
507
+ /// ```
508
+ /// #![feature(as_cell)]
509
+ /// use std::cell::Cell;
510
+ ///
511
+ /// let slice: &mut [i32] = &mut [1, 2, 3];
512
+ /// let cell_slice: &Cell<[i32]> = Cell::from_mut(slice);
513
+ /// let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
514
+ ///
515
+ /// assert_eq!(slice_cell.len(), 3);
516
+ /// ```
517
+ #[ inline]
518
+ #[ unstable( feature = "as_cell" , issue="43038" ) ]
519
+ pub fn from_mut ( t : & mut T ) -> & Cell < T > {
520
+ unsafe {
521
+ & * ( t as * mut T as * const Cell < T > )
522
+ }
523
+ }
524
+ }
525
+
502
526
impl < T : Default > Cell < T > {
503
527
/// Takes the value of the cell, leaving `Default::default()` in its place.
504
528
///
@@ -522,6 +546,29 @@ impl<T: Default> Cell<T> {
522
546
#[ unstable( feature = "coerce_unsized" , issue = "27732" ) ]
523
547
impl < T : CoerceUnsized < U > , U > CoerceUnsized < Cell < U > > for Cell < T > { }
524
548
549
+ impl < T > Cell < [ T ] > {
550
+ /// Returns a `&[Cell<T>]` from a `&Cell<[T]>`
551
+ ///
552
+ /// # Examples
553
+ ///
554
+ /// ```
555
+ /// #![feature(as_cell)]
556
+ /// use std::cell::Cell;
557
+ ///
558
+ /// let slice: &mut [i32] = &mut [1, 2, 3];
559
+ /// let cell_slice: &Cell<[i32]> = Cell::from_mut(slice);
560
+ /// let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
561
+ ///
562
+ /// assert_eq!(slice_cell.len(), 3);
563
+ /// ```
564
+ #[ unstable( feature = "as_cell" , issue="43038" ) ]
565
+ pub fn as_slice_of_cells ( & self ) -> & [ Cell < T > ] {
566
+ unsafe {
567
+ & * ( self as * const Cell < [ T ] > as * const [ Cell < T > ] )
568
+ }
569
+ }
570
+ }
571
+
525
572
/// A mutable memory location with dynamically checked borrow rules
526
573
///
527
574
/// See the [module-level documentation](index.html) for more.
0 commit comments