pub struct NtBoxingListHead<E: NtBoxedListElement<L = L> + NtListElement<L>, L: NtTypedList<T = NtList>>(/* private fields */);
Available on crate feature alloc only.
Expand description

A variant of NtListHead that boxes every element on insertion.

This guarantees ownership and therefore all NtBoxingListHead functions can be used without resorting to unsafe. If you can, use this implementation over NtListHead.

You need to implement the NtBoxedListElement trait to designate a single list as the boxing one. This also establishes clear ownership when a single element is part of more than one list.

See the module-level documentation for more details.

This structure substitutes the LIST_ENTRY structure of the Windows NT API for the list header.

Implementations§

source§

impl<E, L> NtBoxingListHead<E, L>
where E: NtBoxedListElement<L = L> + NtListElement<L>, L: NtTypedList<T = NtList>,

source

pub fn new() -> impl New<Output = Self>

Creates a new doubly linked list that owns all elements.

This function substitutes InitializeListHead of the Windows NT API.

source

pub fn append(self: Pin<&mut Self>, other: Pin<&mut Self>)

Moves all elements from other to the end of the list.

This reuses all the nodes from other and moves them into self. After this operation, other becomes empty.

This operation computes in O(1) time.

source

pub fn back(self: Pin<&Self>) -> Option<&E>

Provides a reference to the last element, or None if the list is empty.

This operation computes in O(1) time.

source

pub fn back_mut(self: Pin<&mut Self>) -> Option<&mut E>

Provides a mutable reference to the last element, or None if the list is empty.

This operation computes in O(1) time.

source

pub fn clear(self: Pin<&mut Self>)

Removes all elements from the list, deallocating their memory.

Unlike NtListHead::clear, this operation computes in O(n) time, because it needs to traverse all elements to deallocate them.

source

pub fn front(self: Pin<&Self>) -> Option<&E>

Provides a reference to the first element, or None if the list is empty.

This operation computes in O(1) time.

source

pub fn front_mut(self: Pin<&mut Self>) -> Option<&mut E>

Provides a mutable reference to the first element, or None if the list is empty.

This operation computes in O(1) time.

source

pub fn is_empty(self: Pin<&Self>) -> bool

Returns true if the list is empty.

This function substitutes IsListEmpty of the Windows NT API.

This operation computes in O(1) time.

source

pub fn iter(self: Pin<&Self>) -> Iter<'_, E, L>

Returns an iterator yielding references to each element of the list.

source

pub fn iter_mut(self: Pin<&mut Self>) -> IterMut<'_, E, L>

Returns an iterator yielding mutable references to each element of the list.

source

pub fn len(self: Pin<&Self>) -> usize

Counts all elements and returns the length of the list.

This operation computes in O(n) time.

source

pub fn pop_back(self: Pin<&mut Self>) -> Option<Box<E>>

Removes the last element from the list and returns it, or None if the list is empty.

This function substitutes RemoveTailList of the Windows NT API.

This operation computes in O(1) time.

source

pub fn pop_front(self: Pin<&mut Self>) -> Option<Box<E>>

Removes the first element from the list and returns it, or None if the list is empty.

This function substitutes RemoveHeadList of the Windows NT API.

This operation computes in O(1) time.

source

pub fn push_back(self: Pin<&mut Self>, element: E)

Appends an element to the back of the list.

This function substitutes InsertTailList of the Windows NT API.

This operation computes in O(1) time.

source

pub fn push_front(self: Pin<&mut Self>, element: E)

Appends an element to the front of the list.

This function substitutes InsertHeadList of the Windows NT API.

This operation computes in O(1) time.

source

pub fn retain<F>(self: Pin<&mut Self>, f: F)
where F: FnMut(&mut E) -> bool,

Retains only the elements specified by the predicate, passing a mutable reference to it.

In other words, remove all elements e for which f(&mut e) returns false. This method operates in place, visiting each element exactly once in the original order, and preserves the order of the retained elements.

This function substitutes RemoveEntryList of the Windows NT API.

This operation computes in O(n) time.

Trait Implementations§

source§

impl<E, L> Drop for NtBoxingListHead<E, L>
where E: NtBoxedListElement<L = L> + NtListElement<L>, L: NtTypedList<T = NtList>,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<E, L> Extend<Box<E>> for Pin<&mut NtBoxingListHead<E, L>>
where E: NtBoxedListElement<L = L> + NtListElement<L>, L: NtTypedList<T = NtList>,

source§

fn extend<T>(&mut self, iter: T)
where T: IntoIterator<Item = Box<E>>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
source§

impl<E, L> Extend<E> for Pin<&mut NtBoxingListHead<E, L>>
where E: NtBoxedListElement<L = L> + NtListElement<L>, L: NtTypedList<T = NtList>,

source§

fn extend<T>(&mut self, iter: T)
where T: IntoIterator<Item = E>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more

Auto Trait Implementations§

§

impl<E, L> RefUnwindSafe for NtBoxingListHead<E, L>

§

impl<E, L> !Send for NtBoxingListHead<E, L>

§

impl<E, L> !Sync for NtBoxingListHead<E, L>

§

impl<E, L> !Unpin for NtBoxingListHead<E, L>

§

impl<E, L> UnwindSafe for NtBoxingListHead<E, L>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.