pub struct BtapeGuard<'a, F: BtapeThreadLocal> { /* private fields */ }Available on crate feature
bytecode only.Expand description
RAII guard that sets a bytecode tape as the thread-local active tape.
The 'a lifetime ties the guard to the borrow of the tape it was
constructed from, so the borrow checker rejects any pattern where the
guard could outlive its tape.
ⓘ
use echidna::bytecode_tape::{BtapeGuard, BytecodeTape};
let guard: BtapeGuard<f64>;
{
let mut tape: BytecodeTape<f64> = BytecodeTape::new();
guard = BtapeGuard::new(&mut tape);
} // tape dropped, but guard would survive — rejected by the borrow checker.
drop(guard);Guards must be dropped in LIFO order (last activated, first deactivated).
record() and the borrow checker enforce this for nested recording scopes;
direct BtapeGuard users must uphold it too — dropping out of order would
restore a stale pointer into the thread-local cell. A debug assertion in
Drop catches violations.
Implementations§
Source§impl<'a, F: BtapeThreadLocal> BtapeGuard<'a, F>
impl<'a, F: BtapeThreadLocal> BtapeGuard<'a, F>
Sourcepub fn new(tape: &'a mut BytecodeTape<F>) -> Self
pub fn new(tape: &'a mut BytecodeTape<F>) -> Self
Activate tape as the thread-local bytecode tape.
Trait Implementations§
Source§impl<'a, F: BtapeThreadLocal> Drop for BtapeGuard<'a, F>
impl<'a, F: BtapeThreadLocal> Drop for BtapeGuard<'a, F>
Auto Trait Implementations§
impl<'a, F> !RefUnwindSafe for BtapeGuard<'a, F>
impl<'a, F> !Send for BtapeGuard<'a, F>
impl<'a, F> !Sync for BtapeGuard<'a, F>
impl<'a, F> !UnwindSafe for BtapeGuard<'a, F>
impl<'a, F> Freeze for BtapeGuard<'a, F>
impl<'a, F> Unpin for BtapeGuard<'a, F>
impl<'a, F> UnsafeUnpin for BtapeGuard<'a, F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.