pub struct RBTree<A: Adapter>where
    A::LinkOps: RBTreeOps,{ /* private fields */ }
Expand description

An intrusive red-black tree.

When this collection is dropped, all elements linked into it will be converted back to owned pointers and dropped.

Note that you are responsible for ensuring that the elements in a RBTree remain in ascending key order. This property can be violated, either because the key of an element was modified, or because the insert_before/insert_after methods of CursorMut were incorrectly used. If this situation occurs, memory safety will not be violated but the find, upper_bound, lower_bound and range may return incorrect results.

Implementations§

source§

impl<A: Adapter> RBTree<A>where A::LinkOps: RBTreeOps,

source

pub fn new(adapter: A) -> RBTree<A>

Creates an empty RBTree.

source

pub fn is_empty(&self) -> bool

Returns true if the RBTree is empty.

source

pub fn cursor(&self) -> Cursor<'_, A>

Returns a null Cursor for this tree.

source

pub fn cursor_mut(&mut self) -> CursorMut<'_, A>

Returns a null CursorMut for this tree.

source

pub fn cursor_owning(self) -> CursorOwning<A>

Returns a null CursorOwning for this tree.

source

pub unsafe fn cursor_from_ptr( &self, ptr: *const <A::PointerOps as PointerOps>::Value ) -> Cursor<'_, A>

Creates a Cursor from a pointer to an element.

Safety

ptr must be a pointer to an object that is part of this tree.

source

pub unsafe fn cursor_mut_from_ptr( &mut self, ptr: *const <A::PointerOps as PointerOps>::Value ) -> CursorMut<'_, A>

Creates a CursorMut from a pointer to an element.

Safety

ptr must be a pointer to an object that is part of this tree.

source

pub unsafe fn cursor_owning_from_ptr( self, ptr: *const <A::PointerOps as PointerOps>::Value ) -> CursorOwning<A>

Creates a CursorOwning from a pointer to an element.

Safety

ptr must be a pointer to an object that is part of this tree.

source

pub fn front(&self) -> Cursor<'_, A>

Returns a Cursor pointing to the first element of the tree. If the tree is empty then a null cursor is returned.

source

pub fn front_mut(&mut self) -> CursorMut<'_, A>

Returns a CursorMut pointing to the first element of the tree. If the the tree is empty then a null cursor is returned.

source

pub fn front_owning(self) -> CursorOwning<A>

Returns a CursorOwning pointing to the first element of the tree. If the the tree is empty then a null cursor is returned.

source

pub fn back(&self) -> Cursor<'_, A>

Returns a Cursor pointing to the last element of the tree. If the tree is empty then a null cursor is returned.

source

pub fn back_mut(&mut self) -> CursorMut<'_, A>

Returns a CursorMut pointing to the last element of the tree. If the tree is empty then a null cursor is returned.

source

pub fn back_owning(self) -> CursorOwning<A>

Returns a CursorOwning pointing to the last element of the tree. If the tree is empty then a null cursor is returned.

source

pub fn iter(&self) -> Iter<'_, A>

Gets an iterator over the objects in the RBTree.

source

pub fn clear(&mut self)

Removes all elements from the RBTree.

This will unlink all object currently in the tree, which requires iterating through all elements in the RBTree. Each element is converted back to an owned pointer and then dropped.

source

pub fn fast_clear(&mut self)

Empties the RBTree without unlinking or freeing objects in it.

Since this does not unlink any objects, any attempts to link these objects into another RBTree will fail but will not cause any memory unsafety. To unlink those objects manually, you must call the force_unlink function on them.

source

pub fn take(&mut self) -> RBTree<A>where A: Clone,

Takes all the elements out of the RBTree, leaving it empty. The taken elements are returned as a new RBTree.

source§

impl<A: for<'a> KeyAdapter<'a>> RBTree<A>where <A as Adapter>::LinkOps: RBTreeOps,

source

pub fn find<'a, 'b, Q: ?Sized + Ord>(&'a self, key: &Q) -> Cursor<'a, A>where <A as KeyAdapter<'b>>::Key: Borrow<Q>, 'a: 'b,

Returns a Cursor pointing to an element with the given key. If no such element is found then a null cursor is returned.

If multiple elements with an identical key are found then an arbitrary one is returned.

source

pub fn find_mut<'a, 'b, Q: ?Sized + Ord>( &'a mut self, key: &Q ) -> CursorMut<'a, A>where <A as KeyAdapter<'b>>::Key: Borrow<Q>, 'a: 'b,

Returns a CursorMut pointing to an element with the given key. If no such element is found then a null cursor is returned.

If multiple elements with an identical key are found then an arbitrary one is returned.

source

pub fn find_owning<'a, Q: ?Sized + Ord>(self, key: &Q) -> CursorOwning<A>where <A as KeyAdapter<'a>>::Key: Borrow<Q>, Self: 'a,

such element is found then a null cursor is returned.

If multiple elements with an identical key are found then an arbitrary one is returned.

source

pub fn lower_bound<'a, 'b, Q: ?Sized + Ord>( &'a self, bound: Bound<&Q> ) -> Cursor<'a, A>where <A as KeyAdapter<'b>>::Key: Borrow<Q>, 'a: 'b,

Returns a Cursor pointing to the lowest element whose key is above the given bound. If no such element is found then a null cursor is returned.

source

pub fn lower_bound_mut<'a, 'b, Q: ?Sized + Ord>( &'a mut self, bound: Bound<&Q> ) -> CursorMut<'a, A>where <A as KeyAdapter<'b>>::Key: Borrow<Q>, 'a: 'b,

Returns a CursorMut pointing to the first element whose key is above the given bound. If no such element is found then a null cursor is returned.

source

pub fn lower_bound_owning<'a, Q: ?Sized + Ord>( self, bound: Bound<&Q> ) -> CursorOwning<A>where <A as KeyAdapter<'a>>::Key: Borrow<Q>, Self: 'a,

Returns a CursorOwning pointing to the first element whose key is above the given bound. If no such element is found then a null cursor is returned.

source

pub fn upper_bound<'a, 'b, Q: ?Sized + Ord>( &'a self, bound: Bound<&Q> ) -> Cursor<'a, A>where <A as KeyAdapter<'b>>::Key: Borrow<Q>, 'a: 'b,

Returns a Cursor pointing to the last element whose key is below the given bound. If no such element is found then a null cursor is returned.

source

pub fn upper_bound_mut<'a, 'b, Q: ?Sized + Ord>( &'a mut self, bound: Bound<&Q> ) -> CursorMut<'a, A>where <A as KeyAdapter<'b>>::Key: Borrow<Q>, 'a: 'b,

Returns a CursorMut pointing to the last element whose key is below the given bound. If no such element is found then a null cursor is returned.

source

pub fn upper_bound_owning<'a, Q: ?Sized + Ord>( self, bound: Bound<&Q> ) -> CursorOwning<A>where <A as KeyAdapter<'a>>::Key: Borrow<Q>, Self: 'a,

Returns a CursorOwning pointing to the last element whose key is below the given bound. If no such element is found then a null cursor is returned.

source

pub fn insert<'a>( &'a mut self, val: <A::PointerOps as PointerOps>::Pointer ) -> CursorMut<'_, A>where <A as KeyAdapter<'a>>::Key: Ord,

Inserts a new element into the RBTree.

The new element will be inserted at the correct position in the tree based on its key.

Returns a mutable cursor pointing to the newly added element.

Panics

Panics if the new element is already linked to a different intrusive collection.

source

pub fn entry<'a, Q: ?Sized + Ord>(&'a mut self, key: &Q) -> Entry<'a, A>where <A as KeyAdapter<'a>>::Key: Borrow<Q>,

Returns an Entry for the given key which contains a CursorMut to an element with the given key or an InsertCursor which points to a place in which to insert a new element with the given key.

This is more efficient than calling find followed by insert since the tree does not have to be searched a second time to find a place to insert the new element.

If multiple elements with an identical key are found then an arbitrary one is returned.

source

pub fn range<'a, Min: ?Sized + Ord, Max: ?Sized + Ord>( &'a self, min: Bound<&Min>, max: Bound<&Max> ) -> Iter<'a, A> where <A as KeyAdapter<'a>>::Key: Borrow<Min> + Borrow<Max> + Ord,

Constructs a double-ended iterator over a sub-range of elements in the tree, starting at min, and ending at max. If min is Unbounded, then it will be treated as “negative infinity”, and if max is Unbounded, then it will be treated as “positive infinity”. Thus range(Unbounded, Unbounded) will yield the whole collection.

Trait Implementations§

source§

impl<A: Adapter> Debug for RBTree<A>where A::LinkOps: RBTreeOps, <A::PointerOps as PointerOps>::Value: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<A: Adapter + Default> Default for RBTree<A>where A::LinkOps: RBTreeOps,

source§

fn default() -> RBTree<A>

Returns the “default value” for a type. Read more
source§

impl<A: Adapter> Drop for RBTree<A>where A::LinkOps: RBTreeOps,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<'a, A: Adapter + 'a> IntoIterator for &'a RBTree<A>where A::LinkOps: RBTreeOps,

§

type Item = &'a <<A as Adapter>::PointerOps as PointerOps>::Value

The type of the elements being iterated over.
§

type IntoIter = Iter<'a, A>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Iter<'a, A>

Creates an iterator from a value. Read more
source§

impl<A: Adapter> IntoIterator for RBTree<A>where A::LinkOps: RBTreeOps,

§

type Item = <<A as Adapter>::PointerOps as PointerOps>::Pointer

The type of the elements being iterated over.
§

type IntoIter = IntoIter<A>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> IntoIter<A>

Creates an iterator from a value. Read more
source§

impl<A: Adapter + Send> Send for RBTree<A>where <A::PointerOps as PointerOps>::Pointer: Send, A::LinkOps: RBTreeOps,

source§

impl<A: Adapter + Sync> Sync for RBTree<A>where <A::PointerOps as PointerOps>::Value: Sync, A::LinkOps: RBTreeOps,

Auto Trait Implementations§

§

impl<A> RefUnwindSafe for RBTree<A>where A: RefUnwindSafe, <<A as Adapter>::LinkOps as LinkOps>::LinkPtr: RefUnwindSafe,

§

impl<A> Unpin for RBTree<A>where A: Unpin, <<A as Adapter>::LinkOps as LinkOps>::LinkPtr: Unpin,

§

impl<A> UnwindSafe for RBTree<A>where A: UnwindSafe, <<A as Adapter>::LinkOps as LinkOps>::LinkPtr: UnwindSafe,

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere 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 Twhere 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 Twhere 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 Twhere 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.