Fix tabbing
[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 }