219 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <assert.h>
							 | 
						||
| 
								 | 
							
								#include <float.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "b+tree_udi.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static struct udi_control_block BtreeCB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void udi_btree_init(void) {
							 | 
						||
| 
								 | 
							
									UdiControlBlock cb = &BtreeCB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									memset((void *) cb,0, sizeof(*cb));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									cb->decl=YAP_LookupAtom(SPEC);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									cb->init=BtreeUdiInit;
							 | 
						||
| 
								 | 
							
									cb->insert=BtreeUdiInsert;
							 | 
						||
| 
								 | 
							
									cb->search=BtreeUdiSearch;
							 | 
						||
| 
								 | 
							
									cb->destroy=BtreeUdiDestroy;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Yap_UdiRegister(cb);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void *BtreeUdiInit (YAP_Term spec, int arg, int arity)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return (void *) BTreeNew();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void *BtreeUdiInsert (void *control,
							 | 
						||
| 
								 | 
							
										YAP_Term term, int arg, void *data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  btree_t btree = (btree_t) control;
							 | 
						||
| 
								 | 
							
								  assert(control);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  BTreeInsert(&btree,
							 | 
						||
| 
								 | 
							
								              YAP_FloatOfTerm(YAP_ArgOfTerm(arg,term)),
							 | 
						||
| 
								 | 
							
								              data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return (void *) btree;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*ARGS ARE AVAILABLE*/
							 | 
						||
| 
								 | 
							
								int BtreeUdiSearch (void *control,
							 | 
						||
| 
								 | 
							
										int arg, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  int j;
							 | 
						||
| 
								 | 
							
								  size_t n;
							 | 
						||
| 
								 | 
							
								  YAP_Term Constraints;
							 | 
						||
| 
								 | 
							
								  const char * att;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  YAP_Term t = YAP_A(arg);
							 | 
						||
| 
								 | 
							
								  if (YAP_IsAttVar(t))
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        Constraints = YAP_AttsOfVar(t);
							 | 
						||
| 
								 | 
							
								        /* Yap_DebugPlWrite(Constraints); */
							 | 
						||
| 
								 | 
							
								        att = YAP_AtomName(YAP_NameOfFunctor(YAP_FunctorOfTerm(Constraints)));
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        n = sizeof (att_func) / sizeof (struct Att);
							 | 
						||
| 
								 | 
							
								        for (j = 0; j < n; j ++)
							 | 
						||
| 
								 | 
							
								          if (strcmp(att_func[j].att,att) == 0) /*TODO: Improve this do not need strcmp*/
							 | 
						||
| 
								 | 
							
								            return att_func[j].proc_att(control, Constraints, callback, args);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								  return -1; /*YAP FALLBACK*/
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*Needs to test if tree is not null*/
							 | 
						||
| 
								 | 
							
								int BTreeMinAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  void *d;
							 | 
						||
| 
								 | 
							
								  d = BTreeMin(tree,NULL,NULL);
							 | 
						||
| 
								 | 
							
								  callback(d,d,args);
							 | 
						||
| 
								 | 
							
								  /*TODO: test empty tree*/
							 | 
						||
| 
								 | 
							
								  return 1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BTreeMaxAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									void *d;
							 | 
						||
| 
								 | 
							
									d = BTreeMax(tree,NULL,NULL);
							 | 
						||
| 
								 | 
							
									callback(d,d,args);
							 | 
						||
| 
								 | 
							
									/*TODO: test empty tree*/
							 | 
						||
| 
								 | 
							
									return 1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BTreeEqAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  node_t n;
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								  double r;
							 | 
						||
| 
								 | 
							
								  void * d;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  r = YAP_FloatOfTerm(YAP_ArgOfTerm(2,constraint));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  d = BTreeSearch(tree,r,EQ,&n,&i);
							 | 
						||
| 
								 | 
							
								  if (d) {
							 | 
						||
| 
								 | 
							
									callback(d,d,args);
							 | 
						||
| 
								 | 
							
									return 1;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BTreeLtAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  node_t n;
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								  double max;
							 | 
						||
| 
								 | 
							
								  void * d;
							 | 
						||
| 
								 | 
							
								  int count = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  max = YAP_FloatOfTerm(YAP_ArgOfTerm(2,constraint));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  d = BTreeMin(tree,&n,&i);
							 | 
						||
| 
								 | 
							
								  if (d)
							 | 
						||
| 
								 | 
							
									  do {
							 | 
						||
| 
								 | 
							
										  callback(d,d,args);
							 | 
						||
| 
								 | 
							
										  count ++;
							 | 
						||
| 
								 | 
							
									  } while ((d = BTreeSearchNext(max,LT,&n,&i)));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return count;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BTreeLeAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  node_t n;
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								  double max;
							 | 
						||
| 
								 | 
							
								  void * d;
							 | 
						||
| 
								 | 
							
								  int count = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  max = YAP_FloatOfTerm(YAP_ArgOfTerm(2,constraint));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  d = BTreeMin(tree,&n,&i);
							 | 
						||
| 
								 | 
							
								  if (d)
							 | 
						||
| 
								 | 
							
									  do {
							 | 
						||
| 
								 | 
							
										  callback(d,d,args);
							 | 
						||
| 
								 | 
							
										  count ++;
							 | 
						||
| 
								 | 
							
									  } while ((d = BTreeSearchNext(max,LE,&n,&i)));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return count;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BTreeGtAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  node_t n;
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								  double min;
							 | 
						||
| 
								 | 
							
								  void * d;
							 | 
						||
| 
								 | 
							
								  int count = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  min = YAP_FloatOfTerm(YAP_ArgOfTerm(2,constraint));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  d = BTreeSearch(tree,min,GT,&n,&i);
							 | 
						||
| 
								 | 
							
								  if (d)
							 | 
						||
| 
								 | 
							
									  do {
							 | 
						||
| 
								 | 
							
										  callback(d,d,args);
							 | 
						||
| 
								 | 
							
										  count ++;
							 | 
						||
| 
								 | 
							
									  }  while ((d = BTreeSearchNext(DBL_MAX,LT,&n,&i)));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return count;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BTreeGeAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  node_t n;
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								  double min;
							 | 
						||
| 
								 | 
							
								  void * d;
							 | 
						||
| 
								 | 
							
								  int count = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  min = YAP_FloatOfTerm(YAP_ArgOfTerm(2,constraint));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  d = BTreeSearch(tree,min,GE,&n,&i);
							 | 
						||
| 
								 | 
							
								  if (d)
							 | 
						||
| 
								 | 
							
									  do {
							 | 
						||
| 
								 | 
							
									  		  callback(d,d,args);
							 | 
						||
| 
								 | 
							
									  		  count ++;
							 | 
						||
| 
								 | 
							
									  	  }  while ((d = BTreeSearchNext(DBL_MAX,LT,&n,&i)));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return count;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BTreeRangeAtt (btree_t tree, YAP_Term constraint, Yap_UdiCallback callback, void *args)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  node_t n;
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								  double min,max;
							 | 
						||
| 
								 | 
							
								  int minc,maxc;
							 | 
						||
| 
								 | 
							
								  void * d;
							 | 
						||
| 
								 | 
							
								  int count = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  min = YAP_FloatOfTerm(YAP_ArgOfTerm(2,constraint));
							 | 
						||
| 
								 | 
							
								  minc = strcmp(YAP_AtomName(YAP_AtomOfTerm(YAP_ArgOfTerm(3,constraint))),
							 | 
						||
| 
								 | 
							
								                "true") == 0 ? GE: GT;
							 | 
						||
| 
								 | 
							
								  max = YAP_FloatOfTerm(YAP_ArgOfTerm(4,constraint));
							 | 
						||
| 
								 | 
							
								  maxc = strcmp(YAP_AtomName(YAP_AtomOfTerm(YAP_ArgOfTerm(5,constraint))),
							 | 
						||
| 
								 | 
							
								                "true") == 0 ? LE: LT;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  d = BTreeSearch(tree,min,minc,&n,&i);
							 | 
						||
| 
								 | 
							
								  if (d)
							 | 
						||
| 
								 | 
							
									  do {
							 | 
						||
| 
								 | 
							
										  callback(d,d,args);
							 | 
						||
| 
								 | 
							
										  count ++;
							 | 
						||
| 
								 | 
							
									  } while ((d = BTreeSearchNext(max,maxc,&n,&i)));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return count;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int BtreeUdiDestroy(void *control)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									btree_t btree = (btree_t) control;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									assert(btree);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									BTreeDestroy(btree);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return TRUE;
							 | 
						||
| 
								 | 
							
								}
							 |