Struct stack_graphs::arena::Deque
source · #[repr(C)]pub struct Deque<T> { /* private fields */ }
Expand description
An arena-allocated deque.
Under the covers, this is implemented as a List
. Because these lists are singly-linked,
we can only add elements to, and remove them from, one side of the list.
To handle this, each deque stores its contents either forwards or backwards. We automatically shift between these two representations as needed, depending on the requirements of each method.
Note that we cache the result of reversing the list, so it should be quick to switch back and forth between representations as long as you have not added any additional elements to the deque! If performance is critical, you should ensure that you don’t call methods in a pattern that causes the deque to reverse itself each time you add an element.
Implementations§
source§impl<T> Deque<T>
impl<T> Deque<T>
sourcepub fn new_arena() -> DequeArena<T>
pub fn new_arena() -> DequeArena<T>
Creates a new DequeArena
that will manage deques of this type.
sourcepub fn have_reversal(&self, arena: &DequeArena<T>) -> bool
pub fn have_reversal(&self, arena: &DequeArena<T>) -> bool
Returns whether we have already calculated the reversal of this deque.
sourcepub fn iter_unordered<'a>(
&self,
arena: &'a DequeArena<T>
) -> impl Iterator<Item = &'a T> + 'a
pub fn iter_unordered<'a>( &self, arena: &'a DequeArena<T> ) -> impl Iterator<Item = &'a T> + 'a
Returns an iterator over the contents of this deque, with no guarantee about the ordering of the elements. (By not caring about the ordering of the elements, you can call this method regardless of which direction the deque’s elements are currently stored. And that, in turn, means that we only need shared access to the arena, and not mutable access to it.)
source§impl<T> Deque<T>where
T: Clone,
impl<T> Deque<T>where
T: Clone,
sourcepub fn ensure_backwards(&mut self, arena: &mut DequeArena<T>)
pub fn ensure_backwards(&mut self, arena: &mut DequeArena<T>)
Ensures that this deque has computed its backwards-facing list of elements.
sourcepub fn ensure_forwards(&mut self, arena: &mut DequeArena<T>)
pub fn ensure_forwards(&mut self, arena: &mut DequeArena<T>)
Ensures that this deque has computed its forwards-facing list of elements.
sourcepub fn push_front(&mut self, arena: &mut DequeArena<T>, element: T)
pub fn push_front(&mut self, arena: &mut DequeArena<T>, element: T)
Pushes a new element onto the front of this deque.
sourcepub fn push_back(&mut self, arena: &mut DequeArena<T>, element: T)
pub fn push_back(&mut self, arena: &mut DequeArena<T>, element: T)
Pushes a new element onto the back of this deque.
sourcepub fn pop_front<'a>(&mut self, arena: &'a mut DequeArena<T>) -> Option<&'a T>
pub fn pop_front<'a>(&mut self, arena: &'a mut DequeArena<T>) -> Option<&'a T>
Removes and returns the element from the front of this deque. If the deque is empty,
returns None
.
sourcepub fn pop_back<'a>(&mut self, arena: &'a mut DequeArena<T>) -> Option<&'a T>
pub fn pop_back<'a>(&mut self, arena: &'a mut DequeArena<T>) -> Option<&'a T>
Removes and returns the element from the back of this deque. If the deque is empty,
returns None
.
sourcepub fn iter<'a>(
&self,
arena: &'a mut DequeArena<T>
) -> impl Iterator<Item = &'a T> + 'a
pub fn iter<'a>( &self, arena: &'a mut DequeArena<T> ) -> impl Iterator<Item = &'a T> + 'a
Returns an iterator over the contents of this deque in a forwards direction.
sourcepub fn iter_reversed<'a>(
&self,
arena: &'a mut DequeArena<T>
) -> impl Iterator<Item = &'a T> + 'a
pub fn iter_reversed<'a>( &self, arena: &'a mut DequeArena<T> ) -> impl Iterator<Item = &'a T> + 'a
Returns an iterator over the contents of this deque in a backwards direction.
source§impl<T> Deque<T>
impl<T> Deque<T>
pub fn equals(self, arena: &mut DequeArena<T>, other: Deque<T>) -> bool
source§impl<T> Deque<T>
impl<T> Deque<T>
pub fn cmp(self, arena: &mut DequeArena<T>, other: Deque<T>) -> Ordering
source§impl<T> Deque<T>
impl<T> Deque<T>
sourcepub fn iter_reused<'a>(
&self,
arena: &'a DequeArena<T>
) -> impl Iterator<Item = &'a T> + 'a
pub fn iter_reused<'a>( &self, arena: &'a DequeArena<T> ) -> impl Iterator<Item = &'a T> + 'a
Returns an iterator over the contents of this deque in a forwards direction, assuming that
we have already computed its forwards-facing list of elements via ensure_forwards
.
Panics if we haven’t already computed it.
sourcepub fn iter_reversed_reused<'a>(
&self,
arena: &'a DequeArena<T>
) -> impl Iterator<Item = &'a T> + 'a
pub fn iter_reversed_reused<'a>( &self, arena: &'a DequeArena<T> ) -> impl Iterator<Item = &'a T> + 'a
Returns an iterator over the contents of this deque in a backwards direction, assuming that
we have already computed its backwards-facing list of elements via ensure_backwards
.
Panics if we haven’t already computed it.
Trait Implementations§
source§impl<T> Niche for Deque<T>where
ReversibleList<T>: Niche,
impl<T> Niche for Deque<T>where
ReversibleList<T>: Niche,
§type Output = MaybeUninit<Deque<T>>
type Output = MaybeUninit<Deque<T>>
Self
inside of a ControlledOption
. This might
be Self
itself, if your niche is a valid instance of the type, but which violates some
runtime constraint. But if you cannot easily create your niche as an instance of Self
,
you can use some other type, you can use some other type instead. Read moresource§fn none() -> Self::Output
fn none() -> Self::Output
None
for a
ControlledOption
.source§fn is_none(value: &Self::Output) -> bool
fn is_none(value: &Self::Output) -> bool
impl<T> Copy for Deque<T>
Auto Trait Implementations§
impl<T> !RefUnwindSafe for Deque<T>
impl<T> Send for Deque<T>
impl<T> Sync for Deque<T>
impl<T> Unpin for Deque<T>where
T: Unpin,
impl<T> UnwindSafe for Deque<T>where
T: UnwindSafe,
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
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§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.source§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.source§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.source§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.source§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.source§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.source§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.source§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.source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§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 moresource§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 moresource§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
source§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
source§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.source§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.source§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.source§impl<T> Tap for T
impl<T> Tap for T
source§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 moresource§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 moresource§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 moresource§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 moresource§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 moresource§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 moresource§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.source§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.source§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.source§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.source§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.source§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.source§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.