Data-KDTree-Shared
view release on metacpan or search on metacpan
RETVAL
void
knn(self, coords, m)
SV *self
SV *coords
UV m
PREINIT:
EXTRACT(self);
double buf[KD_MAX_DIMS];
PPCODE:
kd_read_point(aTHX_ h, coords, buf, "knn");
REEXTRACT(self); /* kd_read_point ran arbitrary Perl */
{
KdRes *res = NULL;
uint64_t got = 0, i;
if (m > h->capacity) m = h->capacity; /* at most all points */
if (m) { Newx(res, (size_t)m, KdRes); SAVEFREEPV(res); } /* alloc BEFORE the lock */
{
int wr = kd_query_lock(h);
got = m ? kd_knn_locked(h, buf, m, res) : 0;
}
void
range(self, lo, hi)
SV *self
SV *lo
SV *hi
PREINIT:
EXTRACT(self);
double blo[KD_MAX_DIMS], bhi[KD_MAX_DIMS];
PPCODE:
kd_read_point(aTHX_ h, lo, blo, "range");
REEXTRACT(self); /* kd_read_point ran arbitrary Perl */
kd_read_point(aTHX_ h, hi, bhi, "range");
REEXTRACT(self); /* kd_read_point ran arbitrary Perl */
{
uint64_t *ids = NULL, got = 0, i, cap = h->capacity;
if (cap) { Newx(ids, (size_t)cap, uint64_t); SAVEFREEPV(ids); } /* alloc BEFORE the lock */
{
int wr = kd_query_lock(h);
got = cap ? kd_range_locked(h, blo, bhi, ids, cap) : 0;
}
void
radius(self, coords, r)
SV *self
SV *coords
double r
PREINIT:
EXTRACT(self);
double buf[KD_MAX_DIMS];
PPCODE:
if (r < 0) croak("Data::KDTree::Shared->radius: radius must be >= 0");
kd_read_point(aTHX_ h, coords, buf, "radius");
REEXTRACT(self); /* kd_read_point ran arbitrary Perl */
{
KdRes *res = NULL;
uint64_t got = 0, i, cap = h->capacity;
if (cap) { Newx(res, (size_t)cap, KdRes); SAVEFREEPV(res); } /* alloc BEFORE the lock */
{
int wr = kd_query_lock(h);
got = cap ? kd_radius_locked(h, buf, r, res, cap) : 0;
( run in 0.973 second using v1.01-cache-2.11-cpan-92ad3014f07 )