Mercurial > hg > Members > innparusu > Gears
annotate src/llrb/llrb.c @ 47:348148d8fdb1
implement get
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 19 May 2015 17:46:41 +0900 |
parents | a0a58875c93f |
children | d191faf19961 |
rev | line source |
---|---|
19 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
3 #include <sys/time.h> |
19 | 4 |
5 #include "llrbContext.h" | |
6 | |
7 #include "allocate.h" | |
8 #include "origin_cs.h" | |
9 | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
10 #include "stack.h" |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
11 |
19 | 12 #define NUM 100 |
13 | |
14 extern __code initLLRBContext(struct Context* context); | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
15 |
19 | 16 /* |
17 __code code1(Allocate allocate) { | |
18 allocate.size = sizeof(long); | |
19 allocate.next = Code2; | |
20 goto Allocate(allocate); | |
21 } | |
22 */ | |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
23 static double st_time; |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
24 static double ed_time; |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
25 static int num; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
26 static clock_t c1,c2; |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
27 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
28 static stack_ptr pstack; |
42 | 29 static struct Node* pre; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
30 |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
31 static double getTime() { |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
32 struct timeval tv; |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
33 gettimeofday(&tv, NULL); |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
34 return tv.tv_sec + (double)tv.tv_usec*1e-6; |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
35 } |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
36 |
42 | 37 void print_tree(struct Node* node, int n) { |
38 if (node != 0) { | |
39 print_tree(node->left, n+1); | |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
40 for (int i=0;i<n;i++) |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
41 printf(" "); |
42 | 42 printf("key=%d depth=%d\t%p\n", node->key, n, node); |
43 print_tree(node->right, n+1); | |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
44 } |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
45 } |
19 | 46 |
47 __code code1(struct Context* context) { | |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
48 context->data[Allocate]->allocate.size = sizeof(long); |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
49 context->data[Allocate]->allocate.next = Code2; |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
50 goto meta(context, Allocator); |
19 | 51 } |
52 | |
53 __code meta(struct Context* context, enum Code next) { | |
54 goto (context->code[next])(context); | |
55 } | |
56 | |
57 __code put(struct Context* context) { | |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
58 struct Tree* tree = &context->data[Tree]->tree; |
42 | 59 context->data[Next]->next = context->data[Allocate]->allocate.next; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
60 |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
61 if (tree->root == 0) { |
44 | 62 context->data[Allocate]->allocate.next = Insert; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
63 goto meta(context, Allocator); |
19 | 64 } |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
65 |
44 | 66 context->data[Allocate]->allocate.next = Create; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
67 tree->current = tree->root; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
68 |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
69 goto meta(context, Compare); |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
70 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
71 |
44 | 72 __code replaceNode(struct Context* context) { |
73 struct Node* newNode = &context->data[context->dataNum]->node; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
74 struct Tree* tree = &context->data[Tree]->tree; |
42 | 75 struct Node* persistentNode = tree->current; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
76 |
31
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
77 int result = context->data[Tree]->tree.result; |
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
78 |
44 | 79 *newNode = *persistentNode; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
80 |
31
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
81 if (result == 0) { |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
82 stack_pop(pstack, &tree->current); |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
83 goto meta(context, RotateL); |
31
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
84 } else if (result == 1) { |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
85 tree->current = persistentNode->right; |
44 | 86 newNode->right = context->heap; |
31
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
87 } else { |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
88 tree->current = persistentNode->left; |
44 | 89 newNode->left = context->heap; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
90 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
91 |
42 | 92 if (tree->current == 0) { |
93 stack_pop(pstack, &tree->current); | |
44 | 94 context->data[Allocate]->allocate.next = Insert; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
95 goto meta(context, Allocator); |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
96 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
97 |
44 | 98 context->data[Allocate]->allocate.next = Create; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
99 goto meta(context, Compare); |
19 | 100 } |
101 | |
44 | 102 __code insertNode(struct Context* context) { |
103 struct Node* newNode = &context->data[context->dataNum]->node; | |
42 | 104 struct Node* temporalNode = &context->data[Node]->node; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
105 struct Tree* tree = &context->data[Tree]->tree; |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
106 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
107 temporalNode->color = Red; |
44 | 108 *newNode = *temporalNode; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
109 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
110 if (tree->root == 0) { |
44 | 111 newNode->color = Black; |
112 tree->root = newNode; | |
42 | 113 goto meta(context, context->data[Next]->next); |
20 | 114 } |
115 | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
116 goto meta(context, RotateL); |
21 | 117 } |
118 | |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
119 __code compare(struct Context* context) { |
42 | 120 int persistentKey = context->data[Tree]->tree.current->key; |
121 int temporalKey = context->data[Node]->node.key; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
122 |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
123 struct Tree* tree = &context->data[Tree]->tree; |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
124 |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
125 if (persistentKey == temporalKey) { |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
126 tree->result = 0; |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
127 } else if (persistentKey < temporalKey) { |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
128 tree->result = 1; |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
129 } else { |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
130 tree->result = -1; |
20 | 131 } |
132 | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
133 goto meta(context, context->data[Allocate]->allocate.next); |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
134 } |
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
135 |
44 | 136 __code createNode(struct Context* context) { |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
137 stack_push(pstack, &context->heap); |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
138 |
44 | 139 context->data[Allocate]->allocate.next = Replace; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
140 goto meta(context, Allocator); |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
141 } |
20 | 142 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
143 __code rotateLeft(struct Context* context) { |
42 | 144 struct Node* node = context->data[Tree]->tree.current; |
145 | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
146 if (node->right != 0) { |
42 | 147 if (node->right->color == Red) { |
148 struct Node* tmp = node->right; | |
149 node->right = tmp->left; | |
150 tmp->left = node; | |
151 tmp->color = tmp->left->color; | |
152 tmp->left->color = Red; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
153 context->data[Tree]->tree.current = tmp; |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
154 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
155 } |
20 | 156 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
157 goto meta(context, RotateR); |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
158 } |
21 | 159 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
160 __code rotateRight(struct Context* context) { |
42 | 161 struct Node* node = context->data[Tree]->tree.current; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
162 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
163 if (node->left != 0) { |
42 | 164 if (node->left->left != 0) { |
165 if (node->left->color == Red && node->left->left->color == Red) { | |
166 struct Node* tmp = node->left; | |
167 node->left = tmp->right; | |
168 tmp->right = node; | |
169 tmp->color = tmp->right->color; | |
170 tmp->right->color = Red; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
171 context->data[Tree]->tree.current = tmp; |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
172 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
173 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
174 } |
20 | 175 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
176 goto meta(context, ColorFlip); |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
177 } |
27 | 178 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
179 __code colorFlip(struct Context* context) { |
42 | 180 struct Node* node = context->data[Tree]->tree.current; |
27 | 181 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
182 if (node->right != 0 && node->left != 0) { |
42 | 183 if (node->right->color == Red && node->left->color == Red) { |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
184 node->color ^= 1; |
42 | 185 node->left->color ^= 1; |
186 node->right->color ^= 1; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
187 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
188 } |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
189 |
27 | 190 goto meta(context, FixUp); |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
191 } |
20 | 192 |
27 | 193 __code fixUp(struct Context* context) { |
194 struct Allocate* allocate = &context->data[Allocate]->allocate; | |
42 | 195 struct Node* node = context->data[Tree]->tree.current; |
27 | 196 |
197 allocate->next = ChangeRef; | |
42 | 198 |
199 context->data[Node]->node.key = node->key; | |
200 context->data[Tree]->tree.prev = node; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
201 |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
202 if (stack_pop(pstack, &context->data[Tree]->tree.current) == 0) { |
27 | 203 goto meta(context, Compare); |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
204 } |
27 | 205 |
42 | 206 context->data[Tree]->tree.root = node; |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
207 |
42 | 208 goto meta(context, context->data[Next]->next); |
27 | 209 } |
210 | |
211 __code changeReference(struct Context* context) { | |
42 | 212 struct Node* node = context->data[Tree]->tree.current; |
31
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
213 int result = context->data[Tree]->tree.result; |
27 | 214 |
31
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
215 if (result == 1) { |
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
216 node->right = context->data[Tree]->tree.prev; |
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
217 } else if (result == -1) { |
27 | 218 node->left = context->data[Tree]->tree.prev; |
31
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
219 } else { |
dbbafae822f8
modify Non-Destructive Red Black Tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
27
diff
changeset
|
220 perror("bad status"); |
27 | 221 } |
222 | |
223 goto meta(context, RotateL); | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
224 } |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
225 |
47 | 226 __code get(struct Context* context) { |
227 context->data[Tree]->tree.current = context->data[Tree]->tree.root; | |
228 context->data[Next]->next = context->data[Allocate]->allocate.next; | |
229 context->data[Allocate]->allocate.next = Traverse; | |
230 | |
231 goto meta(context, Compare); | |
232 } | |
233 | |
234 __code traverse(struct Context* context) { | |
235 int result = context->data[Tree]->tree.result; | |
236 struct Tree* tree = &context->data[Tree]->tree; | |
237 | |
238 if (result == 0) { | |
239 goto meta(context, context->data[Next]->next); | |
240 } else if (result == 1) { | |
241 tree->current = tree->current->right; | |
242 } else { | |
243 tree->current = tree->current->left; | |
244 } | |
245 | |
246 if(tree->current == 0) { | |
247 goto meta(context, context->data[Next]->next); | |
248 } | |
249 | |
250 goto meta(context, Compare); | |
251 } | |
252 | |
19 | 253 /* |
254 __code code2(Allocate allocate, Count count) { | |
255 count.count = 0; | |
256 goto code3(count); | |
257 } | |
258 */ | |
259 | |
260 __code code2(struct Context* context) { | |
42 | 261 context->data[4]->count = 1; |
21 | 262 goto meta(context, Code3); |
263 } | |
264 | |
265 __code code3(struct Context* context) { | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
266 struct Allocate* allocate = &context->data[Allocate]->allocate; |
42 | 267 struct Node* node = &context->data[Node]->node; |
268 long loop = context->data[4]->count; | |
269 | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
270 if (loop == num) { |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
271 goto meta(context, Code4); |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
272 } |
42 | 273 |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
274 allocate->size = sizeof(struct Node); |
42 | 275 allocate->next = Code3; |
276 | |
277 node->key = loop; | |
278 node->value = loop; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
279 |
42 | 280 context->data[4]->count++; |
23
868c2918b634
Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
281 goto meta(context, Put); |
19 | 282 } |
283 | |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
284 __code code4(struct Context* context) { |
47 | 285 puts("---before---"); |
286 print_tree(context->data[Tree]->tree.root, 0); | |
42 | 287 |
288 struct Allocate* allocate = &context->data[Allocate]->allocate; | |
289 allocate->size = sizeof(struct Node); | |
290 allocate->next = Code5; | |
291 | |
292 struct Node* node = &context->data[Node]->node; | |
293 node->key = 0; | |
294 node->value = 0; | |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
295 |
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
296 goto meta(context, Put); |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
297 } |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
298 |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
299 __code code5(struct Context* context) { |
42 | 300 puts("---after---"); |
24
7494c0b87ec4
implement insert of Non Destructive llrb
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
301 print_tree(context->data[Tree]->tree.root, 0); |
25 | 302 puts("--Number of Data--"); |
303 printf("%d\n", context->dataNum); | |
304 stack_free(pstack); | |
47 | 305 |
306 context->data[Allocate]->allocate.next = Code6; | |
307 context->data[Node]->node.key = 2; | |
308 | |
309 goto meta(context, Get); | |
310 } | |
311 | |
312 __code code6(struct Context* context) { | |
313 puts("---get---"); | |
314 print_tree(context->data[Tree]->tree.current, 0); | |
22
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
315 goto meta(context, Exit); |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
316 } |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
317 |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
318 int main(int argc, char** argv) { |
4c3c0ad4a75d
add benchmark method
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
319 num = (int)atoi(argv[1]); |
26 | 320 pstack = stack_init(sizeof(union Data*), num); |
19 | 321 struct Context* context = (struct Context*)malloc(sizeof(struct Context)); |
322 initLLRBContext(context); | |
323 goto start_code(context, Code1); | |
324 } |