This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/udi/rtree/rtree_udi.c
2015-10-13 08:17:51 +01:00

122 lines
2.2 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "rtree_udi.h"
static struct udi_control_block RtreeCB;
void udi_rtree_init(void) {
UdiControlBlock cb = &RtreeCB;
memset((void *) cb,0, sizeof(*cb));
cb->decl=YAP_LookupAtom(SPEC);
cb->init=RtreeUdiInit;
cb->insert=RtreeUdiInsert;
cb->search=RtreeUdiSearch;
cb->destroy=RtreeUdiDestroy;
Yap_UdiRegister(cb);
}
static int YAP_IsNumberTermToFloat (YAP_Term term, YAP_Float *n)
{
if (YAP_IsIntTerm (term) != FALSE)
{
if (n != NULL)
*n = (YAP_Float) YAP_IntOfTerm (term);
return (TRUE);
}
if (YAP_IsFloatTerm (term) != FALSE)
{
if (n != NULL)
*n = YAP_FloatOfTerm (term);
return (TRUE);
}
return (FALSE);
}
static rect_t RectOfTerm (YAP_Term term)
{
YAP_Term tmp;
rect_t rect;
int i;
if (!YAP_IsPairTerm(term))
return (RectInit());
for (i = 0; YAP_IsPairTerm(term) && i < 4; i++)
{
tmp = YAP_HeadOfTerm (term);
if (!YAP_IsNumberTermToFloat(tmp,&(rect.coords[i])))
return (RectInit());
term = YAP_TailOfTerm (term);
}
return (rect);
}
void *
RtreeUdiInit (YAP_Term spec, int arg, int arity) {
return (void *) RTreeNew();
}
void *
RtreeUdiInsert (void *control,
YAP_Term term, int arg, void *data)
{
rect_t r;
rtree_t rtree = (rtree_t) control;
assert(rtree);
/*TODO: better check of rect, or even not needing it
* and use the geometry itself */
r = RectOfTerm(YAP_ArgOfTerm(arg,term));
RTreeInsert(&rtree, r, data);
return (void *) rtree;
}
/*ARGS ARE AVAILABLE*/
int RtreeUdiSearch (void *control,
int arg, Yap_UdiCallback callback, void *args)
{
int i;
rtree_t rtree = (rtree_t) control;
YAP_Term Constraints;
rect_t r;
assert(rtree);
YAP_Term t = YAP_A(arg);
if (YAP_IsAttVar(t))
{
/*get the constraits rect*/
Constraints = YAP_AttsOfVar(t);
// Yap_DebugPlWrite(Constraints);
if (YAP_IsApplTerm(Constraints))
{
r = RectOfTerm(YAP_ArgOfTerm(2,Constraints));
return RTreeSearch(rtree, r, callback, args);
}
}
return -1; /*YAP FALLBACK*/
}
int RtreeUdiDestroy(void *control)
{
rtree_t rtree = (rtree_t) control;
assert(rtree);
RTreeDestroy(rtree);
return TRUE;
}