Merge branch 'master' into brian
[satune.git] / src / AST / predicate.c
1 #include "predicate.h"
2 #include "boolean.h"
3 #include "set.h"
4
5 Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain){
6         PredicateOperator* predicate = ourmalloc(sizeof(PredicateOperator));
7         GETPREDICATETYPE(predicate)=OPERATORPRED;
8         allocInlineArrayInitSet(&predicate->domains, domain, numDomain);
9         predicate->op=op;
10         return &predicate->base;
11 }
12
13 Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior){
14         PredicateTable* predicate = ourmalloc(sizeof(PredicateTable));
15         GETPREDICATETYPE(predicate) = TABLEPRED;
16         predicate->table=table;
17         predicate->undefinedbehavior=undefBehavior;
18         return &predicate->base;
19 }
20
21 void getEqualitySetIntersection(PredicateOperator* predicate, uint* size, uint64_t* result){
22         ASSERT( predicate->op == EQUALS);
23         //make sure equality has 2 operands
24         ASSERT(getSizeArraySet( &predicate->domains) == 2);
25         *size=0;
26         VectorInt* mems1 = getArraySet(&predicate->domains, 0)->members; 
27         uint size1 = getSizeVectorInt(mems1);
28         VectorInt* mems2 = getArraySet(&predicate->domains, 1)->members;
29         uint size2 = getSizeVectorInt(mems2);
30         //FIXME:This isn't efficient, if we a hashset datastructure for Set, we
31         // can reduce it to O(n), but for now .... HG
32         for(uint i=0; i<size1; i++){
33                 uint64_t tmp= getVectorInt(mems1, i);
34                 for(uint j=0; j<size2; j++){
35                         if(tmp == getVectorInt(mems2, j)){
36                                 result[(*size)++]=tmp;
37                                 break;
38                         }
39                 }
40         }
41         
42 }
43
44 void deletePredicate(Predicate* predicate){
45         switch(GETPREDICATETYPE(predicate)) {
46         case OPERATORPRED: {
47                 PredicateOperator * operpred=(PredicateOperator *) predicate;
48                 deleteInlineArraySet(&operpred->domains);
49                 break;
50         }
51         case TABLEPRED: {
52                 break;
53         }
54         }
55         //need to handle freeing array...
56         ourfree(predicate);
57 }
58