pub struct EntryOwner<C: PageTableConfig> {
pub kind: EntryOwnerKind<C>,
pub path: TreePath<NR_ENTRIES>,
pub parent_level: PagingLevel,
}Fields§
§kind: EntryOwnerKind<C>§path: TreePath<NR_ENTRIES>§parent_level: PagingLevelImplementations§
Source§impl<C: PageTableConfig> EntryOwner<C>
impl<C: PageTableConfig> EntryOwner<C>
Sourcepub open spec fn into_pte_owner_spec(self) -> EntryOwner<C>
pub open spec fn into_pte_owner_spec(self) -> EntryOwner<C>
{ self }Sourcepub open spec fn from_pte_owner_spec(self) -> EntryOwner<C>
pub open spec fn from_pte_owner_spec(self) -> EntryOwner<C>
{ self }Sourcepub open spec fn pte_invariants(self, pte: C::E, regions: MetaRegionOwners) -> bool
pub open spec fn pte_invariants(self, pte: C::E, regions: MetaRegionOwners) -> bool
{
&&& self.inv()
&&& regions.inv()
&&& self.match_pte(pte, self.parent_level)
&&& self.metaregion_sound(regions)
}This is equivalent to the other invariants relations, combining the inv predicates for each
object and the well-formedness relations between them.
Source§impl<C: PageTableConfig> EntryOwner<C>
impl<C: PageTableConfig> EntryOwner<C>
Sourcepub open spec fn is_borrowed(self) -> bool
pub open spec fn is_borrowed(self) -> bool
{ self.kind is Borrowed }Sourcepub open spec fn frame(self) -> FrameEntryOwner<C>
pub open spec fn frame(self) -> FrameEntryOwner<C>
{ self.kind->Frame_0 }Sourcepub open spec fn frame_permission(self) -> Option<C::Perm>
pub open spec fn frame_permission(self) -> Option<C::Perm>
self.is_frame(),{ self.frame().permission }Sourcepub open spec fn frame_is_tracked(self) -> bool
pub open spec fn frame_is_tracked(self) -> bool
self.is_frame(),{ self.frame_permission() is Some }Sourcepub open spec fn new_absent(path: TreePath<NR_ENTRIES>, parent_level: PagingLevel) -> Self
pub open spec fn new_absent(path: TreePath<NR_ENTRIES>, parent_level: PagingLevel) -> Self
{
EntryOwner {
kind: EntryOwnerKind::Absent,
path,
parent_level,
}
}Sourcepub open spec fn new_frame(
paddr: Paddr,
path: TreePath<NR_ENTRIES>,
parent_level: PagingLevel,
prop: PageProperty,
permission: Option<C::Perm>,
) -> Self
pub open spec fn new_frame( paddr: Paddr, path: TreePath<NR_ENTRIES>, parent_level: PagingLevel, prop: PageProperty, permission: Option<C::Perm>, ) -> Self
{
EntryOwner {
kind: EntryOwnerKind::Frame(FrameEntryOwner {
mapped_pa: paddr,
prop,
permission,
}),
path,
parent_level,
}
}Sourcepub open spec fn new_node(node: NodeOwner<C>, path: TreePath<NR_ENTRIES>) -> Self
pub open spec fn new_node(node: NodeOwner<C>, path: TreePath<NR_ENTRIES>) -> Self
{
EntryOwner {
kind: EntryOwnerKind::Node(node),
path,
parent_level: (node.level() + 1) as PagingLevel,
}
}Sourcepub proof fn tracked_new_absent(
path: TreePath<NR_ENTRIES>,
parent_level: PagingLevel,
) -> tracked Self
pub proof fn tracked_new_absent( path: TreePath<NR_ENTRIES>, parent_level: PagingLevel, ) -> tracked Self
Self::new_absent(path, parent_level),Sourcepub proof fn tracked_take_node(tracked &mut self) -> tracked res : NodeOwner<C>
pub proof fn tracked_take_node(tracked &mut self) -> tracked res : NodeOwner<C>
old(self).kind is Node,ensuresres == old(self).node(),*final(self)
== (EntryOwner {
kind: EntryOwnerKind::Absent,
..*old(self)
}),Sourcepub proof fn tracked_put_node(tracked &mut self, tracked node: NodeOwner<C>)
pub proof fn tracked_put_node(tracked &mut self, tracked node: NodeOwner<C>)
*final(self)
== (EntryOwner {
kind: EntryOwnerKind::Node(node),
..*old(self)
}),Sourcepub proof fn tracked_borrow_node(tracked &self) -> tracked res : &NodeOwner<C>
pub proof fn tracked_borrow_node(tracked &self) -> tracked res : &NodeOwner<C>
self.kind is Node,ensures*res == self.node(),Sourcepub proof fn tracked_borrow_mut_node(tracked &mut self) -> tracked res : &mut NodeOwner<C>
pub proof fn tracked_borrow_mut_node(tracked &mut self) -> tracked res : &mut NodeOwner<C>
old(self).kind is Node,ensures*res == old(self).node(),*final(self)
== (EntryOwner {
kind: EntryOwnerKind::Node(*final(res)),
..*old(self)
}),Sourcepub proof fn tracked_set_frame_prop(tracked &mut self, prop: PageProperty)
pub proof fn tracked_set_frame_prop(tracked &mut self, prop: PageProperty)
old(self).kind is Frame,ensures*final(self)
== (EntryOwner {
kind: EntryOwnerKind::Frame(FrameEntryOwner {
prop,
..old(self).frame()
}),
..*old(self)
}),Sourcepub proof fn tracked_take_frame_permission(tracked &mut self) -> tracked res : Option<C::Perm>
pub proof fn tracked_take_frame_permission(tracked &mut self) -> tracked res : Option<C::Perm>
old(self).is_frame(),ensuresres == old(self).frame_permission(),*final(self)
== (EntryOwner {
kind: EntryOwnerKind::Frame(FrameEntryOwner {
permission: None,
..old(self).frame()
}),
..*old(self)
}),Sourcepub proof fn tracked_put_frame_permission(tracked &mut self, tracked permission: Option<C::Perm>)
pub proof fn tracked_put_frame_permission(tracked &mut self, tracked permission: Option<C::Perm>)
old(self).is_frame(),old(self).frame_permission() is None,ensures*final(self)
== (EntryOwner {
kind: EntryOwnerKind::Frame(FrameEntryOwner {
permission,
..old(self).frame()
}),
..*old(self)
}),Sourcepub proof fn tracked_new_frame(
paddr: Paddr,
path: TreePath<NR_ENTRIES>,
parent_level: PagingLevel,
prop: PageProperty,
tracked permission: Option<C::Perm>,
) -> tracked Self
pub proof fn tracked_new_frame( paddr: Paddr, path: TreePath<NR_ENTRIES>, parent_level: PagingLevel, prop: PageProperty, tracked permission: Option<C::Perm>, ) -> tracked Self
Self::new_frame(paddr, path, parent_level, prop, permission),Sourcepub proof fn tracked_new_untracked_frame(
paddr: Paddr,
parent_level: PagingLevel,
prop: PageProperty,
) -> tracked res : Self
pub proof fn tracked_new_untracked_frame( paddr: Paddr, parent_level: PagingLevel, prop: PageProperty, ) -> tracked res : Self
valid_frame_paddr(paddr),1 <= parent_level < NR_LEVELS,paddr % page_size::<PagingConsts>(parent_level) == 0,paddr + page_size::<PagingConsts>(parent_level) <= MAX_PADDR,C::raw_item_well_formed((paddr, parent_level, prop, Tracked(None))),C::E::new_page_req(paddr, parent_level, prop),ensuresres.is_frame(),res.frame().mapped_pa == paddr,res.frame().prop == prop,!res.frame_is_tracked(),res.parent_level == parent_level,res.path.inv(),res.inv(),crate::mm::page_table::Child::<C>::Frame(paddr, parent_level, prop).wf(res),Creates an untracked physical mapping without counted metadata ownership.
The mapped address may belong to ordinary RAM or MMIO.
The actual mapping correctness is guaranteed by the caller’s unsafe contract.
The requires reflect properties established by collect_largest_pages and the page-table
configuration model, allowing this checked constructor to build an invariant-safe,
untracked entry owner.
Sourcepub open spec fn match_pte(self, pte: C::E, parent_level: PagingLevel) -> bool
pub open spec fn match_pte(self, pte: C::E, parent_level: PagingLevel) -> bool
{
&&& valid_frame_paddr(pte.paddr())
&&& !pte.is_present()
==> {
&&& self.is_absent()
&&& parent_level > 1 ==> !pte.is_last(parent_level)
}
&&& pte.is_present() && !pte.is_last(parent_level)
==> {
&&& self.is_node()
&&& meta_to_frame(self.node().slot_vaddr()) == pte.paddr()
}
&&& pte.is_present() && pte.is_last(parent_level)
==> {
&&& self.is_frame()
&&& self.frame().mapped_pa == pte.paddr()
&&& self.frame().prop == pte.prop()
}
}Sourcepub open spec fn borrowed_match_pte(self, pte: C::E, parent_level: PagingLevel) -> bool
pub open spec fn borrowed_match_pte(self, pte: C::E, parent_level: PagingLevel) -> bool
{
&&& self.is_borrowed()
&&& valid_frame_paddr(pte.paddr())
&&& pte.is_present()
&&& !pte.is_last(parent_level)
}PTE-shape constraint for a borrowed / translation-only entry. The
PTE must be a node-PTE (present and non-leaf at parent_level),
since the borrowed sub-table is accessed only via the MMU walk.
Unlike [match_pte], we do not pin the PTE’s target paddr to
any owned NodeOwner — the sub-table is owned by a different
page-table configuration and the embedding doesn’t track its
address here.
Sourcepub proof fn huge_frame_split_child_at(self, regions: MetaRegionOwners, idx: usize)
pub proof fn huge_frame_split_child_at(self, regions: MetaRegionOwners, idx: usize)
self.inv(),self.is_frame(),regions.inv(),1 < self.parent_level < NR_LEVELS,idx < NR_ENTRIES,ensuresself.frame().mapped_pa
+ idx * page_size::<PagingConsts>((self.parent_level - 1) as PagingLevel) < MAX_PADDR,((self.frame().mapped_pa
+ idx * page_size::<PagingConsts>((self.parent_level - 1) as PagingLevel)) as Paddr)
% page_size::<PagingConsts>((self.parent_level - 1) as PagingLevel) == 0,((self.frame().mapped_pa
+ idx * page_size::<PagingConsts>((self.parent_level - 1) as PagingLevel)) as Paddr)
+ page_size::<PagingConsts>((self.parent_level - 1) as PagingLevel) <= MAX_PADDR,((self.frame().mapped_pa
+ idx * page_size::<PagingConsts>((self.parent_level - 1) as PagingLevel)) as Paddr)
% PAGE_SIZE == 0,Sourcepub open spec fn metaregion_sound(self, regions: MetaRegionOwners) -> bool
pub open spec fn metaregion_sound(self, regions: MetaRegionOwners) -> bool
{
if self.is_node() {
let idx = frame_to_index(self.meta_slot_paddr()->0);
&&& regions.ref_count(idx) != REF_COUNT_UNUSED
&&& 0 < regions.ref_count(idx) <= REF_COUNT_MAX
&&& regions.slot_owners[idx].slot_vaddr == self.node().slot_vaddr()
&&& regions.slots[idx].value().wf(regions.slot_owners[idx])
&&& regions.slot_owners[idx].paths_in_pt == set![self.path]
&&& self.node().metaregion_sound_node(regions)
} else if self.is_frame() {
let idx = frame_to_index(self.meta_slot_paddr()->0);
&&& regions.slots.contains_key(idx)
&&& regions.slots[idx].addr() == index_to_meta(idx)
&&& regions.slots[idx].is_init()
&&& regions.slots[idx].value().wf(regions.slot_owners[idx])
&&& self.frame_is_tracked()
==> {
&&& regions.slot_owners[idx].usage !is PageTable
&&& 0 < regions.ref_count(idx) <= REF_COUNT_MAX
&&& regions.slot_owners[idx].paths_in_pt.contains(self.path)
}
&&& C::perm_well_formed_with_region(
self.frame().mapped_pa,
Tracked(self.frame_permission()),
regions,
)
} else {
true
}
}Sourcepub proof fn lemma_active_entry_not_in_free_pool(
entry: Self,
regions: MetaRegionOwners,
free_idx: int,
)
pub proof fn lemma_active_entry_not_in_free_pool( entry: Self, regions: MetaRegionOwners, free_idx: int, )
regions.inv(),entry.inv(),entry.is_node(),entry.metaregion_sound(regions),regions.slots.contains_key(free_idx),regions.ref_count(free_idx) == REF_COUNT_UNUSED,ensuresframe_to_index(entry.meta_slot_paddr()->0) != free_idx,An active page-table node cannot occupy a metadata slot whose refcount is
still REF_COUNT_UNUSED.
Sourcepub open spec fn meta_slot_paddr(self) -> Option<Paddr>
pub open spec fn meta_slot_paddr(self) -> Option<Paddr>
{
if self.is_node() {
Some(meta_to_frame(self.node().slot_vaddr()))
} else if self.is_frame() {
Some(self.frame().mapped_pa)
} else {
None
}
}Sourcepub open spec fn meta_slot_paddr_neq(self, other: Self) -> bool
pub open spec fn meta_slot_paddr_neq(self, other: Self) -> bool
{
(self.is_node() || (self.is_frame() && self.frame_is_tracked()))
&& (other.is_node() || (other.is_frame() && other.frame_is_tracked()))
==> {
self.meta_slot_paddr() is Some
==> (other.meta_slot_paddr() is Some
==> self.meta_slot_paddr()->0 != other.meta_slot_paddr()->0)
}
}Physical-slot exclusion for owning entries; raw mappings impose no exclusion.
Sourcepub proof fn lemma_untracked_frame_metaregion_sound(self, regions: MetaRegionOwners)
pub proof fn lemma_untracked_frame_metaregion_sound(self, regions: MetaRegionOwners)
self.inv(),self.is_frame(),!self.frame_is_tracked(),regions.inv(),ensuresself.metaregion_sound(regions),An untracked mapping needs no counted ownership of its physical slot.
Sourcepub proof fn metaregion_sound_slot_owners_only(
self,
r0: MetaRegionOwners,
r1: MetaRegionOwners,
)
pub proof fn metaregion_sound_slot_owners_only( self, r0: MetaRegionOwners, r1: MetaRegionOwners, )
self.inv(),self.metaregion_sound(r0),r0.slot_owners == r1.slot_owners,forall |k: int| r0.slots.contains_key(k) ==> #[trigger] r1.slots.contains_key(k),forall |k: int| r0.slots.contains_key(k) ==> r0.slots[k] == #[trigger] r1.slots[k],ensuresself.metaregion_sound(r1),metaregion_sound transfers when slot_owners matches and slots is a superset.
For nodes: only slot_owners matters. For frames: slots.contains_key and slots[idx]
must be preserved, which holds when slots is a superset with values unchanged.
Sourcepub proof fn lemma_metaregion_sound_frame_paths_changed(
self,
r0: MetaRegionOwners,
r1: MetaRegionOwners,
)
pub proof fn lemma_metaregion_sound_frame_paths_changed( self, r0: MetaRegionOwners, r1: MetaRegionOwners, )
self.inv(),self.metaregion_sound(r0),r0.inv(),r1.inv(),r0.slots == r1.slots,forall |i: int| {
r0.slot_owners.contains_key(i)
==> {
&&& r1.slot_owners[i].same_permissions(r0.slot_owners[i])
&&& r1.slot_owners[i].usage == r0.slot_owners[i].usage
&&& r1.slot_owners[i].slot_vaddr == r0.slot_owners[i].slot_vaddr
&&& r0.slot_owners[i].paths_in_pt.subset_of(r1.slot_owners[i].paths_in_pt)
&&& r0.slot_owners[i].usage is PageTable
==> r1.slot_owners[i].paths_in_pt == r0.slot_owners[i].paths_in_pt
}
},ensuresself.metaregion_sound(r1),Updating frame paths preserves metadata access and node ownership paths.
Sourcepub proof fn metaregion_sound_frame_prop_changed(
self,
other: Self,
regions: MetaRegionOwners,
)
pub proof fn metaregion_sound_frame_prop_changed( self, other: Self, regions: MetaRegionOwners, )
regions.inv(),self.inv(),other.inv(),self.is_frame(),other.is_frame(),self.metaregion_sound(regions),other.frame().mapped_pa == self.frame().mapped_pa,other.path == self.path,other.parent_level == self.parent_level,other.frame_permission() == self.frame_permission(),other.frame_is_tracked() == self.frame_is_tracked(),ensuresother.metaregion_sound(regions),Changing only a leaf PTE’s page properties preserves its relationship to the metadata region. The counting permission, physical address and page-table path remain unchanged.
Sourcepub proof fn lemma_metaregion_sound_one_slot_changed(
self,
r0: MetaRegionOwners,
r1: MetaRegionOwners,
changed_idx: int,
)
pub proof fn lemma_metaregion_sound_one_slot_changed( self, r0: MetaRegionOwners, r1: MetaRegionOwners, changed_idx: int, )
self.inv(),self.metaregion_sound(r0),forall |i: int| i != changed_idx ==> r0.slot_owners[i] == r1.slot_owners[i],r0.slot_owners.dom() =~= r1.slot_owners.dom(),forall |k: int| r0.slots.contains_key(k) ==> #[trigger] r1.slots.contains_key(k),forall |k: int| r0.slots.contains_key(k) ==> r0.slots[k] == #[trigger] r1.slots[k],self.is_node() || (self.is_frame() && self.frame_is_tracked())
==> (self.meta_slot_paddr() is Some
==> frame_to_index(self.meta_slot_paddr()->0) != changed_idx),self.meta_slot_paddr() is Some
&& frame_to_index(self.meta_slot_paddr()->0) == changed_idx ==> r1.inv(),ensuresself.metaregion_sound(r1),If metaregion_sound(r0) holds and r1 differs from r0 only at one slot index
that this entry does not reference, then metaregion_sound(r1) also holds.
Trait Implementations§
Source§impl<C: PageTableConfig> Inv for EntryOwner<C>
impl<C: PageTableConfig> Inv for EntryOwner<C>
Source§open spec fn inv(self) -> bool
open spec fn inv(self) -> bool
{
&&& self.is_node()
==> {
&&& self.node().inv()
&&& self.parent_level == self.node().level() + 1
}
&&& self.is_frame()
==> {
&&& 1 <= self.parent_level < NR_LEVELS
&&& valid_frame_paddr(self.frame().mapped_pa)
&&& self.frame().mapped_pa % page_size::<PagingConsts>(self.parent_level)
== 0
&&& self.frame().mapped_pa + page_size::<PagingConsts>(self.parent_level)
<= MAX_PADDR
&&& C::raw_item_well_formed((
self.frame().mapped_pa,
self.parent_level,
self.frame().prop,
Tracked(self.frame_permission()),
))
&&& C::E::new_page_req(
self.frame().mapped_pa,
self.parent_level,
self.frame().prop,
)
}
&&& self.path.inv()
}Structural invariant of an entry owner.
Source§impl<C: PageTableConfig, const L: usize> TreeNodeValue<L> for EntryOwner<C>
impl<C: PageTableConfig, const L: usize> TreeNodeValue<L> for EntryOwner<C>
Source§open spec fn default(lv: nat) -> Self
open spec fn default(lv: nat) -> Self
{
Self {
kind: EntryOwnerKind::Absent,
path: TreePath::new(Seq::empty()),
parent_level: (INC_LEVELS - lv) as PagingLevel,
}
}Source§proof fn lemma_default_preserves_inv()
proof fn lemma_default_preserves_inv()
Source§proof fn lemma_default_preserves_la_inv()
proof fn lemma_default_preserves_la_inv()
Source§open spec fn rel_children(self, i: int, child: Option<Self>) -> bool
open spec fn rel_children(self, i: int, child: Option<Self>) -> bool
{ true }Source§proof fn lemma_default_preserves_rel_children(self, lv: nat)
proof fn lemma_default_preserves_rel_children(self, lv: nat)
Auto Trait Implementations§
impl<C> !RefUnwindSafe for EntryOwner<C>
impl<C> Freeze for EntryOwner<C>
impl<C> Send for EntryOwner<C>
impl<C> Sync for EntryOwner<C>
impl<C> Unpin for EntryOwner<C>
impl<C> UnsafeUnpin for EntryOwner<C>
impl<C> UnwindSafe for EntryOwner<C>
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: From<T>,
impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: From<T>,
fn obeys_from_spec() -> bool
fn from_spec(v: T) -> VERUS_SPEC__A
§impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: Into<T>,
impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: Into<T>,
fn obeys_into_spec() -> bool
fn into_spec(self) -> T
§impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
fn obeys_into_spec() -> bool
fn into_spec(self) -> U
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<A> SpecEq<&A> for Awhere
A: ?Sized,
impl<A> SpecEq<&mut A> for Awhere
A: ?Sized,
impl<A> SpecEq<A> for Awhere
A: ?Sized,
impl<A> SpecEq<Ghost<A>> for A
impl<A> SpecEq<Tracked<A>> for A
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.