Merging with Tuner branch
[satune.git] / src / Interpreter / signatureenc.cc
1 #include "signatureenc.h"
2 #include "element.h"
3 #include "set.h"
4 #include "signature.h"
5 #include "interpreter.h"
6
7 SignatureEnc::SignatureEnc(Interpreter *inter): 
8         interpreter(inter),
9         maxValue(0)
10 {
11 }
12
13 SignatureEnc::~SignatureEnc(){
14         for(uint i=0; i<signatures.getSize(); i++){
15                 Signature *s = signatures.get(i);
16                 delete s;
17         }
18 }
19
20 void SignatureEnc::updateMaxValue(Set *set){
21         for(uint i=0; i< set->getSize(); i++){
22                 if(set->getElement(i) > maxValue){
23                         maxValue = set->getElement(i);
24                 }
25         }
26 }
27
28 ValuedSignature *SignatureEnc::getBooleanSignature(Boolean *bvar){
29         ValuedSignature *bsig = (ValuedSignature *)encoded.get((void *)bvar);
30         if(bsig == NULL){
31                 bsig = interpreter->getBooleanSignature(getUniqueSigID());
32                 encoded.put(bvar, bsig);
33                 signatures.push(bsig);
34                 interpreter->writeToFile(bsig->getSignature());
35         }
36         return bsig;
37 }
38
39 ValuedSignature *SignatureEnc::getElementSignature(Element *element){
40         ValuedSignature *esig = (ValuedSignature *)encoded.get((void *)element);
41         if(esig == NULL){
42                 Set *set = element->getRange();
43                 Signature *ssig = (Signature *)encoded.get((void *)set);
44                 if(ssig == NULL){
45                         ssig = interpreter->getSetSignature(getUniqueSigID(), set);
46                         encoded.put(set, ssig);
47                         signatures.push(ssig);
48                         interpreter->writeToFile(ssig->getSignature());
49                         updateMaxValue(set);
50                 }
51                 esig = interpreter->getElementSignature(getUniqueSigID(), ssig);
52                 encoded.put(element, esig);
53                 signatures.push(esig);
54                 interpreter->writeToFile(esig->getSignature());
55
56         }
57         return esig;
58 }
59
60 void SignatureEnc::setValue(uint id, uint value){
61         ValuedSignature *sig = getValuedSignature(id);
62         ASSERT(sig != NULL);
63         sig->setValue(value);
64 }
65
66 int SignatureEnc::getValue(void *astnode){
67         ValuedSignature *sig = (ValuedSignature *)encoded.get(astnode);
68         ASSERT(sig != NULL);
69         return sig->getValue();
70 }