@@ -126,33 +126,31 @@ where
126
126
indices : Vec < usize > ,
127
127
}
128
128
129
- // get_at_index! and set_at_index! macros to toggle bounds checking at compile time
129
+ // get_at_index and set_at_index helper functions to toggle bounds checking at compile time
130
130
#[ cfg( not( feature = "unsafe_optimizations" ) ) ]
131
- macro_rules! get_at_index {
132
- ( $container: expr, $index: expr) => {
133
- & $container[ $index]
134
- } ;
131
+ #[ inline( always) ]
132
+ fn get_at_index < T > ( container : & [ T ] , index : usize ) -> & T {
133
+ & container[ index]
135
134
}
136
135
137
136
#[ cfg( feature = "unsafe_optimizations" ) ]
138
- macro_rules! get_at_index {
139
- ( $container: expr, $index: expr) => {
140
- unsafe { $container. get_unchecked( $index) }
141
- } ;
137
+ #[ inline( always) ]
138
+ fn get_at_index < T > ( container : & [ T ] , index : usize ) -> & T {
139
+ unsafe { container. get_unchecked ( index) }
142
140
}
143
141
144
142
#[ cfg( not( feature = "unsafe_optimizations" ) ) ]
145
- macro_rules! set_at_index {
146
- ( $container: expr, $index: expr, $value: expr) => {
147
- $container[ $index] = $value
148
- } ;
143
+ #[ inline( always) ]
144
+ fn set_at_index < T > ( container : & mut [ T ] , index : usize , value : T ) {
145
+ container[ index] = value;
149
146
}
150
147
151
148
#[ cfg( feature = "unsafe_optimizations" ) ]
152
- macro_rules! set_at_index {
153
- ( $container: expr, $index: expr, $value: expr) => {
154
- unsafe { * $container. get_unchecked_mut( $index) = $value }
155
- } ;
149
+ #[ inline( always) ]
150
+ fn set_at_index < T > ( container : & mut [ T ] , index : usize , value : T ) {
151
+ unsafe {
152
+ * container. get_unchecked_mut ( index) = value;
153
+ }
156
154
}
157
155
158
156
impl < T > StaticAABB2DIndexBuilder < T >
@@ -193,21 +191,7 @@ where
193
191
}
194
192
}
195
193
196
- // unsafe alternative for performance (uninitialized memory rather than initialize to zero)
197
- // since it is all initialized later before use
198
- #[ cfg( feature = "unsafe_optimizations" ) ]
199
- let init_boxes = || {
200
- let mut boxes = Vec :: with_capacity ( num_nodes) ;
201
- unsafe {
202
- boxes. set_len ( num_nodes) ;
203
- }
204
- boxes
205
- } ;
206
-
207
- #[ cfg( not( feature = "unsafe_optimizations" ) ) ]
208
- let init_boxes = || vec ! [ AABB :: default ( ) ; num_nodes] ;
209
-
210
- let boxes = init_boxes ( ) ;
194
+ let boxes = vec ! [ AABB :: default ( ) ; num_nodes] ;
211
195
212
196
StaticAABB2DIndexBuilder {
213
197
min_x : T :: max_value ( ) ,
@@ -259,7 +243,11 @@ where
259
243
debug_assert ! ( min_x <= max_x) ;
260
244
debug_assert ! ( min_y <= max_y) ;
261
245
262
- set_at_index ! ( self . boxes, self . pos, AABB :: new( min_x, min_y, max_x, max_y) ) ;
246
+ set_at_index (
247
+ & mut self . boxes ,
248
+ self . pos ,
249
+ AABB :: new ( min_x, min_y, max_x, max_y) ,
250
+ ) ;
263
251
self . pos += 1 ;
264
252
265
253
self . min_x = T :: min ( self . min_x , min_x) ;
@@ -291,12 +279,12 @@ where
291
279
// if number of items is less than node size then skip sorting since each node of boxes must
292
280
// be fully scanned regardless and there is only one node
293
281
if self . num_items <= self . node_size {
294
- set_at_index ! ( self . indices, self . pos, 0 ) ;
282
+ set_at_index ( & mut self . indices , self . pos , 0 ) ;
295
283
// fill root box with total extents
296
- set_at_index ! (
297
- self . boxes,
284
+ set_at_index (
285
+ & mut self . boxes ,
298
286
self . pos ,
299
- AABB :: new( self . min_x, self . min_y, self . max_x, self . max_y)
287
+ AABB :: new ( self . min_x , self . min_y , self . max_x , self . max_y ) ,
300
288
) ;
301
289
return Ok ( StaticAABB2DIndex {
302
290
min_x : self . min_x ,
@@ -354,7 +342,7 @@ where
354
342
// generate nodes at each tree level, bottom-up
355
343
let mut pos = 0 ;
356
344
for i in 0 ..self . level_bounds . len ( ) - 1 {
357
- let end = * get_at_index ! ( self . level_bounds, i) ;
345
+ let end = * get_at_index ( & self . level_bounds , i) ;
358
346
359
347
// generate a parent node for each block of consecutive node_size nodes
360
348
while pos < end {
@@ -367,7 +355,7 @@ where
367
355
// calculate bounding box for the new node
368
356
let mut j = 0 ;
369
357
while j < self . node_size && pos < end {
370
- let aabb = get_at_index ! ( self . boxes, pos) ;
358
+ let aabb = get_at_index ( & self . boxes , pos) ;
371
359
pos += 1 ;
372
360
node_min_x = T :: min ( node_min_x, aabb. min_x ) ;
373
361
node_min_y = T :: min ( node_min_y, aabb. min_y ) ;
@@ -377,11 +365,11 @@ where
377
365
}
378
366
379
367
// add the new node to the tree
380
- set_at_index ! ( self . indices, self . pos, node_index) ;
381
- set_at_index ! (
382
- self . boxes,
368
+ set_at_index ( & mut self . indices , self . pos , node_index) ;
369
+ set_at_index (
370
+ & mut self . boxes ,
383
371
self . pos ,
384
- AABB :: new( node_min_x, node_min_y, node_max_x, node_max_y)
372
+ AABB :: new ( node_min_x, node_min_y, node_max_x, node_max_y) ,
385
373
) ;
386
374
self . pos += 1 ;
387
375
}
@@ -468,9 +456,9 @@ pub fn hilbert_xy_to_index(x: u16, y: u16) -> u32 {
468
456
469
457
// modified quick sort that skips sorting boxes within the same node
470
458
fn sort < T > (
471
- values : & mut Vec < u32 > ,
472
- boxes : & mut Vec < AABB < T > > ,
473
- indices : & mut Vec < usize > ,
459
+ values : & mut [ u32 ] ,
460
+ boxes : & mut [ AABB < T > ] ,
461
+ indices : & mut [ usize ] ,
474
462
left : usize ,
475
463
right : usize ,
476
464
node_size : usize ,
@@ -485,21 +473,21 @@ fn sort<T>(
485
473
return ;
486
474
}
487
475
488
- let pivot = * get_at_index ! ( values, ( left + right) >> 1 ) ;
476
+ let pivot = * get_at_index ( values, ( left + right) >> 1 ) ;
489
477
let mut i = left. wrapping_sub ( 1 ) ;
490
478
let mut j = right. wrapping_add ( 1 ) ;
491
479
492
480
loop {
493
481
loop {
494
482
i = i. wrapping_add ( 1 ) ;
495
- if * get_at_index ! ( values, i) >= pivot {
483
+ if * get_at_index ( values, i) >= pivot {
496
484
break ;
497
485
}
498
486
}
499
487
500
488
loop {
501
489
j = j. wrapping_sub ( 1 ) ;
502
- if * get_at_index ! ( values, j) <= pivot {
490
+ if * get_at_index ( values, j) <= pivot {
503
491
break ;
504
492
}
505
493
}
@@ -558,7 +546,7 @@ where
558
546
let level = aabb_index. level_bounds . len ( ) - 1 ;
559
547
let end = min (
560
548
node_index + aabb_index. node_size ,
561
- * get_at_index ! ( aabb_index. level_bounds, level) ,
549
+ * get_at_index ( & aabb_index. level_bounds , level) ,
562
550
) ;
563
551
QueryIterator {
564
552
aabb_index,
@@ -589,13 +577,13 @@ where
589
577
let current_pos = self . pos ;
590
578
self . pos += 1 ;
591
579
592
- let aabb = get_at_index ! ( self . aabb_index. boxes, current_pos) ;
580
+ let aabb = get_at_index ( & self . aabb_index . boxes , current_pos) ;
593
581
if !aabb. overlaps ( self . min_x , self . min_y , self . max_x , self . max_y ) {
594
582
// no overlap
595
583
continue ;
596
584
}
597
585
598
- let index = * get_at_index ! ( self . aabb_index. indices, current_pos) ;
586
+ let index = * get_at_index ( & self . aabb_index . indices , current_pos) ;
599
587
if self . node_index < self . aabb_index . num_items {
600
588
return Some ( index) ;
601
589
} else {
@@ -610,7 +598,7 @@ where
610
598
self . pos = self . node_index ;
611
599
self . end = min (
612
600
self . node_index + self . aabb_index . node_size ,
613
- * get_at_index ! ( self . aabb_index. level_bounds, self . level) ,
601
+ * get_at_index ( & self . aabb_index . level_bounds , self . level ) ,
614
602
) ;
615
603
} else {
616
604
return None ;
@@ -664,7 +652,7 @@ where
664
652
let level = aabb_index. level_bounds . len ( ) - 1 ;
665
653
let end = min (
666
654
node_index + aabb_index. node_size ,
667
- * get_at_index ! ( aabb_index. level_bounds, level) ,
655
+ * get_at_index ( & aabb_index. level_bounds , level) ,
668
656
) ;
669
657
670
658
// ensure the stack is empty for use
@@ -699,13 +687,13 @@ where
699
687
let current_pos = self . pos ;
700
688
self . pos += 1 ;
701
689
702
- let aabb = get_at_index ! ( self . aabb_index. boxes, current_pos) ;
690
+ let aabb = get_at_index ( & self . aabb_index . boxes , current_pos) ;
703
691
if !aabb. overlaps ( self . min_x , self . min_y , self . max_x , self . max_y ) {
704
692
// no overlap
705
693
continue ;
706
694
}
707
695
708
- let index = * get_at_index ! ( self . aabb_index. indices, current_pos) ;
696
+ let index = * get_at_index ( & self . aabb_index . indices , current_pos) ;
709
697
if self . node_index < self . aabb_index . num_items {
710
698
return Some ( index) ;
711
699
} else {
@@ -720,7 +708,7 @@ where
720
708
self . pos = self . node_index ;
721
709
self . end = min (
722
710
self . node_index + self . aabb_index . node_size ,
723
- * get_at_index ! ( self . aabb_index. level_bounds, self . level) ,
711
+ * get_at_index ( & self . aabb_index . level_bounds , self . level ) ,
724
712
) ;
725
713
} else {
726
714
return None ;
@@ -994,17 +982,17 @@ where
994
982
loop {
995
983
let end = min (
996
984
node_index + self . node_size ,
997
- * get_at_index ! ( self . level_bounds, level) ,
985
+ * get_at_index ( & self . level_bounds , level) ,
998
986
) ;
999
987
1000
988
for pos in node_index..end {
1001
- let aabb = get_at_index ! ( self . boxes, pos) ;
989
+ let aabb = get_at_index ( & self . boxes , pos) ;
1002
990
if !aabb. overlaps ( min_x, min_y, max_x, max_y) {
1003
991
// no overlap
1004
992
continue ;
1005
993
}
1006
994
1007
- let index = * get_at_index ! ( self . indices, pos) ;
995
+ let index = * get_at_index ( & self . indices , pos) ;
1008
996
if node_index < self . num_items {
1009
997
try_control ! ( visitor. visit( index) )
1010
998
} else {
@@ -1091,11 +1079,11 @@ where
1091
1079
1092
1080
// add nodes to queue
1093
1081
for pos in node_index..end {
1094
- let aabb = get_at_index ! ( self . boxes, pos) ;
1082
+ let aabb = get_at_index ( & self . boxes , pos) ;
1095
1083
let dx = axis_dist ( x, aabb. min_x , aabb. max_x ) ;
1096
1084
let dy = axis_dist ( y, aabb. min_y , aabb. max_y ) ;
1097
1085
let dist = dx * dx + dy * dy;
1098
- let index = * get_at_index ! ( self . indices, pos) ;
1086
+ let index = * get_at_index ( & self . indices , pos) ;
1099
1087
let is_leaf_node = node_index < self . num_items ;
1100
1088
queue. push ( NeighborsState :: new ( index, is_leaf_node, dist) ) ;
1101
1089
}
0 commit comments