Enum orx_linked_list::NodeIndexError
source · pub enum NodeIndexError {
RemovedNode,
WrongCollection,
ReorganizedCollection,
}
Expand description
Error observed while using a NodeIndex
to access a node in a SelfRefCol
.
Variants§
RemovedNode
RemovedNode => Referenced node is removed from the collection. Node index can only be used if the corresponding node still belongs to the collection.
§Examples
use orx_selfref_col::*;
#[derive(Clone, Copy, Debug)]
struct Var;
impl<'a> Variant<'a, char> for Var {
type Storage = NodeDataLazyClose<char>;
type Prev = NodeRefSingle<'a, Self, char>;
type Next = NodeRefsVec<'a, Self, char>;
type Ends = NodeRefsArray<'a, 2, Self, char>;
type MemoryReclaim = MemoryReclaimOnThreshold<2>;
}
let mut col = SelfRefCol::<Var, _>::new();
let [a, b, c, d, e, f, g] = col
.mutate_take(['a', 'b', 'c', 'd', 'e', 'f', 'g'], |x, values| {
values.map(|val| x.push_get_ref(val).index(&x))
});
let removed_b = col.mutate_take(b, |x, b| x.as_node_ref(b).close_node_take_data(&x)); // does not trigger reclaim yet
assert_eq!(removed_b, 'b');
assert_eq!(a.invalidity_reason_for_collection(&col), None);
assert_eq!(c.invalidity_reason_for_collection(&col), None);
assert_eq!(b.invalidity_reason_for_collection(&col), Some(NodeIndexError::RemovedNode));
WrongCollection
WrongCollection => Node index is used on a collection different than the collection it is created for. Node indices can only be used for the collection they belong to.
§Examples
use orx_selfref_col::*;
#[derive(Clone, Copy, Debug)]
struct Var;
impl<'a> Variant<'a, char> for Var {
type Storage = NodeDataLazyClose<char>;
type Prev = NodeRefSingle<'a, Self, char>;
type Next = NodeRefsVec<'a, Self, char>;
type Ends = NodeRefsArray<'a, 2, Self, char>;
type MemoryReclaim = MemoryReclaimOnThreshold<2>;
}
let mut col1 = SelfRefCol::<Var, _>::new();
let a = col1.mutate_take('a', |x, a| x.push_get_ref(a).index(&x));
let col2 = SelfRefCol::<Var, _>::new();
assert_eq!(a.invalidity_reason_for_collection(&col1), None);
assert_eq!(a.invalidity_reason_for_collection(&col2), Some(NodeIndexError::WrongCollection));
ReorganizedCollection
ReorganizedCollection => All nodes of the containing collection is re-organized in order to reclaim memory of closed nodes. Such a reorganization happens only if the collection uses MemoryReclaimOnThreshold
policy and utilization level of memory drops below the threshold due to pop and remove operations. It is never observed if the list only grows or if MemoryReclaimNever
policy is used. In this case, the references need to be recreated.
§Examples
use orx_selfref_col::*;
#[derive(Clone, Copy, Debug)]
struct Var;
impl<'a> Variant<'a, char> for Var {
type Storage = NodeDataLazyClose<char>;
type Prev = NodeRefSingle<'a, Self, char>;
type Next = NodeRefsVec<'a, Self, char>;
type Ends = NodeRefsArray<'a, 2, Self, char>;
type MemoryReclaim = MemoryReclaimOnThreshold<2>;
}
let mut col = SelfRefCol::<Var, _>::new();
let [a, b, c] = col.mutate_take(['a', 'b', 'c'], |x, values| {
values.map(|val| x.push_get_ref(val).index(&x))
});
// triggers memory reclaim, invalidating all prior node indices
let removed_b = col.mutate_take(b, |x, b| x.as_node_ref(b).close_node_take_data(&x));
assert_eq!(removed_b, 'b');
assert_eq!(a.invalidity_reason_for_collection(&col), Some(NodeIndexError::ReorganizedCollection));
assert_eq!(b.invalidity_reason_for_collection(&col), Some(NodeIndexError::ReorganizedCollection));
assert_eq!(c.invalidity_reason_for_collection(&col), Some(NodeIndexError::ReorganizedCollection));
Trait Implementations§
source§impl Clone for NodeIndexError
impl Clone for NodeIndexError
source§fn clone(&self) -> NodeIndexError
fn clone(&self) -> NodeIndexError
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for NodeIndexError
impl Debug for NodeIndexError
source§impl Display for NodeIndexError
impl Display for NodeIndexError
source§impl Error for NodeIndexError
impl Error for NodeIndexError
1.30.0 · source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · source§fn description(&self) -> &str
fn description(&self) -> &str
source§impl PartialEq for NodeIndexError
impl PartialEq for NodeIndexError
impl Copy for NodeIndexError
impl Eq for NodeIndexError
impl StructuralPartialEq for NodeIndexError
Auto Trait Implementations§
impl Freeze for NodeIndexError
impl RefUnwindSafe for NodeIndexError
impl Send for NodeIndexError
impl Sync for NodeIndexError
impl Unpin for NodeIndexError
impl UnwindSafe for NodeIndexError
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
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> CloneToUninit for Twhere
T: Copy,
impl<T> CloneToUninit for Twhere
T: Copy,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)