Merge
[satune.git] / src / Collections / corestructs.h
1 #ifndef CORESTRUCTS_H
2 #define CORESTRUCTS_H
3
4 #include "cppvector.h"
5 #include "hashset.h"
6
7 //How much should we shift pointers when computing hash functions
8 //5 appears to be the minimum value for Ubuntu 64-bit
9
10 #define PTRSHIFT 5
11
12 class BooleanEdge {
13 public:
14         BooleanEdge() : b(NULL) {}
15         BooleanEdge(Boolean *_b) : b(_b) {}
16         BooleanEdge negate() {return BooleanEdge((Boolean *)(((uintptr_t) b) ^ 1));}
17         bool operator==(BooleanEdge e) { return b == e.b;}
18         bool operator!=(BooleanEdge e) { return b != e.b;}
19         bool isNegated() { return ((uintptr_t) b) & 1; }
20         Boolean *getBoolean() {return (Boolean *)(((uintptr_t)b) & ~((uintptr_t) 1));}
21         Boolean *getRaw() {return b;}
22         Boolean *operator->() {return getBoolean();}
23         operator bool() {
24                 return getBoolean() != NULL;
25         }
26 private:
27         Boolean *b;
28 };
29
30 inline bool boolEdgeEquals(BooleanEdge b1, BooleanEdge b2) {
31         return b1 == b2;
32 }
33
34 inline unsigned int boolEdgeHash(BooleanEdge b) {
35         return (unsigned int) (((uintptr_t)b.getRaw()) >> PTRSHIFT);
36 }
37
38 typedef Hashset<BooleanEdge, uintptr_t, PTRSHIFT, &boolEdgeHash, &boolEdgeEquals> HashsetBooleanEdge;
39 typedef Hashset<Order *, uintptr_t, PTRSHIFT> HashsetOrder;
40 typedef SetIterator<BooleanEdge, uintptr_t, PTRSHIFT, &boolEdgeHash, &boolEdgeEquals> SetIteratorBooleanEdge;
41 typedef SetIterator<Order *, uintptr_t, PTRSHIFT> SetIteratorOrder;
42
43 #endif