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>where
T: Clone + Eq,
impl<T> Deque<T>where
T: Clone + Eq,
pub fn equals(self, arena: &mut DequeArena<T>, other: Deque<T>) -> bool
source§impl<T> Deque<T>where
T: Clone + Ord,
impl<T> Deque<T>where
T: Clone + Ord,
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§
§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> 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) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
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) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
self
, then passes self.as_mut()
into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
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)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.