ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Tree-M/M.xs
Revision: 1.2
Committed: Sun May 6 01:35:15 2001 UTC (23 years ago) by root
Branch: MAIN
Changes since 1.1: +6 -4 lines
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 root 1.2 if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV)
16     croak ("Tree::M: key must be array reference");
17 root 1.1
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 root 1.2 void add_result(int data, double *k, int ndims)
47 root 1.1 {
48     AV *r = newAV ();
49    
50     av_push (r, newSViv (data));
51     av_push (r, c2sv (k, ndims));
52    
53     av_push (searchres, newRV_noinc ((SV *)r));
54     }
55    
56     MODULE = Tree::M PACKAGE = Tree::M::MT
57    
58     PROTOTYPES: ENABLE
59    
60     PMT *
61     new(class, ndims, min = 0.0, max = 255.0, steps = 65536.0)
62     int ndims
63     double min
64     double max
65     double steps
66     CODE:
67     RETVAL = new PMT(ndims, min, max, steps);
68     OUTPUT:
69     RETVAL
70    
71     void
72     PMT::create(path)
73     char * path
74    
75     void
76     PMT::open(path)
77     char * path
78    
79     void
80     PMT::insert(k, idx = 0)
81     SV * k
82     int idx
83     C_ARGS:
84     sv2c(k, THIS->ndims), idx
85    
86     double
87     PMT::distance(k1, k2)
88     SV * k1
89     SV * k2
90     C_ARGS:
91     sv2c(k1, THIS->ndims), sv2c(k2, THIS->ndims)
92    
93     SV *
94     PMT::range(k, r)
95     SV * k
96     double r
97     CODE:
98     searchres = newAV ();
99     THIS->range(sv2c(k, THIS->ndims), r);
100     RETVAL = newRV_noinc ((SV *)searchres);
101     OUTPUT:
102     RETVAL
103    
104     SV *
105     PMT::top(k, n)
106     SV * k
107     int n
108     CODE:
109     searchres = newAV ();
110     THIS->top(sv2c(k, THIS->ndims), n);
111     RETVAL = newRV_noinc ((SV *)searchres);
112     OUTPUT:
113     RETVAL
114 root 1.2
115     int
116     PMT::maxlevel()
117 root 1.1
118     void
119     PMT::DESTROY()
120