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

# User Rev Content
1 root 1.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