@@ -30,24 +30,8 @@ OF SUCH DAMAGE.
30
30
#include < stdlib.h>
31
31
#include < string.h>
32
32
#include < math.h>
33
- #include " kdtree.h"
34
-
35
- #if defined(WIN32) || defined(__WIN32__)
36
- #include < malloc.h>
37
- #endif
38
-
39
- #ifdef USE_LIST_NODE_ALLOCATOR
40
-
41
- #ifndef NO_PTHREADS
42
33
#include < pthread.h>
43
- #else
44
-
45
- #ifndef I_WANT_THREAD_BUGS
46
- #error "You are compiling with the fast list node allocator, with pthreads disabled! This WILL break if used from multiple threads."
47
- #endif /* I want thread bugs */
48
-
49
- #endif /* pthread support */
50
- #endif /* use list node allocator */
34
+ #include " kdtree.h"
51
35
52
36
struct kdhyperrect {
53
37
int dim;
@@ -95,21 +79,11 @@ static struct kdhyperrect* hyperrect_duplicate(const struct kdhyperrect *rect);
95
79
static void hyperrect_extend (struct kdhyperrect *rect, const double *pos);
96
80
static double hyperrect_dist_sq (struct kdhyperrect *rect, const double *pos);
97
81
98
- #ifdef USE_LIST_NODE_ALLOCATOR
99
- static struct res_node *alloc_resnode (void );
100
- static void free_resnode (struct res_node *);
101
- #else
102
- #define alloc_resnode () malloc(sizeof (struct res_node ))
103
- #define free_resnode (n ) free(n)
104
- #endif
105
-
106
-
107
-
108
82
struct kdtree *kd_create (int k)
109
83
{
110
84
struct kdtree *tree;
111
85
112
- if (!(tree = static_cast <kdtree*>( malloc ( sizeof *tree)) )) {
86
+ if (!(tree = new kdtree )) {
113
87
return 0 ;
114
88
}
115
89
@@ -125,7 +99,7 @@ void kd_free(struct kdtree *tree)
125
99
{
126
100
if (tree) {
127
101
kd_clear (tree);
128
- free ( tree) ;
102
+ delete tree;
129
103
}
130
104
}
131
105
@@ -139,8 +113,8 @@ static void clear_rec(struct kdnode *node, void (*destr)(void*))
139
113
if (destr) {
140
114
destr (node->data );
141
115
}
142
- free ( node->pos ) ;
143
- free ( node) ;
116
+ delete[] node->pos ;
117
+ delete node;
144
118
}
145
119
146
120
void kd_clear (struct kdtree *tree)
@@ -166,11 +140,11 @@ static int insert_rec(struct kdnode **nptr, const double *pos, void *data, int d
166
140
struct kdnode *node;
167
141
168
142
if (!*nptr) {
169
- if (!(node = static_cast <kdnode*>( malloc ( sizeof *node)) )) {
143
+ if (!(node = new kdnode )) {
170
144
return -1 ;
171
145
}
172
- if (!(node->pos = static_cast < double *>( malloc ( dim * sizeof *node-> pos )) )) {
173
- free ( node) ;
146
+ if (!(node->pos = new double [ dim] )) {
147
+ delete[] node;
174
148
return -1 ;
175
149
}
176
150
memcpy (node->pos , pos, dim * sizeof *node->pos );
@@ -211,12 +185,7 @@ int kd_insertf(struct kdtree *tree, const float *pos, void *data)
211
185
int res, dim = tree->dim ;
212
186
213
187
if (dim > 16 ) {
214
- #ifndef NO_ALLOCA
215
- if (dim <= 256 )
216
- bptr = buf = static_cast <double *>(alloca (dim * sizeof *bptr));
217
- else
218
- #endif
219
- if (!(bptr = buf = static_cast <double *>(malloc (dim * sizeof *bptr)))) {
188
+ if (!(bptr = buf = new double [dim])) {
220
189
return -1 ;
221
190
}
222
191
} else {
@@ -228,12 +197,8 @@ int kd_insertf(struct kdtree *tree, const float *pos, void *data)
228
197
}
229
198
230
199
res = kd_insert (tree, buf, data);
231
- #ifndef NO_ALLOCA
232
- if (tree->dim > 256 )
233
- #else
234
- if (tree->dim > 16 )
235
- #endif
236
- free (buf);
200
+
201
+ if (tree->dim > 16 ) delete[] buf;
237
202
return res;
238
203
}
239
204
@@ -409,11 +374,11 @@ struct kdres *kd_nearest(struct kdtree *kd, const double *pos)
409
374
if (!kd->rect ) return 0 ;
410
375
411
376
/* Allocate result set */
412
- if (!(rset = static_cast <kdres*>( malloc ( sizeof *rset)) )) {
377
+ if (!(rset = new kdres )) {
413
378
return 0 ;
414
379
}
415
- if (!(rset->rlist = static_cast < res_node*>( alloc_resnode ()) )) {
416
- free ( rset) ;
380
+ if (!(rset->rlist = new res_node)) {
381
+ delete rset;
417
382
return 0 ;
418
383
}
419
384
rset->rlist ->next = 0 ;
@@ -460,14 +425,9 @@ struct kdres *kd_nearestf(struct kdtree *tree, const float *pos)
460
425
struct kdres *res;
461
426
462
427
if (dim > 16 ) {
463
- #ifndef NO_ALLOCA
464
- if (dim <= 256 )
465
- bptr = buf = static_cast <double *>(alloca (dim * sizeof *bptr));
466
- else
467
- #endif
468
- if (!(bptr = buf = static_cast <double *>(malloc (dim * sizeof *bptr)))) {
469
- return 0 ;
470
- }
428
+ if (!(bptr = buf = new double [dim])) {
429
+ return 0 ;
430
+ }
471
431
} else {
472
432
bptr = sbuf;
473
433
}
@@ -477,12 +437,7 @@ struct kdres *kd_nearestf(struct kdtree *tree, const float *pos)
477
437
}
478
438
479
439
res = kd_nearest (tree, buf);
480
- #ifndef NO_ALLOCA
481
- if (tree->dim > 256 )
482
- #else
483
- if (tree->dim > 16 )
484
- #endif
485
- free (buf);
440
+ if (tree->dim > 16 ) delete[] buf;
486
441
return res;
487
442
}
488
443
@@ -504,42 +459,16 @@ struct kdres *kd_nearest3f(struct kdtree *tree, float x, float y, float z)
504
459
return kd_nearest (tree, pos);
505
460
}
506
461
507
- /* ---- nearest N search ---- */
508
- /*
509
- static kdres *kd_nearest_n(struct kdtree *kd, const double *pos, int num)
510
- {
511
- int ret;
512
- struct kdres *rset;
513
-
514
- if(!(rset = malloc(sizeof *rset))) {
515
- return 0;
516
- }
517
- if(!(rset->rlist = alloc_resnode())) {
518
- free(rset);
519
- return 0;
520
- }
521
- rset->rlist->next = 0;
522
- rset->tree = kd;
523
-
524
- if((ret = find_nearest_n(kd->root, pos, range, num, rset->rlist, kd->dim)) == -1) {
525
- kd_res_free(rset);
526
- return 0;
527
- }
528
- rset->size = ret;
529
- kd_res_rewind(rset);
530
- return rset;
531
- }*/
532
-
533
462
struct kdres *kd_nearest_range (struct kdtree *kd, const double *pos, double range)
534
463
{
535
464
int ret;
536
465
struct kdres *rset;
537
466
538
- if (!(rset = static_cast <kdres*>( malloc ( sizeof *rset)) )) {
467
+ if (!(rset = new kdres )) {
539
468
return 0 ;
540
469
}
541
- if (!(rset->rlist = static_cast < res_node*>( alloc_resnode ()) )) {
542
- free ( rset) ;
470
+ if (!(rset->rlist = new res_node)) {
471
+ delete rset;
543
472
return 0 ;
544
473
}
545
474
rset->rlist ->next = 0 ;
@@ -562,14 +491,9 @@ struct kdres *kd_nearest_rangef(struct kdtree *kd, const float *pos, float range
562
491
struct kdres *res;
563
492
564
493
if (dim > 16 ) {
565
- #ifndef NO_ALLOCA
566
- if (dim <= 256 )
567
- bptr = buf = static_cast <double *>(alloca (dim * sizeof *bptr));
568
- else
569
- #endif
570
- if (!(bptr = buf = static_cast <double *>(malloc (dim * sizeof *bptr)))) {
571
- return 0 ;
572
- }
494
+ if (!(bptr = buf = new double [dim])) {
495
+ return 0 ;
496
+ }
573
497
} else {
574
498
bptr = sbuf;
575
499
}
@@ -579,12 +503,7 @@ struct kdres *kd_nearest_rangef(struct kdtree *kd, const float *pos, float range
579
503
}
580
504
581
505
res = kd_nearest_range (kd, buf, range);
582
- #ifndef NO_ALLOCA
583
- if (kd->dim > 256 )
584
- #else
585
- if (kd->dim > 16 )
586
- #endif
587
- free (buf);
506
+ if (kd->dim > 16 ) delete[] buf;
588
507
return res;
589
508
}
590
509
@@ -609,8 +528,8 @@ struct kdres *kd_nearest_range3f(struct kdtree *tree, float x, float y, float z,
609
528
void kd_res_free (struct kdres *rset)
610
529
{
611
530
clear_results (rset);
612
- free_resnode ( rset->rlist ) ;
613
- free ( rset) ;
531
+ delete rset->rlist ;
532
+ delete rset;
614
533
}
615
534
616
535
int kd_res_size (struct kdres *set)
@@ -690,18 +609,18 @@ static struct kdhyperrect* hyperrect_create(int dim, const double *min, const do
690
609
size_t size = dim * sizeof (double );
691
610
struct kdhyperrect * rect = 0 ;
692
611
693
- if (!(rect = static_cast <kdhyperrect*>( malloc ( sizeof ( struct kdhyperrect ))) )) {
612
+ if (!(rect = new kdhyperrect)) {
694
613
return 0 ;
695
614
}
696
615
697
616
rect->dim = dim;
698
- if (!(rect->min = static_cast < double *>( malloc ( size)) )) {
699
- free ( rect) ;
617
+ if (!(rect->min = new double [ size] )) {
618
+ delete rect;
700
619
return 0 ;
701
620
}
702
- if (!(rect->max = static_cast < double *>( malloc ( size)) )) {
703
- free ( rect->min ) ;
704
- free ( rect) ;
621
+ if (!(rect->max = new double [ size] )) {
622
+ delete[] rect->min ;
623
+ delete rect;
705
624
return 0 ;
706
625
}
707
626
memcpy (rect->min , min, size);
@@ -712,9 +631,9 @@ static struct kdhyperrect* hyperrect_create(int dim, const double *min, const do
712
631
713
632
static void hyperrect_free (struct kdhyperrect *rect)
714
633
{
715
- free ( rect->min ) ;
716
- free ( rect->max ) ;
717
- free ( rect) ;
634
+ delete[] rect->min ;
635
+ delete[] rect->max ;
636
+ delete rect;
718
637
}
719
638
720
639
static struct kdhyperrect * hyperrect_duplicate (const struct kdhyperrect *rect)
@@ -752,62 +671,13 @@ static double hyperrect_dist_sq(struct kdhyperrect *rect, const double *pos)
752
671
return result;
753
672
}
754
673
755
- /* ---- static helpers ---- */
756
-
757
- #ifdef USE_LIST_NODE_ALLOCATOR
758
- /* special list node allocators. */
759
- static struct res_node *free_nodes;
760
-
761
- #ifndef NO_PTHREADS
762
- static pthread_mutex_t alloc_mutex = PTHREAD_MUTEX_INITIALIZER;
763
- #endif
764
-
765
- static struct res_node *alloc_resnode (void )
766
- {
767
- struct res_node *node;
768
-
769
- #ifndef NO_PTHREADS
770
- pthread_mutex_lock (&alloc_mutex);
771
- #endif
772
-
773
- if (!free_nodes) {
774
- node = malloc (sizeof *node);
775
- } else {
776
- node = free_nodes;
777
- free_nodes = free_nodes->next ;
778
- node->next = 0 ;
779
- }
780
-
781
- #ifndef NO_PTHREADS
782
- pthread_mutex_unlock (&alloc_mutex);
783
- #endif
784
-
785
- return node;
786
- }
787
-
788
- static void free_resnode (struct res_node *node)
789
- {
790
- #ifndef NO_PTHREADS
791
- pthread_mutex_lock (&alloc_mutex);
792
- #endif
793
-
794
- node->next = free_nodes;
795
- free_nodes = node;
796
-
797
- #ifndef NO_PTHREADS
798
- pthread_mutex_unlock (&alloc_mutex);
799
- #endif
800
- }
801
- #endif /* list node allocator or not */
802
-
803
-
804
674
/* inserts the item. if dist_sq is >= 0, then do an ordered insert */
805
675
/* TODO make the ordering code use heapsort */
806
676
static int rlist_insert (struct res_node *list, struct kdnode *item, double dist_sq)
807
677
{
808
678
struct res_node *rnode;
809
679
810
- if (!(rnode = static_cast < res_node*>( alloc_resnode ()))) {
680
+ if (!(rnode = new res_node)) {
811
681
return -1 ;
812
682
}
813
683
rnode->item = item;
@@ -830,7 +700,7 @@ static void clear_results(struct kdres *rset)
830
700
while (node) {
831
701
tmp = node;
832
702
node = node->next ;
833
- free_resnode ( tmp) ;
703
+ delete tmp;
834
704
}
835
705
836
706
rset->rlist ->next = 0 ;
0 commit comments