[−][src]Struct id_tree::NodeId
An identifier used to differentiate between Node
s within a Tree
.
NodeId
s are not something that the calling context will ever have to worry about generating.
Tree
s generate NodeId
s as Node
s are inserted into them.
In addition, each NodeId
is specific to the Tree
that generated it. This means that if
there are two Tree
s - A
and B
- there's no worry of trying to access a Node
in A
with
an identifier that came from B
. Doing so will return a Result::Err
value instead of
returning the wrong Node
.
Potential NodeId
Issues
Because Tree
s pass out NodeId
s as Node
s are inserted, several issues can occur:
- If a
Node
is removed, theNodeId
that previously identified it now points to nothing (technically aNone
value in this case). - If a
Node
is removed and then another is inserted later, the "new"NodeId
that is returned can (and will) be the sameNodeId
that was used to identify a differentNode
previously.
The above issues may seem like deal-breakers, but our situation isn't as bad as it seems:
The first issue can be easily detected by the library itself. In this situation, a
Result::Err
will be returned with the appropriate NodeIdError
. The second issue, however, is
not something that the library can detect. To mitigate this problem, this library ensures the
following:
- All
Node
methods that provideNodeId
s will return&NodeId
s instead ofNodeId
s. - All
Tree
methods that read or insert data accept&NodeId
s instead of takingNodeId
s. - All
Tree
methods that remove data takeNodeId
s instead of accepting&NodeId
s. - All
Node
s that have been removed from aTree
will have their parent and child references cleared (to avoid leaking extraNodeId
copies). NodeId
s themselves areClone
, but notCopy
.
This means that no methods will ever take ownership of a NodeId
except for methods that remove
a Node
from a Tree
. The resulting behavior is that unless the caller explicitly Clone
s a
NodeId
they should never be in a situation where they accidentally hold onto a NodeId
too
long. This means that we have "almost safe references" that the caller can clone if they choose
to. Doing so, however, will open up the possibility of confusing which NodeId
s refer to which
Node
s in the calling context.
This does transfer some of the burden to the caller, but any errors should be fairly easy to
sort out because an explicit Clone
is required for such an error to occur.
Trait Implementations
impl Ord for NodeId
[src]
fn cmp(&self, other: &NodeId) -> Ordering
[src]
fn max(self, other: Self) -> Self
1.21.0[src]
Compares and returns the maximum of two values. Read more
fn min(self, other: Self) -> Self
1.21.0[src]
Compares and returns the minimum of two values. Read more
fn clamp(self, min: Self, max: Self) -> Self
[src]
clamp
)Restrict a value to a certain interval. Read more
impl PartialOrd<NodeId> for NodeId
[src]
fn partial_cmp(&self, other: &NodeId) -> Option<Ordering>
[src]
fn lt(&self, other: &NodeId) -> bool
[src]
fn le(&self, other: &NodeId) -> bool
[src]
fn gt(&self, other: &NodeId) -> bool
[src]
fn ge(&self, other: &NodeId) -> bool
[src]
impl PartialEq<NodeId> for NodeId
[src]
impl Clone for NodeId
[src]
fn clone(&self) -> NodeId
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
Performs copy-assignment from source
. Read more
impl Eq for NodeId
[src]
impl Debug for NodeId
[src]
impl Hash for NodeId
[src]
Auto Trait Implementations
impl Send for NodeId
impl Unpin for NodeId
impl Sync for NodeId
impl UnwindSafe for NodeId
impl RefUnwindSafe for NodeId
Blanket Implementations
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,