@@ -196,32 +196,35 @@ impl<K, V, const E: usize> Iterator for RawIter<K, V, E> {
196196 match kind {
197197 NodeKind :: Inner => {
198198 let inner = current. cast :: < InnerNode < K , V , E > > ( ) ;
199- if next_i < E {
199+ let next = if next_i < E {
200200 // More values in the current node
201201 self . stack . push ( ( current, next_i) ) ;
202202
203- // Recurse to a lesser if valid
204- let next_lesser =
205- unsafe { addr_of_mut ! ( ( * inner) . lesser_nodes[ next_i] ) } ;
206- let next_lesser_is_invalid =
207- unsafe { RelPtr :: is_invalid_raw ( next_lesser) } ;
208- if !next_lesser_is_invalid {
209- self . stack . push ( (
210- unsafe { RelPtr :: as_ptr_raw ( next_lesser) . cast ( ) } ,
211- 0 ,
212- ) ) ;
213- }
203+ // Next is a lesser node
204+ unsafe { addr_of_mut ! ( ( * inner) . lesser_nodes[ next_i] ) }
214205 } else {
215- // Recurse to a greater if valid
216- let next_greater =
217- unsafe { addr_of_mut ! ( ( * inner) . greater_node) } ;
218- let next_greater_is_invalid =
219- unsafe { RelPtr :: is_invalid_raw ( next_greater) } ;
220- if !next_greater_is_invalid {
221- self . stack . push ( (
222- unsafe { RelPtr :: as_ptr_raw ( next_greater) . cast ( ) } ,
223- 0 ,
224- ) ) ;
206+ // Next is a greater node
207+ unsafe { addr_of_mut ! ( ( * inner) . greater_node) }
208+ } ;
209+
210+ let next_is_invalid = unsafe { RelPtr :: is_invalid_raw ( next) } ;
211+ if !next_is_invalid {
212+ // Recurse left on next node
213+ let mut current = unsafe { RelPtr :: as_ptr_raw ( next) } ;
214+ loop {
215+ self . stack . push ( ( current, 0 ) ) ;
216+ let kind = unsafe { ( * current) . kind } ;
217+ match kind {
218+ NodeKind :: Inner => {
219+ let inner =
220+ current. cast :: < InnerNode < K , V , E > > ( ) ;
221+ let lesser = unsafe {
222+ addr_of_mut ! ( ( * inner) . lesser_nodes[ 0 ] )
223+ } ;
224+ current = unsafe { RelPtr :: as_ptr_raw ( lesser) } ;
225+ }
226+ NodeKind :: Leaf => break ,
227+ }
225228 }
226229 }
227230 }
0 commit comments