997703c630849cdb8b07b6ff56f52125996d8c1b
[model-checker-benchmarks.git] / cliffc-hashtable / main.cc
1 #include <iostream>
2
3 #include "cliffc_hashtable.h"
4
5 #ifndef NORMAL
6 #include "threads.h"
7 #endif
8
9 template<typename TypeK, typename TypeV, class Hash, class KeyEqualsTo, class ValEqualsTo>
10 slot* const cliffc_hashtable<TypeK, TypeV, Hash, KeyEqualsTo, ValEqualsTo>::MATCH_ANY = new slot(false, NULL);
11
12 template<typename TypeK, typename TypeV, class Hash, class KeyEqualsTo, class ValEqualsTo>
13 slot* const cliffc_hashtable<TypeK, TypeV, Hash, KeyEqualsTo, ValEqualsTo>::NO_MATCH_OLD = new slot(false, NULL);
14
15 template<typename TypeK, typename TypeV, class Hash, class KeyEqualsTo, class ValEqualsTo>
16 slot* const cliffc_hashtable<TypeK, TypeV, Hash, KeyEqualsTo, ValEqualsTo>::TOMBPRIME = new slot(true, NULL);
17
18 template<typename TypeK, typename TypeV, class Hash, class KeyEqualsTo, class ValEqualsTo>
19 slot* const cliffc_hashtable<TypeK, TypeV, Hash, KeyEqualsTo, ValEqualsTo>::TOMBSTONE = new slot(false, NULL);
20
21 template<typename TypeK, typename TypeV, class Hash, class KeyEqualsTo, class ValEqualsTo>
22 Hash cliffc_hashtable<TypeK, TypeV, Hash, KeyEqualsTo, ValEqualsTo>::hashFunc;
23
24 template<typename TypeK, typename TypeV, class Hash, class KeyEqualsTo, class ValEqualsTo>
25 KeyEqualsTo cliffc_hashtable<TypeK, TypeV, Hash, KeyEqualsTo, ValEqualsTo>::keyEqualsTo;
26
27 template<typename TypeK, typename TypeV, class Hash, class KeyEqualsTo, class ValEqualsTo>
28 ValEqualsTo cliffc_hashtable<TypeK, TypeV, Hash, KeyEqualsTo, ValEqualsTo>::valEqualsTo;
29
30 class HashInt {
31         public:
32         int operator()(const int &val) const {
33                 return val;
34         }
35 };
36
37 class EqualsToInt {
38         public:
39         bool operator()(const int &val1, const int &val2) const {
40                 return val1 == val2;
41         }
42 };
43
44 int *k1, *k2, *v1, *v2;
45 cliffc_hashtable<int, int, HashInt, EqualsToInt, EqualsToInt> *table;
46
47 void threadA(void *arg) {
48         table->put(*k1, *v1);
49         int *r1 = table->get(*k2);
50         if (r1) {
51                 printf("r1=%d\n", *r1);
52         } else {
53                 printf("r1=NULL\n");
54         }
55 }
56
57 void threadB(void *arg) {
58         table->put(*k2, *v2);
59         int *r2 = table->get(*k1);
60         if (r2) {
61                 printf("r2=%d\n", *r2);
62         } else {
63                 printf("r2=NULL\n");
64         }
65 }
66
67
68 #ifdef NORMAL
69 int main(int argc, char *argv[]) {
70         table = new cliffc_hashtable<int, int, HashInt, EqualsToInt, EqualsToInt>();
71         k1 = new int(3);
72         k2 = new int(4);
73         v1 = new int(1);
74         v2 = new int(2);
75         
76         table->put(*k1, *v1);
77         table->put(*k2, *v2);
78         int *r1 = table->get(*k2);
79         if (r1) {
80                 printf("r1=%d\n", *r1);
81         } else {
82                 printf("r1=NULL\n");
83         }
84
85         return 0;
86 }
87 #else
88 int user_main(int argc, char *argv[]) {
89         table = new cliffc_hashtable<int, int, HashInt, EqualsToInt, EqualsToInt>();
90         k1 = new int(3);
91         k2 = new int(4);
92         v1 = new int(1);
93         v2 = new int(2);
94
95         thrd_t A, B, C;
96         thrd_create(&A, &threadA, NULL);
97         thrd_create(&B, &threadB, NULL);
98
99         thrd_join(A);
100         thrd_join(B);
101
102         return 0;
103 }
104 #endif