ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Tree-M/M.xs
Revision: 1.1
Committed: Sun May 6 00:45:51 2001 UTC (23 years ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# Content
1 extern "C" {
2 #include "EXTERN.h"
3 #include "perl.h"
4 #include "XSUB.h"
5 }
6
7 #include "PMT.h"
8
9 typedef PMT Tree__M__MT;
10 typedef double *Key;
11
12 static double *
13 sv2c(SV *sv, int ndims)
14 {
15 if (!SvROK (sv) && SvTYPE (SvRV (sv)) != SVt_PVAV)
16 croak ("Tree::M: key must be array references");
17
18 AV *av = (AV *)SvRV (sv);
19
20 if (av_len (av) != ndims -1)
21 croak ("Tree::M: illegal key, expected %d elements, found %d",
22 ndims, av_len (av) + 1);
23
24 double *k = new double [ndims];
25
26 for (int i = ndims; i--; )
27 k[i] = SvNV (*av_fetch (av, i, 1));
28
29 return k;
30 }
31
32 static SV *
33 c2sv(double *k, int ndims)
34 {
35 AV *av = newAV ();
36
37 av_extend (av, ndims);
38 for (int i = ndims; i--; )
39 av_store (av, i, newSVnv (k[i]));
40
41 return newRV_noinc ((SV *)av);
42 }
43
44 static AV *searchres;
45
46 void add_result(double distance, int data, double *k, int ndims)
47 {
48 AV *r = newAV ();
49
50 av_push (r, newSVnv (distance));
51 av_push (r, newSViv (data));
52 av_push (r, c2sv (k, ndims));
53
54 av_push (searchres, newRV_noinc ((SV *)r));
55 }
56
57 MODULE = Tree::M PACKAGE = Tree::M::MT
58
59 PROTOTYPES: ENABLE
60
61 PMT *
62 new(class, ndims, min = 0.0, max = 255.0, steps = 65536.0)
63 int ndims
64 double min
65 double max
66 double steps
67 CODE:
68 RETVAL = new PMT(ndims, min, max, steps);
69 OUTPUT:
70 RETVAL
71
72 void
73 PMT::create(path)
74 char * path
75
76 void
77 PMT::open(path)
78 char * path
79
80 void
81 PMT::insert(k, idx = 0)
82 SV * k
83 int idx
84 C_ARGS:
85 sv2c(k, THIS->ndims), idx
86
87 double
88 PMT::distance(k1, k2)
89 SV * k1
90 SV * k2
91 C_ARGS:
92 sv2c(k1, THIS->ndims), sv2c(k2, THIS->ndims)
93
94 SV *
95 PMT::range(k, r)
96 SV * k
97 double r
98 CODE:
99 searchres = newAV ();
100 THIS->range(sv2c(k, THIS->ndims), r);
101 RETVAL = newRV_noinc ((SV *)searchres);
102 OUTPUT:
103 RETVAL
104
105 SV *
106 PMT::top(k, n)
107 SV * k
108 int n
109 CODE:
110 searchres = newAV ();
111 THIS->top(sv2c(k, THIS->ndims), n);
112 RETVAL = newRV_noinc ((SV *)searchres);
113 OUTPUT:
114 RETVAL
115
116 void
117 PMT::DESTROY()
118