pub struct Loaned<'t, T> { /* private fields */ }Expand description
Loaned<'t, T> connotes ownership of a value T, with the caveat that
allocations owned by it are immutably loaned for 't (i.e. something else
may hold an &'t reference to such allocations).
Thus, for the duration of 't, one cannot mutably access this value.
However, unlike LoanedMut, one can immutably access it.
One can store this value somewhere with Loaned::place, which will ensure
that it cannot be used for the duration of 't.
Taking the value out of a Loaned can be done with the take! macro,
which will statically ensure that 't has expired.
§Dropping
The value held by a Loaned can only be dropped once 't expires. Since
there is no way in the type system to enforce this, nor any way to check
this at runtime, dropping a Loaned panics.
If leaking is intentional, use a ManuallyDrop<Loaned<'t, T>>.
To drop the inner value, use the drop! macro, which will statically
ensure that 't has expired.
Implementations§
Source§impl<'t, T> Loaned<'t, T>
impl<'t, T> Loaned<'t, T>
Sourcepub fn loan(value: T) -> (&'t T::Target, Self)where
T: Loanable<'t>,
pub fn loan(value: T) -> (&'t T::Target, Self)where
T: Loanable<'t>,
Constructs a Loaned from a given smart pointer, returning the borrow
along with the loaned pointer.
Sourcepub fn new(value: T) -> Self
pub fn new(value: T) -> Self
Creates a Loaned without actually loaning it. If you want to loan it,
use Loaned::loan or Loaned::borrow.
Source§impl<'t, T> Loaned<'t, T>
impl<'t, T> Loaned<'t, T>
Sourcepub fn merge(
value: T,
f: impl for<'i> FnOnce(&'i mut T, &'i Merge<'t, 'i>),
) -> Self
pub fn merge( value: T, f: impl for<'i> FnOnce(&'i mut T, &'i Merge<'t, 'i>), ) -> Self
Merges multiple LoanedMut values.
§Example
use loaned::Loaned;
let a = Loaned::new(1);
let b = Loaned::new(2);
let ab: Loaned<(u32, u32)> = Loaned::merge(Default::default(), |ab, m| {
m.place(a, &mut ab.0);
m.place(b, &mut ab.1);
});Source§impl<'t, T> Loaned<'t, T>
impl<'t, T> Loaned<'t, T>
Sourcepub fn loan_with<L>(
value: T,
f: impl for<'i> FnOnce(&'i mut T, &'i LoanWith<'t, 'i>) -> L,
) -> (L, Self)
pub fn loan_with<L>( value: T, f: impl for<'i> FnOnce(&'i mut T, &'i LoanWith<'t, 'i>) -> L, ) -> (L, Self)
Creates a Loaned with multiple sub-loans.
§Example
use loaned::Loaned;
let ((a, b), ab) = Loaned::loan_with((Box::new(1), Box::new(2)), |ab, l| {
(l.loan(&ab.0), l.loan(&ab.1))
});
assert_eq!(*a, 1);
assert_eq!(*b, 2);
assert_eq!(loaned::take!(ab), (Box::new(1), Box::new(2)));Trait Implementations§
Source§impl<'t, A, B, C> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>)> for Loaned<'t, (A, B, C)>
impl<'t, A, B, C> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>)> for Loaned<'t, (A, B, C)>
Source§impl<'t, A, B, C, D> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>)> for Loaned<'t, (A, B, C, D)>
impl<'t, A, B, C, D> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>)> for Loaned<'t, (A, B, C, D)>
Source§impl<'t, A, B, C, D, E> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>)> for Loaned<'t, (A, B, C, D, E)>
impl<'t, A, B, C, D, E> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>)> for Loaned<'t, (A, B, C, D, E)>
Source§impl<'t, A, B, C, D, E, F> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>)> for Loaned<'t, (A, B, C, D, E, F)>
impl<'t, A, B, C, D, E, F> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>)> for Loaned<'t, (A, B, C, D, E, F)>
Source§impl<'t, A, B, C, D, E, F, G> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>)> for Loaned<'t, (A, B, C, D, E, F, G)>
impl<'t, A, B, C, D, E, F, G> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>)> for Loaned<'t, (A, B, C, D, E, F, G)>
Source§impl<'t, A, B, C, D, E, F, G, H> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>, Loaned<'t, H>)> for Loaned<'t, (A, B, C, D, E, F, G, H)>
impl<'t, A, B, C, D, E, F, G, H> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>, Loaned<'t, H>)> for Loaned<'t, (A, B, C, D, E, F, G, H)>
Source§impl<'t, A, B, C, D, E, F, G, H, I> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>, Loaned<'t, H>, Loaned<'t, I>)> for Loaned<'t, (A, B, C, D, E, F, G, H, I)>
impl<'t, A, B, C, D, E, F, G, H, I> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>, Loaned<'t, H>, Loaned<'t, I>)> for Loaned<'t, (A, B, C, D, E, F, G, H, I)>
Source§impl<'t, A, B, C, D, E, F, G, H, I, J> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>, Loaned<'t, H>, Loaned<'t, I>, Loaned<'t, J>)> for Loaned<'t, (A, B, C, D, E, F, G, H, I, J)>
impl<'t, A, B, C, D, E, F, G, H, I, J> From<(Loaned<'t, A>, Loaned<'t, B>, Loaned<'t, C>, Loaned<'t, D>, Loaned<'t, E>, Loaned<'t, F>, Loaned<'t, G>, Loaned<'t, H>, Loaned<'t, I>, Loaned<'t, J>)> for Loaned<'t, (A, B, C, D, E, F, G, H, I, J)>
Source§impl<'t, T> From<Box<Loaned<'t, T>>> for Loaned<'t, Box<T>>
Available on crate feature alloc only.
impl<'t, T> From<Box<Loaned<'t, T>>> for Loaned<'t, Box<T>>
alloc only.Source§impl<'t, T> From<Loaned<'t, MaybeUninit<T>>> for MaybeUninit<Loaned<'t, T>>
impl<'t, T> From<Loaned<'t, MaybeUninit<T>>> for MaybeUninit<Loaned<'t, T>>
Source§fn from(value: Loaned<'t, MaybeUninit<T>>) -> Self
fn from(value: Loaned<'t, MaybeUninit<T>>) -> Self
Source§impl<'t, T> From<MaybeUninit<Loaned<'t, T>>> for Loaned<'t, MaybeUninit<T>>
impl<'t, T> From<MaybeUninit<Loaned<'t, T>>> for Loaned<'t, MaybeUninit<T>>
Source§fn from(value: MaybeUninit<Loaned<'t, T>>) -> Self
fn from(value: MaybeUninit<Loaned<'t, T>>) -> Self
Source§impl<'t, T> From<Vec<Loaned<'t, T>>> for Loaned<'t, Vec<T>>
Available on crate feature alloc only.
impl<'t, T> From<Vec<Loaned<'t, T>>> for Loaned<'t, Vec<T>>
alloc only.Source§impl<'t, T: Ord> Ord for Loaned<'t, T>
impl<'t, T: Ord> Ord for Loaned<'t, T>
Source§impl<'t, 'u, T: PartialOrd<U>, U> PartialOrd<Loaned<'u, U>> for Loaned<'t, T>
impl<'t, 'u, T: PartialOrd<U>, U> PartialOrd<Loaned<'u, U>> for Loaned<'t, T>
impl<'t, T: Eq> Eq for Loaned<'t, T>
impl<'t, T: Sync> Send for Loaned<'t, T>
Like &T, Loaned<T> is only Send if T is Sync.
Otherwise, code could cause data races:
use loaned::Loaned;
use std::cell::Cell;
let x = Loaned::new(Box::new(Cell::new(123)));
let y = x.borrow();
let x = std::thread::scope(|s| {
let h = s.spawn(move || {
x.set(456); // <- unsynchronized write
x
});
y.get(); // // <- unsynchronized read
h.join().unwrap()
});
loaned::drop!(x);If you need to safely send this value, you can convert it to a LoanedMut<'t, T> with Into.