36
36
) ]
37
37
38
38
use std:: fmt:: { self , Debug , Formatter } ;
39
+ use std:: num:: NonZeroUsize ;
39
40
40
41
/// Vec-backed ID-tree.
41
42
///
42
43
/// Always contains at least a root node.
43
- #[ derive( Clone , PartialEq , Eq , Hash ) ]
44
44
pub struct Tree < T > {
45
+ // Safety note: node at index 0 is uninitialized!
45
46
vec : Vec < Node < T > > ,
46
47
}
47
48
49
+ impl < T > Clone for Tree < T > where T : Clone {
50
+ fn clone ( & self ) -> Self {
51
+ let mut vec = Vec :: with_capacity ( self . vec . len ( ) ) ;
52
+ // See Tree::with_capacity
53
+ unsafe {
54
+ vec. set_len ( 1 ) ;
55
+ }
56
+ vec. extend ( self . vec [ 1 ..] . iter ( ) . cloned ( ) ) ;
57
+ Tree { vec }
58
+ }
59
+ }
60
+
61
+ impl < T > std:: hash:: Hash for Tree < T > where T : std:: hash:: Hash {
62
+ fn hash < H > ( & self , state : & mut H ) where H : std:: hash:: Hasher {
63
+ self . vec [ 1 ..] . hash ( state)
64
+ }
65
+ }
66
+
67
+ impl < T > Eq for Tree < T > where T : Eq { }
68
+ impl < T > PartialEq for Tree < T > where T : PartialEq {
69
+ fn eq ( & self , other : & Self ) -> bool {
70
+ self . vec [ 1 ..] == other. vec [ 1 ..]
71
+ }
72
+ }
73
+
74
+
48
75
/// Node ID.
49
76
///
50
77
/// Index into a `Tree`-internal `Vec`.
51
78
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
52
- pub struct NodeId ( usize ) ;
79
+ pub struct NodeId ( NonZeroUsize ) ;
80
+
81
+ const ROOT : NodeId = NodeId ( unsafe { NonZeroUsize :: new_unchecked ( 1 ) } ) ;
53
82
54
83
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
55
84
struct Node < T > {
@@ -60,6 +89,13 @@ struct Node<T> {
60
89
value : T ,
61
90
}
62
91
92
+ fn _static_assert_size_of_node ( ) {
93
+ // "Instanciating" the generic `transmute` function without calling it
94
+ // still triggers the magic compile-time check
95
+ // that input and output types have the same `size_of()`.
96
+ let _ = std:: mem:: transmute :: < Node < ( ) > , [ usize ; 5 ] > ;
97
+ }
98
+
63
99
impl < T > Node < T > {
64
100
fn new ( value : T ) -> Self {
65
101
Node {
@@ -113,33 +149,42 @@ impl<'a, T: 'a> PartialEq for NodeRef<'a, T> {
113
149
impl < T > Tree < T > {
114
150
/// Creates a tree with a root node.
115
151
pub fn new ( root : T ) -> Self {
116
- Tree { vec : vec ! [ Node :: new ( root) ] }
152
+ Self :: with_capacity ( root, 1 )
117
153
}
118
154
119
155
/// Creates a tree with a root node and the specified capacity.
120
156
pub fn with_capacity ( root : T , capacity : usize ) -> Self {
121
- let mut vec = Vec :: with_capacity ( capacity) ;
157
+ let mut vec = Vec :: with_capacity ( capacity. saturating_add ( 1 ) ) ;
158
+ // The node at index 0 is unused and uninitialized.
159
+ // This allows using NonZeroUsize directly as an index.
160
+ //
161
+ // Safety: we requested at least 1 of capacity, so this is in bounds.
162
+ // It is up to the rest of the crate to not access this uninitialized node.
163
+ unsafe {
164
+ vec. set_len ( 1 ) ;
165
+ }
166
+ // The root node is at index 1
122
167
vec. push ( Node :: new ( root) ) ;
123
168
Tree { vec }
124
169
}
125
170
126
171
/// Returns a reference to the specified node.
127
172
pub fn get ( & self , id : NodeId ) -> Option < NodeRef < T > > {
128
- self . vec . get ( id. 0 ) . map ( |node| NodeRef { id, node, tree : self } )
173
+ self . vec . get ( id. 0 . get ( ) ) . map ( |node| NodeRef { id, node, tree : self } )
129
174
}
130
175
131
176
/// Returns a mutator of the specified node.
132
177
pub fn get_mut ( & mut self , id : NodeId ) -> Option < NodeMut < T > > {
133
- let exists = self . vec . get ( id. 0 ) . map ( |_| ( ) ) ;
178
+ let exists = self . vec . get ( id. 0 . get ( ) ) . map ( |_| ( ) ) ;
134
179
exists. map ( move |_| NodeMut { id, tree : self } )
135
180
}
136
181
137
182
unsafe fn node ( & self , id : NodeId ) -> & Node < T > {
138
- self . vec . get_unchecked ( id. 0 )
183
+ self . vec . get_unchecked ( id. 0 . get ( ) )
139
184
}
140
185
141
186
unsafe fn node_mut ( & mut self , id : NodeId ) -> & mut Node < T > {
142
- self . vec . get_unchecked_mut ( id. 0 )
187
+ self . vec . get_unchecked_mut ( id. 0 . get ( ) )
143
188
}
144
189
145
190
/// Returns a reference to the specified node.
@@ -154,17 +199,19 @@ impl<T> Tree<T> {
154
199
155
200
/// Returns a reference to the root node.
156
201
pub fn root ( & self ) -> NodeRef < T > {
157
- unsafe { self . get_unchecked ( NodeId ( 0 ) ) }
202
+ unsafe { self . get_unchecked ( ROOT ) }
158
203
}
159
204
160
205
/// Returns a mutator of the root node.
161
206
pub fn root_mut ( & mut self ) -> NodeMut < T > {
162
- unsafe { self . get_unchecked_mut ( NodeId ( 0 ) ) }
207
+ unsafe { self . get_unchecked_mut ( ROOT ) }
163
208
}
164
209
165
210
/// Creates an orphan node.
166
211
pub fn orphan ( & mut self , value : T ) -> NodeMut < T > {
167
- let id = NodeId ( self . vec . len ( ) ) ;
212
+ // Safety: vec.len() starts at 2 in Self::with_capacity and never shrinks,
213
+ // so it is non-zero.
214
+ let id = NodeId ( unsafe { NonZeroUsize :: new_unchecked ( self . vec . len ( ) ) } ) ;
168
215
self . vec . push ( Node :: new ( value) ) ;
169
216
unsafe { self . get_unchecked_mut ( id) }
170
217
}
@@ -628,8 +675,8 @@ macro_rules! tree {
628
675
impl < T : Debug > Debug for Tree < T > {
629
676
fn fmt ( & self , f : & mut Formatter ) -> Result < ( ) , fmt:: Error > {
630
677
use iter:: Edge ;
678
+ write ! ( f, "Tree {{" ) ?;
631
679
if f. alternate ( ) {
632
- write ! ( f, "Tree {{" ) ?;
633
680
for edge in self . root ( ) . traverse ( ) {
634
681
match edge {
635
682
Edge :: Open ( node) if node. has_children ( ) => {
@@ -653,7 +700,12 @@ impl<T: Debug> Debug for Tree<T> {
653
700
}
654
701
write ! ( f, " }}" )
655
702
} else {
656
- f. debug_struct ( "Tree" ) . field ( "vec" , & self . vec ) . finish ( )
703
+ write ! ( f, "Tree {{ [<uninitialized>" ) ?;
704
+ for node in & self . vec [ 1 ..] {
705
+ write ! ( f, ", " ) ?;
706
+ node. fmt ( f) ?;
707
+ }
708
+ write ! ( f, "] }}" )
657
709
}
658
710
}
659
711
}
0 commit comments