Skip to main content

List

Enum List 

Source
pub enum List<'cx, T> {
    Nil,
    Cons(ListHead<'cx, T>),
}
Expand description

The List type from Postgres, lifted into Rust Note: you may want the ListHead type

Variants§

§

Nil

§

Cons(ListHead<'cx, T>)

Implementations§

Source§

impl<'cx, T: Enlist> List<'cx, T>

Source

pub fn get(&self, index: usize) -> Option<&T>

Borrow an item from the List at the index

Source

pub fn get_mut(&mut self, index: usize) -> Option<&mut T>

Mutably borrow an item from the List at the index

Source

pub fn unstable_push_in_context( &mut self, value: T, mcx: &'cx MemCx<'_>, ) -> &mut ListHead<'cx, T>

Pushes an item into the List

Allocates the entire list in referenced context if it had zero elements, otherwise uses the List’s own context.

“Unstable” because this may receive breaking changes.

Source

pub fn drain<R>(&mut self, range: R) -> Drain<'_, 'cx, T>
where R: RangeBounds<usize>,

Source

pub fn iter(&self) -> impl Iterator<Item = &T>

Source

pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T>

Source§

impl<T> List<'_, T>

Source

pub fn as_cells(&self) -> &[ListCell<T>]

Borrow the List’s slice of cells

Note that like with Vec, this slice may move after appending to the List! Due to lifetimes this isn’t a problem until unsafe Rust becomes involved, but with Postgres extensions it often does.

Note that if you use this on a 0-item list, you get an empty slice, which is not going to be equal to the null pointer.

Source

pub fn as_cells_mut(&mut self) -> &mut [ListCell<T>]

Mutably borrow the List’s slice of cells

Includes the same caveats as with List::as_cells, but with “less” problems: &mut means you should not have other pointers to the list anyways.

Note that if you use this on a 0-item list, you get an empty slice, which is not going to be equal to the null pointer.

Source§

impl<T: Enlist> List<'_, T>

Source

pub unsafe fn downcast_ptr_in_memcx<'cx>( ptr: *mut List, memcx: &'cx MemCx<'_>, ) -> Option<List<'cx, T>>

Attempt to obtain a List<T> from a *mut pg_sys::List

This may be somewhat confusing: A valid List of any type is the null pointer, as in the Lisp (car, cdr) representation. This remains true even after significant reworks of the List type in Postgres 13, which cause it to internally use a “flat array” representation.

Thus, this returns Some even if the List is NULL, because it is Some(List::Nil), and returns None only if the List is non-NULL but downcasting failed!

§Safety

This assumes the pointer is either NULL or the NodeTag is valid to read, so it is not okay to call this on pointers to deallocated or uninit data.

If it returns as Some and the List is more than zero length, it also asserts that the entire List’s elements: *mut ListCell is validly initialized as T in each ListCell and that the List is allocated from a MemCx that lasts at least as long as the current context.

Note: This memory context must last long enough for your purposes. YOU are responsible for bounding its lifetime correctly.

Source§

impl<'cx, T> List<'cx, T>

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn capacity(&self) -> usize

Source

pub fn into_ptr(self) -> *mut List

Source

pub fn as_ptr(&self) -> *const List

Source

pub fn as_mut_ptr(&mut self) -> *mut List

Source§

impl<'cx, T: Enlist> List<'cx, T>

Source

pub fn try_push(&mut self, value: T) -> Result<&mut ListHead<'cx, T>, &mut Self>

Attempt to push or Err if it would allocate

This exists primarily to allow working with a list with maybe-zero capacity.

Source

pub fn try_reserve( &mut self, items: usize, ) -> Result<&mut ListHead<'cx, T>, &mut Self>

Try to reserve space for N more items

Trait Implementations§

Source§

impl<'cx, T: Debug> Debug for List<'cx, T>

Source§

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

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

impl<'cx, T> Default for List<'cx, T>

Note the absence of impl Default for ListHead: it must initialize at least 1 element to be created at all

Source§

fn default() -> List<'cx, T>

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

impl<'a, T: Enlist> IntoIterator for List<'a, T>

Source§

type IntoIter = ListIter<'a, T>

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

type Item = T

The type of the elements being iterated over.
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<'cx, T> !Send for List<'cx, T>

§

impl<'cx, T> !Sync for List<'cx, T>

§

impl<'cx, T> Freeze for List<'cx, T>
where ListHead<'cx, T>: Freeze,

§

impl<'cx, T> RefUnwindSafe for List<'cx, T>
where ListHead<'cx, T>: RefUnwindSafe,

§

impl<'cx, T> Unpin for List<'cx, T>
where ListHead<'cx, T>: Unpin,

§

impl<'cx, T> UnsafeUnpin for List<'cx, T>
where ListHead<'cx, T>: UnsafeUnpin,

§

impl<'cx, T> UnwindSafe for List<'cx, T>
where ListHead<'cx, T>: UnwindSafe,

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> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

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

Source§

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.