… | |
… | |
10 | typedef double *Key; |
10 | typedef double *Key; |
11 | |
11 | |
12 | static double * |
12 | static double * |
13 | sv2c(SV *sv, int ndims) |
13 | sv2c(SV *sv, int ndims) |
14 | { |
14 | { |
15 | if (!SvROK (sv) && SvTYPE (SvRV (sv)) != SVt_PVAV) |
15 | if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV) |
16 | croak ("Tree::M: key must be array references"); |
16 | croak ("Tree::M: key must be array reference"); |
17 | |
17 | |
18 | AV *av = (AV *)SvRV (sv); |
18 | AV *av = (AV *)SvRV (sv); |
19 | |
19 | |
20 | if (av_len (av) != ndims -1) |
20 | if (av_len (av) != ndims -1) |
21 | croak ("Tree::M: illegal key, expected %d elements, found %d", |
21 | croak ("Tree::M: illegal key, expected %d elements, found %d", |
… | |
… | |
41 | return newRV_noinc ((SV *)av); |
41 | return newRV_noinc ((SV *)av); |
42 | } |
42 | } |
43 | |
43 | |
44 | static AV *searchres; |
44 | static AV *searchres; |
45 | |
45 | |
46 | void add_result(double distance, int data, double *k, int ndims) |
46 | void add_result(int data, double *k, int ndims) |
47 | { |
47 | { |
48 | AV *r = newAV (); |
48 | AV *r = newAV (); |
49 | |
49 | |
50 | av_push (r, newSVnv (distance)); |
|
|
51 | av_push (r, newSViv (data)); |
50 | av_push (r, newSViv (data)); |
52 | av_push (r, c2sv (k, ndims)); |
51 | av_push (r, c2sv (k, ndims)); |
53 | |
52 | |
54 | av_push (searchres, newRV_noinc ((SV *)r)); |
53 | av_push (searchres, newRV_noinc ((SV *)r)); |
55 | } |
54 | } |
… | |
… | |
111 | THIS->top(sv2c(k, THIS->ndims), n); |
110 | THIS->top(sv2c(k, THIS->ndims), n); |
112 | RETVAL = newRV_noinc ((SV *)searchres); |
111 | RETVAL = newRV_noinc ((SV *)searchres); |
113 | OUTPUT: |
112 | OUTPUT: |
114 | RETVAL |
113 | RETVAL |
115 | |
114 | |
|
|
115 | int |
|
|
116 | PMT::maxlevel() |
|
|
117 | |
116 | void |
118 | void |
117 | PMT::DESTROY() |
119 | PMT::DESTROY() |
118 | |
120 | |