6 This crate provides the _owning reference_ types `OwningRef` and `OwningRefMut`
7 that enables it to bundle a reference together with the owner of the data it points to.
8 This allows moving and dropping of an `OwningRef` without needing to recreate the reference.
10 This can sometimes be useful because Rust borrowing rules normally prevent
11 moving a type that has been moved from. For example, this kind of code gets rejected:
14 fn return_owned_and_referenced<'a>() -> (Vec<u8>, &'a [u8]) {
15 let v = vec![1, 2, 3, 4];
21 Even though, from a memory-layout point of view, this can be entirely safe
22 if the new location of the vector still lives longer than the lifetime `'a`
23 of the reference because the backing allocation of the vector does not change.
25 This library enables this safe usage by keeping the owner and the reference
26 bundled together in a wrapper type that ensure that lifetime constraint:
29 # extern crate owning_ref;
30 # use owning_ref::OwningRef;
32 fn return_owned_and_referenced() -> OwningRef<Vec<u8>, [u8]> {
33 let v = vec![1, 2, 3, 4];
34 let or = OwningRef::new(v);
35 let or = or.map(|v| &v[1..3]);
41 It works by requiring owner types to dereference to stable memory locations
42 and preventing mutable access to root containers, which in practice requires heap allocation
43 as provided by `Box<T>`, `Rc<T>`, etc.
45 Also provided are typedefs for common owner type combinations,
46 which allow for less verbose type signatures.
47 For example, `BoxRef<T>` instead of `OwningRef<Box<T>, T>`.
49 The crate also provides the more advanced `OwningHandle` type,
50 which allows more freedom in bundling a dependent handle object
51 along with the data it depends on, at the cost of some unsafe needed in the API.
52 See the documentation around `OwningHandle` for more details.
59 extern crate owning_ref;
60 use owning_ref::BoxRef;
63 // Create an array owned by a Box.
64 let arr = Box::new([1, 2, 3, 4]) as Box<[i32]>;
66 // Transfer into a BoxRef.
67 let arr: BoxRef<[i32]> = BoxRef::new(arr);
68 assert_eq!(&*arr, &[1, 2, 3, 4]);
70 // We can slice the array without losing ownership or changing type.
71 let arr: BoxRef<[i32]> = arr.map(|arr| &arr[1..3]);
72 assert_eq!(&*arr, &[2, 3]);
74 // Also works for Arc, Rc, String and Vec!
78 ## Caching a reference to a struct field
81 extern crate owning_ref;
82 use owning_ref::BoxRef;
91 let foo = Foo { tag: 1, x: 100, y: 200, z: 300 };
93 let or = BoxRef::new(Box::new(foo)).map(|foo| {
102 assert_eq!(*or, 200);
106 ## Caching a reference to an entry in a vector
109 extern crate owning_ref;
110 use owning_ref::VecRef;
113 let v = VecRef::new(vec![1, 2, 3, 4, 5]).map(|v| &v[3]);
118 ## Caching a subslice of a String
121 extern crate owning_ref;
122 use owning_ref::StringRef;
125 let s = StringRef::new("hello world".to_owned())
126 .map(|s| s.split(' ').nth(1).unwrap());
128 assert_eq!(&*s, "world");
132 ## Reference counted slices that share ownership of the backing storage
135 extern crate owning_ref;
136 use owning_ref::RcRef;
140 let rc: RcRef<[i32]> = RcRef::new(Rc::new([1, 2, 3, 4]) as Rc<[i32]>);
141 assert_eq!(&*rc, &[1, 2, 3, 4]);
143 let rc_a: RcRef<[i32]> = rc.clone().map(|s| &s[0..2]);
144 let rc_b = rc.clone().map(|s| &s[1..3]);
145 let rc_c = rc.clone().map(|s| &s[2..4]);
146 assert_eq!(&*rc_a, &[1, 2]);
147 assert_eq!(&*rc_b, &[2, 3]);
148 assert_eq!(&*rc_c, &[3, 4]);
150 let rc_c_a = rc_c.clone().map(|s| &s[1]);
151 assert_eq!(&*rc_c_a, &4);
155 ## Atomic reference counted slices that share ownership of the backing storage
158 extern crate owning_ref;
159 use owning_ref::ArcRef;
165 fn par_sum(rc: ArcRef<[i32]>) -> i32 {
168 } else if rc.len() == 1 {
171 let mid = rc.len() / 2;
172 let left = rc.clone().map(|s| &s[..mid]);
173 let right = rc.map(|s| &s[mid..]);
175 let left = thread::spawn(move || par_sum(left));
176 let right = thread::spawn(move || par_sum(right));
178 left.join().unwrap() + right.join().unwrap()
181 let rc: Arc<[i32]> = Arc::new([1, 2, 3, 4]);
182 let rc: ArcRef<[i32]> = rc.into();
184 assert_eq!(par_sum(rc), 10);
188 ## References into RAII locks
191 extern crate owning_ref;
192 use owning_ref::RefRef;
193 use std::cell::{RefCell, Ref};
196 let refcell = RefCell::new((1, 2, 3, 4));
197 // Also works with Mutex and RwLock
200 let refref = RefRef::new(refcell.borrow()).map(|x| &x.3);
201 assert_eq!(*refref, 4);
203 // We move the RAII lock and the reference to one of
204 // the subfields in the data it guards here:
208 assert_eq!(*refref, 4);
212 assert_eq!(*refcell.borrow(), (1, 2, 3, 4));
218 When the owned container implements `DerefMut`, it is also possible to make
219 a _mutable owning reference_. (e.g., with `Box`, `RefMut`, `MutexGuard`)
222 extern crate owning_ref;
223 use owning_ref::RefMutRefMut;
224 use std::cell::{RefCell, RefMut};
227 let refcell = RefCell::new((1, 2, 3, 4));
229 let mut refmut_refmut = {
230 let mut refmut_refmut = RefMutRefMut::new(refcell.borrow_mut()).map_mut(|x| &mut x.3);
231 assert_eq!(*refmut_refmut, 4);
237 assert_eq!(*refmut_refmut, 8);
242 assert_eq!(*refcell.borrow(), (1, 2, 3, 16));
247 pub use stable_deref_trait::{
248 CloneStableDeref as CloneStableAddress, StableDeref as StableAddress,
252 /// An owning reference.
254 /// This wraps an owner `O` and a reference `&T` pointing
255 /// at something reachable from `O::Target` while keeping
256 /// the ability to move `self` around.
258 /// The owner is usually a pointer that points at some base type.
260 /// For more details and examples, see the module and method docs.
261 pub struct OwningRef<O, T: ?Sized> {
266 /// An mutable owning reference.
268 /// This wraps an owner `O` and a reference `&mut T` pointing
269 /// at something reachable from `O::Target` while keeping
270 /// the ability to move `self` around.
272 /// The owner is usually a pointer that points at some base type.
274 /// For more details and examples, see the module and method docs.
275 pub struct OwningRefMut<O, T: ?Sized> {
280 /// Helper trait for an erased concrete type an owner dereferences to.
281 /// This is used in form of a trait object for keeping
282 /// something around to (virtually) call the destructor.
284 impl<T> Erased for T {}
286 /// Helper trait for erasing the concrete type of what an owner dereferences to,
287 /// for example `Box<T> -> Box<Erased>`. This would be unneeded with
288 /// higher kinded types support in the language.
289 #[allow(unused_lifetimes)]
290 pub unsafe trait IntoErased<'a> {
291 /// Owner with the dereference type substituted to `Erased`.
293 /// Performs the type erasure.
294 fn into_erased(self) -> Self::Erased;
297 /// Helper trait for erasing the concrete type of what an owner dereferences to,
298 /// for example `Box<T> -> Box<Erased + Send>`. This would be unneeded with
299 /// higher kinded types support in the language.
300 #[allow(unused_lifetimes)]
301 pub unsafe trait IntoErasedSend<'a> {
302 /// Owner with the dereference type substituted to `Erased + Send`.
304 /// Performs the type erasure.
305 fn into_erased_send(self) -> Self::Erased;
308 /// Helper trait for erasing the concrete type of what an owner dereferences to,
309 /// for example `Box<T> -> Box<Erased + Send + Sync>`. This would be unneeded with
310 /// higher kinded types support in the language.
311 #[allow(unused_lifetimes)]
312 pub unsafe trait IntoErasedSendSync<'a> {
313 /// Owner with the dereference type substituted to `Erased + Send + Sync`.
314 type Erased: Send + Sync;
315 /// Performs the type erasure.
316 fn into_erased_send_sync(self) -> Self::Erased;
319 /////////////////////////////////////////////////////////////////////////////
321 /////////////////////////////////////////////////////////////////////////////
323 impl<O, T: ?Sized> OwningRef<O, T> {
324 /// Creates a new owning reference from an owner
325 /// initialized to the direct dereference of it.
329 /// extern crate owning_ref;
330 /// use owning_ref::OwningRef;
333 /// let owning_ref = OwningRef::new(Box::new(42));
334 /// assert_eq!(*owning_ref, 42);
337 pub fn new(o: O) -> Self
340 O: Deref<Target = T>,
342 OwningRef { reference: &*o, owner: o }
345 /// Like `new`, but doesn’t require `O` to implement the `StableAddress` trait.
346 /// Instead, the caller is responsible to make the same promises as implementing the trait.
348 /// This is useful for cases where coherence rules prevents implementing the trait
349 /// without adding a dependency to this crate in a third-party library.
350 pub unsafe fn new_assert_stable_address(o: O) -> Self
352 O: Deref<Target = T>,
354 OwningRef { reference: &*o, owner: o }
357 /// Converts `self` into a new owning reference that points at something reachable
358 /// from the previous one.
360 /// This can be a reference to a field of `U`, something reachable from a field of
361 /// `U`, or even something unrelated with a `'static` lifetime.
365 /// extern crate owning_ref;
366 /// use owning_ref::OwningRef;
369 /// let owning_ref = OwningRef::new(Box::new([1, 2, 3, 4]));
371 /// // create an owning reference that points at the
372 /// // third element of the array.
373 /// let owning_ref = owning_ref.map(|array| &array[2]);
374 /// assert_eq!(*owning_ref, 3);
377 pub fn map<F, U: ?Sized>(self, f: F) -> OwningRef<O, U>
382 OwningRef { reference: f(&self), owner: self.owner }
385 /// Tries to convert `self` into a new owning reference that points
386 /// at something reachable from the previous one.
388 /// This can be a reference to a field of `U`, something reachable from a field of
389 /// `U`, or even something unrelated with a `'static` lifetime.
393 /// extern crate owning_ref;
394 /// use owning_ref::OwningRef;
397 /// let owning_ref = OwningRef::new(Box::new([1, 2, 3, 4]));
399 /// // create an owning reference that points at the
400 /// // third element of the array.
401 /// let owning_ref = owning_ref.try_map(|array| {
402 /// if array[2] == 3 { Ok(&array[2]) } else { Err(()) }
404 /// assert_eq!(*owning_ref.unwrap(), 3);
407 pub fn try_map<F, U: ?Sized, E>(self, f: F) -> Result<OwningRef<O, U>, E>
410 F: FnOnce(&T) -> Result<&U, E>,
412 Ok(OwningRef { reference: f(&self)?, owner: self.owner })
415 /// Converts `self` into a new owning reference with a different owner type.
417 /// The new owner type needs to still contain the original owner in some way
418 /// so that the reference into it remains valid. This function is marked unsafe
419 /// because the user needs to manually uphold this guarantee.
420 pub unsafe fn map_owner<F, P>(self, f: F) -> OwningRef<P, T>
426 OwningRef { reference: self.reference, owner: f(self.owner) }
429 /// Converts `self` into a new owning reference where the owner is wrapped
430 /// in an additional `Box<O>`.
432 /// This can be used to safely erase the owner of any `OwningRef<O, T>`
433 /// to an `OwningRef<Box<Erased>, T>`.
434 pub fn map_owner_box(self) -> OwningRef<Box<O>, T> {
435 OwningRef { reference: self.reference, owner: Box::new(self.owner) }
438 /// Erases the concrete base type of the owner with a trait object.
440 /// This allows mixing of owned references with different owner base types.
444 /// extern crate owning_ref;
445 /// use owning_ref::{OwningRef, Erased};
448 /// // N.B., using the concrete types here for explicitness.
449 /// // For less verbose code type aliases like `BoxRef` are provided.
451 /// let owning_ref_a: OwningRef<Box<[i32; 4]>, [i32; 4]>
452 /// = OwningRef::new(Box::new([1, 2, 3, 4]));
454 /// let owning_ref_b: OwningRef<Box<Vec<(i32, bool)>>, Vec<(i32, bool)>>
455 /// = OwningRef::new(Box::new(vec![(0, false), (1, true)]));
457 /// let owning_ref_a: OwningRef<Box<[i32; 4]>, i32>
458 /// = owning_ref_a.map(|a| &a[0]);
460 /// let owning_ref_b: OwningRef<Box<Vec<(i32, bool)>>, i32>
461 /// = owning_ref_b.map(|a| &a[1].0);
463 /// let owning_refs: [OwningRef<Box<Erased>, i32>; 2]
464 /// = [owning_ref_a.erase_owner(), owning_ref_b.erase_owner()];
466 /// assert_eq!(*owning_refs[0], 1);
467 /// assert_eq!(*owning_refs[1], 1);
470 pub fn erase_owner<'a>(self) -> OwningRef<O::Erased, T>
474 OwningRef { reference: self.reference, owner: self.owner.into_erased() }
477 /// Erases the concrete base type of the owner with a trait object which implements `Send`.
479 /// This allows mixing of owned references with different owner base types.
480 pub fn erase_send_owner<'a>(self) -> OwningRef<O::Erased, T>
482 O: IntoErasedSend<'a>,
484 OwningRef { reference: self.reference, owner: self.owner.into_erased_send() }
487 /// Erases the concrete base type of the owner with a trait object
488 /// which implements `Send` and `Sync`.
490 /// This allows mixing of owned references with different owner base types.
491 pub fn erase_send_sync_owner<'a>(self) -> OwningRef<O::Erased, T>
493 O: IntoErasedSendSync<'a>,
495 OwningRef { reference: self.reference, owner: self.owner.into_erased_send_sync() }
498 // UNIMPLEMENTED: wrap_owner
500 // FIXME: Naming convention?
501 /// A getter for the underlying owner.
502 pub fn owner(&self) -> &O {
506 // FIXME: Naming convention?
507 /// Discards the reference and retrieves the owner.
508 pub fn into_inner(self) -> O {
513 impl<O, T: ?Sized> OwningRefMut<O, T> {
514 /// Creates a new owning reference from an owner
515 /// initialized to the direct dereference of it.
519 /// extern crate owning_ref;
520 /// use owning_ref::OwningRefMut;
523 /// let owning_ref_mut = OwningRefMut::new(Box::new(42));
524 /// assert_eq!(*owning_ref_mut, 42);
527 pub fn new(mut o: O) -> Self
530 O: DerefMut<Target = T>,
532 OwningRefMut { reference: &mut *o, owner: o }
535 /// Like `new`, but doesn’t require `O` to implement the `StableAddress` trait.
536 /// Instead, the caller is responsible to make the same promises as implementing the trait.
538 /// This is useful for cases where coherence rules prevents implementing the trait
539 /// without adding a dependency to this crate in a third-party library.
540 pub unsafe fn new_assert_stable_address(mut o: O) -> Self
542 O: DerefMut<Target = T>,
544 OwningRefMut { reference: &mut *o, owner: o }
547 /// Converts `self` into a new _shared_ owning reference that points at
548 /// something reachable from the previous one.
550 /// This can be a reference to a field of `U`, something reachable from a field of
551 /// `U`, or even something unrelated with a `'static` lifetime.
555 /// extern crate owning_ref;
556 /// use owning_ref::OwningRefMut;
559 /// let owning_ref_mut = OwningRefMut::new(Box::new([1, 2, 3, 4]));
561 /// // create an owning reference that points at the
562 /// // third element of the array.
563 /// let owning_ref = owning_ref_mut.map(|array| &array[2]);
564 /// assert_eq!(*owning_ref, 3);
567 pub fn map<F, U: ?Sized>(mut self, f: F) -> OwningRef<O, U>
570 F: FnOnce(&mut T) -> &U,
572 OwningRef { reference: f(&mut self), owner: self.owner }
575 /// Converts `self` into a new _mutable_ owning reference that points at
576 /// something reachable from the previous one.
578 /// This can be a reference to a field of `U`, something reachable from a field of
579 /// `U`, or even something unrelated with a `'static` lifetime.
583 /// extern crate owning_ref;
584 /// use owning_ref::OwningRefMut;
587 /// let owning_ref_mut = OwningRefMut::new(Box::new([1, 2, 3, 4]));
589 /// // create an owning reference that points at the
590 /// // third element of the array.
591 /// let owning_ref_mut = owning_ref_mut.map_mut(|array| &mut array[2]);
592 /// assert_eq!(*owning_ref_mut, 3);
595 pub fn map_mut<F, U: ?Sized>(mut self, f: F) -> OwningRefMut<O, U>
598 F: FnOnce(&mut T) -> &mut U,
600 OwningRefMut { reference: f(&mut self), owner: self.owner }
603 /// Tries to convert `self` into a new _shared_ owning reference that points
604 /// at something reachable from the previous one.
606 /// This can be a reference to a field of `U`, something reachable from a field of
607 /// `U`, or even something unrelated with a `'static` lifetime.
611 /// extern crate owning_ref;
612 /// use owning_ref::OwningRefMut;
615 /// let owning_ref_mut = OwningRefMut::new(Box::new([1, 2, 3, 4]));
617 /// // create an owning reference that points at the
618 /// // third element of the array.
619 /// let owning_ref = owning_ref_mut.try_map(|array| {
620 /// if array[2] == 3 { Ok(&array[2]) } else { Err(()) }
622 /// assert_eq!(*owning_ref.unwrap(), 3);
625 pub fn try_map<F, U: ?Sized, E>(mut self, f: F) -> Result<OwningRef<O, U>, E>
628 F: FnOnce(&mut T) -> Result<&U, E>,
630 Ok(OwningRef { reference: f(&mut self)?, owner: self.owner })
633 /// Tries to convert `self` into a new _mutable_ owning reference that points
634 /// at something reachable from the previous one.
636 /// This can be a reference to a field of `U`, something reachable from a field of
637 /// `U`, or even something unrelated with a `'static` lifetime.
641 /// extern crate owning_ref;
642 /// use owning_ref::OwningRefMut;
645 /// let owning_ref_mut = OwningRefMut::new(Box::new([1, 2, 3, 4]));
647 /// // create an owning reference that points at the
648 /// // third element of the array.
649 /// let owning_ref_mut = owning_ref_mut.try_map_mut(|array| {
650 /// if array[2] == 3 { Ok(&mut array[2]) } else { Err(()) }
652 /// assert_eq!(*owning_ref_mut.unwrap(), 3);
655 pub fn try_map_mut<F, U: ?Sized, E>(mut self, f: F) -> Result<OwningRefMut<O, U>, E>
658 F: FnOnce(&mut T) -> Result<&mut U, E>,
660 Ok(OwningRefMut { reference: f(&mut self)?, owner: self.owner })
663 /// Converts `self` into a new owning reference with a different owner type.
665 /// The new owner type needs to still contain the original owner in some way
666 /// so that the reference into it remains valid. This function is marked unsafe
667 /// because the user needs to manually uphold this guarantee.
668 pub unsafe fn map_owner<F, P>(self, f: F) -> OwningRefMut<P, T>
674 OwningRefMut { reference: self.reference, owner: f(self.owner) }
677 /// Converts `self` into a new owning reference where the owner is wrapped
678 /// in an additional `Box<O>`.
680 /// This can be used to safely erase the owner of any `OwningRefMut<O, T>`
681 /// to an `OwningRefMut<Box<Erased>, T>`.
682 pub fn map_owner_box(self) -> OwningRefMut<Box<O>, T> {
683 OwningRefMut { reference: self.reference, owner: Box::new(self.owner) }
686 /// Erases the concrete base type of the owner with a trait object.
688 /// This allows mixing of owned references with different owner base types.
692 /// extern crate owning_ref;
693 /// use owning_ref::{OwningRefMut, Erased};
696 /// // N.B., using the concrete types here for explicitness.
697 /// // For less verbose code type aliases like `BoxRef` are provided.
699 /// let owning_ref_mut_a: OwningRefMut<Box<[i32; 4]>, [i32; 4]>
700 /// = OwningRefMut::new(Box::new([1, 2, 3, 4]));
702 /// let owning_ref_mut_b: OwningRefMut<Box<Vec<(i32, bool)>>, Vec<(i32, bool)>>
703 /// = OwningRefMut::new(Box::new(vec![(0, false), (1, true)]));
705 /// let owning_ref_mut_a: OwningRefMut<Box<[i32; 4]>, i32>
706 /// = owning_ref_mut_a.map_mut(|a| &mut a[0]);
708 /// let owning_ref_mut_b: OwningRefMut<Box<Vec<(i32, bool)>>, i32>
709 /// = owning_ref_mut_b.map_mut(|a| &mut a[1].0);
711 /// let owning_refs_mut: [OwningRefMut<Box<Erased>, i32>; 2]
712 /// = [owning_ref_mut_a.erase_owner(), owning_ref_mut_b.erase_owner()];
714 /// assert_eq!(*owning_refs_mut[0], 1);
715 /// assert_eq!(*owning_refs_mut[1], 1);
718 pub fn erase_owner<'a>(self) -> OwningRefMut<O::Erased, T>
722 OwningRefMut { reference: self.reference, owner: self.owner.into_erased() }
725 // UNIMPLEMENTED: wrap_owner
727 // FIXME: Naming convention?
728 /// A getter for the underlying owner.
729 pub fn owner(&self) -> &O {
733 // FIXME: Naming convention?
734 /// Discards the reference and retrieves the owner.
735 pub fn into_inner(self) -> O {
740 /////////////////////////////////////////////////////////////////////////////
742 /////////////////////////////////////////////////////////////////////////////
744 use std::ops::{Deref, DerefMut};
746 /// `OwningHandle` is a complement to `OwningRef`. Where `OwningRef` allows
747 /// consumers to pass around an owned object and a dependent reference,
748 /// `OwningHandle` contains an owned object and a dependent _object_.
750 /// `OwningHandle` can encapsulate a `RefMut` along with its associated
751 /// `RefCell`, or an `RwLockReadGuard` along with its associated `RwLock`.
752 /// However, the API is completely generic and there are no restrictions on
753 /// what types of owning and dependent objects may be used.
755 /// `OwningHandle` is created by passing an owner object (which dereferences
756 /// to a stable address) along with a callback which receives a pointer to
757 /// that stable location. The callback may then dereference the pointer and
758 /// mint a dependent object, with the guarantee that the returned object will
759 /// not outlive the referent of the pointer.
761 /// Since the callback needs to dereference a raw pointer, it requires `unsafe`
762 /// code. To avoid forcing this unsafety on most callers, the `ToHandle` trait is
763 /// implemented for common data structures. Types that implement `ToHandle` can
764 /// be wrapped into an `OwningHandle` without passing a callback.
765 pub struct OwningHandle<O, H>
774 impl<O, H> Deref for OwningHandle<O, H>
779 type Target = H::Target;
780 fn deref(&self) -> &H::Target {
785 unsafe impl<O, H> StableAddress for OwningHandle<O, H>
792 impl<O, H> DerefMut for OwningHandle<O, H>
797 fn deref_mut(&mut self) -> &mut H::Target {
798 self.handle.deref_mut()
802 /// Trait to implement the conversion of owner to handle for common types.
804 /// The type of handle to be encapsulated by the OwningHandle.
807 /// Given an appropriately-long-lived pointer to ourselves, create a
808 /// handle to be encapsulated by the `OwningHandle`.
809 unsafe fn to_handle(x: *const Self) -> Self::Handle;
812 /// Trait to implement the conversion of owner to mutable handle for common types.
813 pub trait ToHandleMut {
814 /// The type of handle to be encapsulated by the OwningHandle.
815 type HandleMut: DerefMut;
817 /// Given an appropriately-long-lived pointer to ourselves, create a
818 /// mutable handle to be encapsulated by the `OwningHandle`.
819 unsafe fn to_handle_mut(x: *const Self) -> Self::HandleMut;
822 impl<O, H> OwningHandle<O, H>
824 O: StableAddress<Target: ToHandle<Handle = H>>,
827 /// Creates a new `OwningHandle` for a type that implements `ToHandle`. For types
828 /// that don't implement `ToHandle`, callers may invoke `new_with_fn`, which accepts
829 /// a callback to perform the conversion.
830 pub fn new(o: O) -> Self {
831 OwningHandle::new_with_fn(o, |x| unsafe { O::Target::to_handle(x) })
835 impl<O, H> OwningHandle<O, H>
837 O: StableAddress<Target: ToHandleMut<HandleMut = H>>,
840 /// Creates a new mutable `OwningHandle` for a type that implements `ToHandleMut`.
841 pub fn new_mut(o: O) -> Self {
842 OwningHandle::new_with_fn(o, |x| unsafe { O::Target::to_handle_mut(x) })
846 impl<O, H> OwningHandle<O, H>
851 /// Creates a new OwningHandle. The provided callback will be invoked with
852 /// a pointer to the object owned by `o`, and the returned value is stored
853 /// as the object to which this `OwningHandle` will forward `Deref` and
855 pub fn new_with_fn<F>(o: O, f: F) -> Self
857 F: FnOnce(*const O::Target) -> H,
861 h = f(o.deref() as *const O::Target);
864 OwningHandle { handle: h, _owner: o }
867 /// Creates a new OwningHandle. The provided callback will be invoked with
868 /// a pointer to the object owned by `o`, and the returned value is stored
869 /// as the object to which this `OwningHandle` will forward `Deref` and
871 pub fn try_new<F, E>(o: O, f: F) -> Result<Self, E>
873 F: FnOnce(*const O::Target) -> Result<H, E>,
877 h = f(o.deref() as *const O::Target)?;
880 Ok(OwningHandle { handle: h, _owner: o })
884 /////////////////////////////////////////////////////////////////////////////
886 /////////////////////////////////////////////////////////////////////////////
888 use std::borrow::Borrow;
889 use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
890 use std::convert::From;
891 use std::fmt::{self, Debug};
892 use std::hash::{Hash, Hasher};
893 use std::marker::{Send, Sync};
895 impl<O, T: ?Sized> Deref for OwningRef<O, T> {
898 fn deref(&self) -> &T {
899 unsafe { &*self.reference }
903 impl<O, T: ?Sized> Deref for OwningRefMut<O, T> {
906 fn deref(&self) -> &T {
907 unsafe { &*self.reference }
911 impl<O, T: ?Sized> DerefMut for OwningRefMut<O, T> {
912 fn deref_mut(&mut self) -> &mut T {
913 unsafe { &mut *self.reference }
917 unsafe impl<O, T: ?Sized> StableAddress for OwningRef<O, T> {}
919 impl<O, T: ?Sized> AsRef<T> for OwningRef<O, T> {
920 fn as_ref(&self) -> &T {
925 impl<O, T: ?Sized> AsRef<T> for OwningRefMut<O, T> {
926 fn as_ref(&self) -> &T {
931 impl<O, T: ?Sized> AsMut<T> for OwningRefMut<O, T> {
932 fn as_mut(&mut self) -> &mut T {
937 impl<O, T: ?Sized> Borrow<T> for OwningRef<O, T> {
938 fn borrow(&self) -> &T {
943 impl<O, T: ?Sized> From<O> for OwningRef<O, T>
946 O: Deref<Target = T>,
948 fn from(owner: O) -> Self {
949 OwningRef::new(owner)
953 impl<O, T: ?Sized> From<O> for OwningRefMut<O, T>
956 O: DerefMut<Target = T>,
958 fn from(owner: O) -> Self {
959 OwningRefMut::new(owner)
963 impl<O, T: ?Sized> From<OwningRefMut<O, T>> for OwningRef<O, T>
966 O: DerefMut<Target = T>,
968 fn from(other: OwningRefMut<O, T>) -> Self {
969 OwningRef { owner: other.owner, reference: other.reference }
973 // ^ FIXME: Is an Into impl for calling into_inner() possible as well?
975 impl<O, T: ?Sized> Debug for OwningRef<O, T>
980 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
981 write!(f, "OwningRef {{ owner: {:?}, reference: {:?} }}", self.owner(), &**self)
985 impl<O, T: ?Sized> Debug for OwningRefMut<O, T>
990 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
991 write!(f, "OwningRefMut {{ owner: {:?}, reference: {:?} }}", self.owner(), &**self)
995 impl<O, T: ?Sized> Clone for OwningRef<O, T>
997 O: CloneStableAddress,
999 fn clone(&self) -> Self {
1000 OwningRef { owner: self.owner.clone(), reference: self.reference }
1004 unsafe impl<O, T: ?Sized> CloneStableAddress for OwningRef<O, T> where O: CloneStableAddress {}
1006 unsafe impl<O, T: ?Sized> Send for OwningRef<O, T>
1009 for<'a> &'a T: Send,
1012 unsafe impl<O, T: ?Sized> Sync for OwningRef<O, T>
1015 for<'a> &'a T: Sync,
1019 unsafe impl<O, T: ?Sized> Send for OwningRefMut<O, T>
1022 for<'a> &'a mut T: Send,
1025 unsafe impl<O, T: ?Sized> Sync for OwningRefMut<O, T>
1028 for<'a> &'a mut T: Sync,
1032 impl Debug for dyn Erased {
1033 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1034 write!(f, "<Erased>",)
1038 impl<O, T: ?Sized> PartialEq for OwningRef<O, T>
1042 fn eq(&self, other: &Self) -> bool {
1043 (&*self as &T).eq(&*other as &T)
1047 impl<O, T: ?Sized> Eq for OwningRef<O, T> where T: Eq {}
1049 impl<O, T: ?Sized> PartialOrd for OwningRef<O, T>
1053 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1054 (&*self as &T).partial_cmp(&*other as &T)
1058 impl<O, T: ?Sized> Ord for OwningRef<O, T>
1062 fn cmp(&self, other: &Self) -> Ordering {
1063 (&*self as &T).cmp(&*other as &T)
1067 impl<O, T: ?Sized> Hash for OwningRef<O, T>
1071 fn hash<H: Hasher>(&self, state: &mut H) {
1072 (&*self as &T).hash(state);
1076 impl<O, T: ?Sized> PartialEq for OwningRefMut<O, T>
1080 fn eq(&self, other: &Self) -> bool {
1081 (&*self as &T).eq(&*other as &T)
1085 impl<O, T: ?Sized> Eq for OwningRefMut<O, T> where T: Eq {}
1087 impl<O, T: ?Sized> PartialOrd for OwningRefMut<O, T>
1091 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1092 (&*self as &T).partial_cmp(&*other as &T)
1096 impl<O, T: ?Sized> Ord for OwningRefMut<O, T>
1100 fn cmp(&self, other: &Self) -> Ordering {
1101 (&*self as &T).cmp(&*other as &T)
1105 impl<O, T: ?Sized> Hash for OwningRefMut<O, T>
1109 fn hash<H: Hasher>(&self, state: &mut H) {
1110 (&*self as &T).hash(state);
1114 /////////////////////////////////////////////////////////////////////////////
1115 // std types integration and convenience type defs
1116 /////////////////////////////////////////////////////////////////////////////
1118 use std::boxed::Box;
1119 use std::cell::{Ref, RefCell, RefMut};
1122 use std::sync::{MutexGuard, RwLockReadGuard, RwLockWriteGuard};
1124 impl<T: 'static> ToHandle for RefCell<T> {
1125 type Handle = Ref<'static, T>;
1126 unsafe fn to_handle(x: *const Self) -> Self::Handle {
1131 impl<T: 'static> ToHandleMut for RefCell<T> {
1132 type HandleMut = RefMut<'static, T>;
1133 unsafe fn to_handle_mut(x: *const Self) -> Self::HandleMut {
1138 // N.B., implementing ToHandle{,Mut} for Mutex and RwLock requires a decision
1139 // about which handle creation to use (i.e., read() vs try_read()) as well as
1140 // what to do with error results.
1142 /// Typedef of an owning reference that uses a `Box` as the owner.
1143 pub type BoxRef<T, U = T> = OwningRef<Box<T>, U>;
1144 /// Typedef of an owning reference that uses a `Vec` as the owner.
1145 pub type VecRef<T, U = T> = OwningRef<Vec<T>, U>;
1146 /// Typedef of an owning reference that uses a `String` as the owner.
1147 pub type StringRef = OwningRef<String, str>;
1149 /// Typedef of an owning reference that uses an `Rc` as the owner.
1150 pub type RcRef<T, U = T> = OwningRef<Rc<T>, U>;
1151 /// Typedef of an owning reference that uses an `Arc` as the owner.
1152 pub type ArcRef<T, U = T> = OwningRef<Arc<T>, U>;
1154 /// Typedef of an owning reference that uses a `Ref` as the owner.
1155 pub type RefRef<'a, T, U = T> = OwningRef<Ref<'a, T>, U>;
1156 /// Typedef of an owning reference that uses a `RefMut` as the owner.
1157 pub type RefMutRef<'a, T, U = T> = OwningRef<RefMut<'a, T>, U>;
1158 /// Typedef of an owning reference that uses a `MutexGuard` as the owner.
1159 pub type MutexGuardRef<'a, T, U = T> = OwningRef<MutexGuard<'a, T>, U>;
1160 /// Typedef of an owning reference that uses an `RwLockReadGuard` as the owner.
1161 pub type RwLockReadGuardRef<'a, T, U = T> = OwningRef<RwLockReadGuard<'a, T>, U>;
1162 /// Typedef of an owning reference that uses an `RwLockWriteGuard` as the owner.
1163 pub type RwLockWriteGuardRef<'a, T, U = T> = OwningRef<RwLockWriteGuard<'a, T>, U>;
1165 /// Typedef of a mutable owning reference that uses a `Box` as the owner.
1166 pub type BoxRefMut<T, U = T> = OwningRefMut<Box<T>, U>;
1167 /// Typedef of a mutable owning reference that uses a `Vec` as the owner.
1168 pub type VecRefMut<T, U = T> = OwningRefMut<Vec<T>, U>;
1169 /// Typedef of a mutable owning reference that uses a `String` as the owner.
1170 pub type StringRefMut = OwningRefMut<String, str>;
1172 /// Typedef of a mutable owning reference that uses a `RefMut` as the owner.
1173 pub type RefMutRefMut<'a, T, U = T> = OwningRefMut<RefMut<'a, T>, U>;
1174 /// Typedef of a mutable owning reference that uses a `MutexGuard` as the owner.
1175 pub type MutexGuardRefMut<'a, T, U = T> = OwningRefMut<MutexGuard<'a, T>, U>;
1176 /// Typedef of a mutable owning reference that uses an `RwLockWriteGuard` as the owner.
1177 pub type RwLockWriteGuardRefMut<'a, T, U = T> = OwningRef<RwLockWriteGuard<'a, T>, U>;
1179 unsafe impl<'a, T: 'a> IntoErased<'a> for Box<T> {
1180 type Erased = Box<dyn Erased + 'a>;
1181 fn into_erased(self) -> Self::Erased {
1185 unsafe impl<'a, T: 'a> IntoErased<'a> for Rc<T> {
1186 type Erased = Rc<dyn Erased + 'a>;
1187 fn into_erased(self) -> Self::Erased {
1191 unsafe impl<'a, T: 'a> IntoErased<'a> for Arc<T> {
1192 type Erased = Arc<dyn Erased + 'a>;
1193 fn into_erased(self) -> Self::Erased {
1198 unsafe impl<'a, T: Send + 'a> IntoErasedSend<'a> for Box<T> {
1199 type Erased = Box<dyn Erased + Send + 'a>;
1200 fn into_erased_send(self) -> Self::Erased {
1205 unsafe impl<'a, T: Send + 'a> IntoErasedSendSync<'a> for Box<T> {
1206 type Erased = Box<dyn Erased + Sync + Send + 'a>;
1207 fn into_erased_send_sync(self) -> Self::Erased {
1208 let result: Box<dyn Erased + Send + 'a> = self;
1209 // This is safe since Erased can always implement Sync
1210 // Only the destructor is available and it takes &mut self
1211 unsafe { mem::transmute(result) }
1215 unsafe impl<'a, T: Send + Sync + 'a> IntoErasedSendSync<'a> for Arc<T> {
1216 type Erased = Arc<dyn Erased + Send + Sync + 'a>;
1217 fn into_erased_send_sync(self) -> Self::Erased {
1222 /// Typedef of an owning reference that uses an erased `Box` as the owner.
1223 pub type ErasedBoxRef<U> = OwningRef<Box<dyn Erased>, U>;
1224 /// Typedef of an owning reference that uses an erased `Rc` as the owner.
1225 pub type ErasedRcRef<U> = OwningRef<Rc<dyn Erased>, U>;
1226 /// Typedef of an owning reference that uses an erased `Arc` as the owner.
1227 pub type ErasedArcRef<U> = OwningRef<Arc<dyn Erased>, U>;
1229 /// Typedef of a mutable owning reference that uses an erased `Box` as the owner.
1230 pub type ErasedBoxRefMut<U> = OwningRefMut<Box<dyn Erased>, U>;