2012-12-20 17:13:30 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the YAP Prolog
|
|
|
|
*
|
|
|
|
* User Defined Indexing was developed by:
|
|
|
|
* David Vaz <davidvaz@dcc.fc.up.pt>
|
|
|
|
* Vitor Santos Costa <vsc@dcc.fc.up.pt>
|
|
|
|
*
|
|
|
|
* UDI Indexing Interface:
|
|
|
|
*
|
|
|
|
* Each new indexing mechanism should register it self by filling up a
|
|
|
|
* UdiControlBlock and calling Yap_UdiRegister(UdiControlBlock).
|
|
|
|
*
|
|
|
|
* UdiControlBlock has the main declaration that triggers the
|
|
|
|
* indexing structure as well as the pointers to the needed functions
|
|
|
|
* called at the appropriate times.
|
|
|
|
*
|
|
|
|
* For now each indexing structure only works with a single argument
|
|
|
|
* even when multiple arguments are indexed with the same struture.
|
|
|
|
*
|
2012-12-27 12:11:14 +00:00
|
|
|
* TODO: think of alternative ways of support both cases, e.g. a rtree
|
2012-12-20 17:13:30 +00:00
|
|
|
* does not benefit from multiple rtree indexing, but a hash table do
|
|
|
|
*/
|
2009-02-12 16:39:20 +00:00
|
|
|
|
2012-12-20 17:13:30 +00:00
|
|
|
/* This is called upon udi mode spec call, and the purpose is to allow
|
|
|
|
* the indexing struture to initialize itself.
|
|
|
|
* Should return the need opaque struture to be used in future calls
|
|
|
|
*
|
|
|
|
* arg is used to track the specific call, on multiple indexing with the
|
|
|
|
* same struture
|
|
|
|
*/
|
|
|
|
typedef void * (* Yap_UdiInit)
|
|
|
|
(YAP_Term spec,
|
|
|
|
int arg, /* argument regarding this call */
|
|
|
|
int arity);
|
2009-02-12 16:39:20 +00:00
|
|
|
|
2012-12-20 17:13:30 +00:00
|
|
|
/* Upon each assert the struture insert method is called to perform
|
|
|
|
* its work
|
|
|
|
*/
|
|
|
|
typedef void * (* Yap_UdiInsert)
|
|
|
|
(void *control, /* indexing structure opaque handle */
|
|
|
|
YAP_Term term, /* asserted argument */
|
|
|
|
int arg, /* argument regarding this call */
|
|
|
|
void *data); /* value to return on search */
|
2012-12-18 18:26:59 +00:00
|
|
|
|
2012-12-20 17:13:30 +00:00
|
|
|
/* Callback for each value found in a search
|
|
|
|
* if it returns FALSE the search should be immediately aborted
|
|
|
|
*/
|
|
|
|
typedef int (* Yap_UdiCallback)
|
|
|
|
(void *key, /* index key */
|
|
|
|
void *data, /* data */
|
|
|
|
void *arg); /* auxiliary data to callback */
|
2009-02-12 16:39:20 +00:00
|
|
|
|
2012-12-20 17:13:30 +00:00
|
|
|
/* Called upon search
|
|
|
|
*
|
2013-01-02 11:20:54 +00:00
|
|
|
* If there is any search to do with this structure should return >= 0
|
2012-12-20 17:13:30 +00:00
|
|
|
* corresponding to the values found
|
|
|
|
*
|
|
|
|
* returns -1 if there is nothing to search with this indexing structure
|
|
|
|
* e.g. a Variable as argument
|
|
|
|
*/
|
|
|
|
typedef int (* Yap_UdiSearch)
|
|
|
|
(void * control, /* indexing structure opaque handle */
|
|
|
|
int arg, /* argument regarding this call */
|
|
|
|
Yap_UdiCallback f, /* callback on each found value */
|
2013-01-02 11:20:54 +00:00
|
|
|
void *args); /* auxiliary data to callback */
|
2009-02-20 11:42:48 +00:00
|
|
|
|
2013-01-02 11:20:54 +00:00
|
|
|
/* Called upon abolish of the term
|
2012-12-20 17:13:30 +00:00
|
|
|
* to allow for a clean destroy of the indexing structures
|
|
|
|
*/
|
|
|
|
typedef int (* Yap_UdiDestroy)
|
|
|
|
(void * control);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Main structure used in UDI
|
|
|
|
*/
|
2009-02-12 16:39:20 +00:00
|
|
|
typedef struct udi_control_block {
|
2012-12-20 17:13:30 +00:00
|
|
|
YAP_Atom decl; //atom that triggers this indexing structure
|
|
|
|
Yap_UdiInit init;
|
|
|
|
Yap_UdiInsert insert;
|
|
|
|
Yap_UdiSearch search;
|
2009-02-20 11:42:48 +00:00
|
|
|
Yap_UdiDestroy destroy;
|
2012-12-20 17:13:30 +00:00
|
|
|
} * UdiControlBlock;
|
2009-02-12 16:39:20 +00:00
|
|
|
|
2012-12-20 17:13:30 +00:00
|
|
|
/* Register a new indexing structure */
|
2012-12-17 20:23:03 +00:00
|
|
|
void Yap_UdiRegister(UdiControlBlock);
|