@@ -8,9 +8,8 @@ use core::ptr::{self, NonNull};
8
8
use core:: { borrow, mem} ;
9
9
10
10
use nginx_sys:: {
11
- ngx_rbtree_data, ngx_rbtree_delete, ngx_rbtree_init, ngx_rbtree_insert,
12
- ngx_rbtree_insert_value, ngx_rbtree_key_t, ngx_rbtree_min, ngx_rbtree_next, ngx_rbtree_node_t,
13
- ngx_rbtree_t,
11
+ ngx_rbt_red, ngx_rbtree_data, ngx_rbtree_delete, ngx_rbtree_init, ngx_rbtree_insert,
12
+ ngx_rbtree_key_t, ngx_rbtree_min, ngx_rbtree_next, ngx_rbtree_node_t, ngx_rbtree_t,
14
13
} ;
15
14
16
15
use crate :: allocator:: { self , AllocError , Allocator } ;
@@ -147,29 +146,6 @@ where
147
146
& self . alloc
148
147
}
149
148
150
- /// Attempts to create and initialize a new RbTree with specified allocator.
151
- pub fn try_new_in ( alloc : A ) -> Result < Self , AllocError > {
152
- let layout = Layout :: new :: < ngx_rbtree_node_t > ( ) ;
153
- let sentinel: NonNull < ngx_rbtree_node_t > = alloc. allocate_zeroed ( layout) ?. cast ( ) ;
154
-
155
- let mut this = RbTree {
156
- tree : unsafe { mem:: zeroed ( ) } ,
157
- sentinel,
158
- alloc,
159
- _ph : Default :: default ( ) ,
160
- } ;
161
-
162
- unsafe {
163
- ngx_rbtree_init (
164
- & mut this. tree ,
165
- this. sentinel . as_ptr ( ) ,
166
- Some ( ngx_rbtree_insert_value) ,
167
- )
168
- } ;
169
-
170
- Ok ( this)
171
- }
172
-
173
149
/// Clears the tree, removing all elements.
174
150
pub fn clear ( & mut self ) {
175
151
let iter = RawIter :: new ( NonNull :: from ( & self . tree ) ) ;
@@ -211,6 +187,23 @@ where
211
187
A : Allocator ,
212
188
K : Hash + Ord ,
213
189
{
190
+ /// Attempts to create and initialize a new RbTree with specified allocator.
191
+ pub fn try_new_in ( alloc : A ) -> Result < Self , AllocError > {
192
+ let layout = Layout :: new :: < ngx_rbtree_node_t > ( ) ;
193
+ let sentinel: NonNull < ngx_rbtree_node_t > = alloc. allocate_zeroed ( layout) ?. cast ( ) ;
194
+
195
+ let mut this = RbTree {
196
+ tree : unsafe { mem:: zeroed ( ) } ,
197
+ sentinel,
198
+ alloc,
199
+ _ph : Default :: default ( ) ,
200
+ } ;
201
+
202
+ unsafe { ngx_rbtree_init ( & mut this. tree , this. sentinel . as_ptr ( ) , Some ( Self :: insert) ) } ;
203
+
204
+ Ok ( this)
205
+ }
206
+
214
207
/// Returns a reference to the value corresponding to the key.
215
208
pub fn get < Q > ( & self , key : & Q ) -> Option < & V >
216
209
where
@@ -274,6 +267,40 @@ where
274
267
Ok ( unsafe { & mut node. as_mut ( ) . value } )
275
268
}
276
269
270
+ unsafe extern "C" fn insert (
271
+ mut temp : * mut ngx_rbtree_node_t ,
272
+ node : * mut ngx_rbtree_node_t ,
273
+ sentinel : * mut ngx_rbtree_node_t ,
274
+ ) {
275
+ let n = & mut * ngx_rbtree_data ! ( node, Node <K , V >, node) ;
276
+
277
+ loop {
278
+ let t = & mut * ngx_rbtree_data ! ( temp, Node <K , V >, node) ;
279
+ let p = match Ord :: cmp ( & n. node . key , & t. node . key ) {
280
+ Ordering :: Less => & mut t. node . left ,
281
+ Ordering :: Greater => & mut t. node . right ,
282
+ Ordering :: Equal => match Ord :: cmp ( & n. key , & t. key ) {
283
+ Ordering :: Less => & mut t. node . left ,
284
+ Ordering :: Greater => & mut t. node . right ,
285
+ // should be handled in try_insert
286
+ Ordering :: Equal => & mut t. node . right ,
287
+ } ,
288
+ } ;
289
+
290
+ if ptr:: addr_eq ( * p, sentinel) {
291
+ * p = node;
292
+ break ;
293
+ }
294
+
295
+ temp = * p;
296
+ }
297
+
298
+ n. node . parent = temp;
299
+ n. node . left = sentinel;
300
+ n. node . right = sentinel;
301
+ ngx_rbt_red ( node) ;
302
+ }
303
+
277
304
fn lookup < Q > ( & self , key : & Q ) -> Option < NonNull < Node < K , V > > >
278
305
where
279
306
K : borrow:: Borrow < Q > ,
@@ -283,30 +310,17 @@ where
283
310
let hash = RbTreeHasher :: default ( ) . hash_one ( key) as ngx_rbtree_key_t ;
284
311
285
312
while !ptr:: addr_eq ( node, self . tree . sentinel ) {
286
- match Ord :: cmp ( & hash, unsafe { & ( * node) . key } ) {
287
- Ordering :: Less => {
288
- node = unsafe { ( * node) . left } ;
289
- continue ;
290
- }
291
- Ordering :: Greater => {
292
- node = unsafe { ( * node) . right } ;
293
- continue ;
294
- }
295
- Ordering :: Equal => ( ) ,
296
- } ;
297
-
298
- let n = unsafe { ngx_rbtree_data ! ( node, Node <K , V >, node) } ;
299
-
300
- match Ord :: cmp ( key, unsafe { ( * n) . key . borrow ( ) } ) {
301
- Ordering :: Less => {
302
- node = unsafe { ( * node) . left } ;
303
- continue ;
304
- }
305
- Ordering :: Greater => {
306
- node = unsafe { ( * node) . right } ;
307
- continue ;
308
- }
309
- Ordering :: Equal => return Some ( unsafe { NonNull :: new_unchecked ( n) } ) ,
313
+ let n = unsafe { NonNull :: new_unchecked ( ngx_rbtree_data ! ( node, Node <K , V >, node) ) } ;
314
+ let nr = unsafe { n. as_ref ( ) } ;
315
+
316
+ node = match Ord :: cmp ( & hash, & nr. node . key ) {
317
+ Ordering :: Less => nr. node . left ,
318
+ Ordering :: Greater => nr. node . right ,
319
+ Ordering :: Equal => match Ord :: cmp ( key, nr. key . borrow ( ) ) {
320
+ Ordering :: Less => nr. node . left ,
321
+ Ordering :: Greater => nr. node . right ,
322
+ Ordering :: Equal => return Some ( n) ,
323
+ } ,
310
324
}
311
325
}
312
326
0 commit comments