pub struct Column { /* private fields */ }
Expand description
A type-erased contiguous container for data of a homogeneous type.
Conceptually, a Column
is very similar to a type-erased Vec<T>
.
It also stores the change detection ticks for its components, kept in two separate
contiguous buffers internally. An element shares its data across these buffers by using the
same index (i.e. the entity at row 3 has its data at index 3 and its change detection ticks at
index 3). A slice to these contiguous blocks of memory can be fetched
via Column::get_data_slice
, Column::get_added_ticks_slice
, and
Column::get_changed_ticks_slice
.
Like many other low-level storage types, Column
has a limited and highly unsafe
interface. It’s highly advised to use higher level types and their safe abstractions
instead of working directly with Column
.
Implementations§
§impl Column
impl Column
pub fn item_layout(&self) -> Layout
pub fn item_layout(&self) -> Layout
Fetches the Layout
for the underlying type.
pub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Checks if the column is empty. Returns true
if there are no elements, false
otherwise.
pub fn get_data_ptr(&self) -> Ptr<'_>
pub fn get_data_ptr(&self) -> Ptr<'_>
Fetches the data pointer to the first element of the Column
.
The pointer is type erased, so using this function to fetch anything
other than the first element will require computing the offset using
Column::item_layout
.
pub unsafe fn get_data_slice<T>(&self) -> &[UnsafeCell<T>]
pub unsafe fn get_data_slice<T>(&self) -> &[UnsafeCell<T>]
Fetches the slice to the Column
’s data cast to a given type.
Note: The values stored within are UnsafeCell
.
Users of this API must ensure that accesses to each individual element
adhere to the safety invariants of UnsafeCell
.
§Safety
The type T
must be the type of the items in this column.
pub fn get_added_ticks_slice(&self) -> &[UnsafeCell<Tick>]
pub fn get_added_ticks_slice(&self) -> &[UnsafeCell<Tick>]
Fetches the slice to the Column
’s “added” change detection ticks.
Note: The values stored within are UnsafeCell
.
Users of this API must ensure that accesses to each individual element
adhere to the safety invariants of UnsafeCell
.
pub fn get_changed_ticks_slice(&self) -> &[UnsafeCell<Tick>]
pub fn get_changed_ticks_slice(&self) -> &[UnsafeCell<Tick>]
Fetches the slice to the Column
’s “changed” change detection ticks.
Note: The values stored within are UnsafeCell
.
Users of this API must ensure that accesses to each individual element
adhere to the safety invariants of UnsafeCell
.
pub fn get(&self, row: TableRow) -> Option<(Ptr<'_>, TickCells<'_>)>
pub fn get(&self, row: TableRow) -> Option<(Ptr<'_>, TickCells<'_>)>
Fetches a reference to the data and change detection ticks at row
.
Returns None
if row
is out of bounds.
pub fn get_data(&self, row: TableRow) -> Option<Ptr<'_>>
pub fn get_data(&self, row: TableRow) -> Option<Ptr<'_>>
Fetches a read-only reference to the data at row
.
Returns None
if row
is out of bounds.
pub unsafe fn get_data_unchecked(&self, row: TableRow) -> Ptr<'_>
pub unsafe fn get_data_unchecked(&self, row: TableRow) -> Ptr<'_>
Fetches a read-only reference to the data at row
. Unlike Column::get
this does not
do any bounds checking.
§Safety
row
must be within the range[0, self.len())
.- no other mutable reference to the data of the same row can exist at the same time
pub fn get_data_mut(&mut self, row: TableRow) -> Option<PtrMut<'_>>
pub fn get_data_mut(&mut self, row: TableRow) -> Option<PtrMut<'_>>
Fetches a mutable reference to the data at row
.
Returns None
if row
is out of bounds.
pub fn get_added_tick(&self, row: TableRow) -> Option<&UnsafeCell<Tick>>
pub fn get_added_tick(&self, row: TableRow) -> Option<&UnsafeCell<Tick>>
Fetches the “added” change detection tick for the value at row
.
Returns None
if row
is out of bounds.
Note: The values stored within are UnsafeCell
.
Users of this API must ensure that accesses to each individual element
adhere to the safety invariants of UnsafeCell
.
pub fn get_changed_tick(&self, row: TableRow) -> Option<&UnsafeCell<Tick>>
pub fn get_changed_tick(&self, row: TableRow) -> Option<&UnsafeCell<Tick>>
Fetches the “changed” change detection tick for the value at row
.
Returns None
if row
is out of bounds.
Note: The values stored within are UnsafeCell
.
Users of this API must ensure that accesses to each individual element
adhere to the safety invariants of UnsafeCell
.
pub fn get_ticks(&self, row: TableRow) -> Option<ComponentTicks>
pub fn get_ticks(&self, row: TableRow) -> Option<ComponentTicks>
Fetches the change detection ticks for the value at row
.
Returns None
if row
is out of bounds.
pub unsafe fn get_added_tick_unchecked(
&self,
row: TableRow,
) -> &UnsafeCell<Tick>
pub unsafe fn get_added_tick_unchecked( &self, row: TableRow, ) -> &UnsafeCell<Tick>
Fetches the “added” change detection tick for the value at row
. Unlike Column::get_added_tick
this function does not do any bounds checking.
§Safety
row
must be within the range [0, self.len())
.
pub unsafe fn get_changed_tick_unchecked(
&self,
row: TableRow,
) -> &UnsafeCell<Tick>
pub unsafe fn get_changed_tick_unchecked( &self, row: TableRow, ) -> &UnsafeCell<Tick>
Fetches the “changed” change detection tick for the value at row
. Unlike Column::get_changed_tick
this function does not do any bounds checking.
§Safety
row
must be within the range [0, self.len())
.
pub unsafe fn get_ticks_unchecked(&self, row: TableRow) -> ComponentTicks
pub unsafe fn get_ticks_unchecked(&self, row: TableRow) -> ComponentTicks
Fetches the change detection ticks for the value at row
. Unlike Column::get_ticks
this function does not do any bounds checking.
§Safety
row
must be within the range [0, self.len())
.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Column
impl !RefUnwindSafe for Column
impl !Send for Column
impl !Sync for Column
impl Unpin for Column
impl UnwindSafe for Column
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§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> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§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) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§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
§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.§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.§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.§impl<T> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 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)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§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.§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.§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.§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.