syntax_parser_generator/handles/specials/orderly_handled.rs
1// TODO create a whole module for this, complete with explicit data structures
2
3use std::cmp::Ordering;
4
5use crate::handles::{Handle, Handled};
6
7/// [Handled] types whose handles can be compared by order.
8///
9/// This trait requires no special implementations, and currently exists for symbolic purposes
10/// only. When a type implements this trait, it indicates that the type's handles compared by the
11/// order of their identifying serial numbers.
12///
13/// This means, for example, that handles to an [OrderlyHandled] type, generated by a
14/// [HandledVec](crate::handles::collections::HandledVec), can be compared by their order of
15/// insertion into this collection.
16///
17/// # Example
18/// ```rust
19/// # use syntax_parser_generator::handles::{Handle, Handled};
20/// # use syntax_parser_generator::handles::collections::HandledVec;use syntax_parser_generator::handles::specials::OrderlyHandled;
21///
22/// struct LinkedListNode {
23/// num: u32,
24/// next: Option<Handle<LinkedListNode>>,
25/// }
26/// impl Handled for LinkedListNode { type HandleCoreType = u8; }
27/// impl OrderlyHandled for LinkedListNode {}
28///
29/// let mut nodes = HandledVec::new();
30/// let tail_handle = nodes.insert(LinkedListNode { num: 1337, next: None });
31/// let head_handle = nodes.insert(LinkedListNode { num: 42, next: Some(tail_handle) });
32///
33/// assert!(tail_handle < head_handle)
34/// ```
35pub trait OrderlyHandled: Handled {}
36
37impl<T> Ord for Handle<T>
38where
39 T: OrderlyHandled,
40{
41 fn cmp(&self, other: &Self) -> Ordering {
42 self.core.cmp(&other.core)
43 }
44}
45
46impl<T> PartialOrd for Handle<T>
47where
48 T: OrderlyHandled,
49{
50 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
51 self.core.partial_cmp(&other.core)
52 }
53}