Orbiter 2022
Combinatorial Objects
page_table.cpp
Go to the documentation of this file.
1// page_table.cpp
2//
3// Anton Betten
4// 7/31/09
5
7#include "discreta.h"
8
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer2_discreta {
15
16
17#define MAX_BTREE_PAGE_TABLE 100
18
19
20static page_table **btree_page_table = NULL;
21static int *btree_page_table_f_used = NULL;
22
23
24
25
26
27static int btree_page_registry_key_pair_compare_void_void(void *K1v, void *K2v);
28
29// #############################################################################
30// global function
31// #############################################################################
32
33void page_table_init(int verbose_level)
34{
35 int f_v = (verbose_level >= 1);
36 int i;
37
38 if (f_v) {
39 cout << "page_table_init" << endl;
40 }
41 btree_page_table = new ppage_table[MAX_BTREE_PAGE_TABLE];
42 btree_page_table_f_used = new int[MAX_BTREE_PAGE_TABLE];
43
44 for (i = 0; i < MAX_BTREE_PAGE_TABLE; i++) {
45 btree_page_table[i] = NULL;
46 btree_page_table_f_used[i] = FALSE;
47 }
48
49}
50
51void page_table_exit(int verbose_level)
52{
53 int f_v = (verbose_level >= 1);
54
55 if (f_v) {
56 cout << "page_table_exit" << endl;
57 }
58 if (btree_page_table) {
59 delete [] btree_page_table;
60 btree_page_table = NULL;
61 }
62 if (btree_page_table_f_used) {
63 delete [] btree_page_table_f_used;
64 btree_page_table_f_used = NULL;
65 }
66
67}
68
69int page_table_alloc(int verbose_level)
70{
71 int f_v = (verbose_level >= 1);
72 int f_vv = (verbose_level >= 2);
73 int i;
74
75 if (f_v) {
76 cout << "page_table_alloc, verbose_level=" << verbose_level << endl;
77 }
78 for (i = 0; i < MAX_BTREE_PAGE_TABLE; i++) {
79 if (!btree_page_table_f_used[i]) {
80 if (f_vv) {
81 cout << "page_table_alloc allocating slot " << i << endl;
82 }
83 btree_page_table[i] = new page_table;
84
85 btree_page_table[i]->init(verbose_level - 1);
86
87 btree_page_table_f_used[i] = TRUE;
88 if (f_vv) {
89 cout << " slot " << i << " is " << btree_page_table[i] << endl;
90 }
91 return i;
92 }
93 }
94 cout << "page_table_alloc() no free btree_data_table" << endl;
95 exit(1);
96}
97
98void page_table_free(int idx, int verbose_level)
99{
100 int f_v = (verbose_level >= 1);
101 //int f_vv = (verbose_level >= 2);
102
103 if (f_v) {
104 cout << "page_table_free freeing slot " << idx << endl;
105 }
106 if (!btree_page_table_f_used[idx]) {
107 cout << "page_table_free slot " << idx << " is not used" << endl;
108 exit(1);
109 }
110 if (btree_page_table[idx] == NULL) {
111 cout << "page_table_free btree_data_table[idx] == NULL" << endl;
112 exit(1);
113 }
114
115 if (f_v) {
116 cout << "before delete btree_page_table[idx]" << endl;
117 }
118 delete btree_page_table[idx];
119 if (f_v) {
120 cout << "after delete btree_page_table[idx]" << endl;
121 }
122
123 btree_page_table[idx] = NULL;
124 btree_page_table_f_used[idx] = FALSE;
125 if (f_v) {
126 cout << "page_table_free done" << endl;
127 }
128}
129
131{
132 page_table *T;
133
134 if (slot < 0 || slot >= MAX_BTREE_PAGE_TABLE) {
135 cout << "page_table_pointer illegal slot" << endl;
136 cout << "slot=" << slot << endl;
137 exit(1);
138 }
139 T = btree_page_table[slot];
140 if (T == NULL) {
141 cout << "page_table_pointer T == NULL" << endl;
142 exit(1);
143 }
144 return T;
145}
146
147
148static int btree_page_registry_key_pair_compare_void_void(void *K1v, void *K2v)
149{
151
152 K1 = (btree_page_registry_key_pair *) K1v;
153 K2 = (btree_page_registry_key_pair *) K2v;
154 if (K1->x < K2->x)
155 return 1;
156 if (K1->x > K2->x)
157 return -1;
158 if (K1->idx < K2->idx)
159 return 1;
160 if (K1->idx > K2->idx)
161 return -1;
162 return 0;
163}
164
165
166// ##########################################################################################################
167// class page_table
168// ##########################################################################################################
169
171{
172 btree_pages = NULL;
175 btree_table = NULL;
176}
177
179{
180 //cout << "page_table::~page_table" << endl;
181 //cout << "this=" << this << endl;
182 if (btree_pages) {
183 //cout << "calling delete btree_pages" << endl;
184 delete btree_pages;
185 //cout << "after delete btree_pages" << endl;
186 btree_pages = NULL;
187 }
188 if (btree_table) {
189 delete [] btree_table;
190 btree_table = NULL;
191 }
194 //cout << "page_table::~page_table done" << endl;
195}
196
197void page_table::init(int verbose_level)
198{
199 int f_v = (verbose_level >= 1);
200 int f_vv = (verbose_level >= 1);
201
202 if (f_v) {
203 cout << "page_table::init, verbose_level=" << verbose_level << endl;
204 }
206
207 int page_length_log = BTREE_PAGE_LENGTH_LOG;
208
210 sizeof(PageTyp),
211 page_length_log,
212 verbose_level - 2);
213
216 if (f_vv) {
217 cout << "btree_page_registry_allocated_length = " << btree_page_registry_allocated_length << endl;
218 }
219
221}
222
223void page_table::reallocate_table(int verbose_level)
224{
225 int new_length, i;
226
227 int f_v = (verbose_level >= 1);
228 int f_vv = (verbose_level >= 1);
229
230 if (f_vv) {
231 cout << "page_table::reallocate_table" << endl;
232 }
233
234 btree_page_registry_key_pair *new_btree_table;
235
236 new_length = btree_page_registry_allocated_length + 1000;
237
238
239 new_btree_table = new btree_page_registry_key_pair[new_length];
240 for (i = 0; i < btree_page_registry_length; i++) {
241 new_btree_table[i] = btree_table[i];
242 }
243 delete [] btree_table;
244 btree_table = new_btree_table;
246 if (f_v) {
247 cout << "page_table::reallocate_table: btree_page_registry_allocated_length = " << btree_page_registry_allocated_length << endl;
248 }
249
250}
251
253{
254 int i;
255
256 cout << "page registry of length " << btree_page_registry_length << endl;
257 cout << "i : x : idx : ref" << endl;
258 for (i = 0; i < btree_page_registry_length; i++) {
259 cout << i << " "
260 << btree_table[i].x << " "
261 << btree_table[i].idx << " "
262 << btree_table[i].ref << endl;
263 }
264}
265
266int page_table::search(int len, int btree_idx, int btree_x, int &idx)
267{
269
270 K.idx = btree_idx;
271 K.x = btree_x;
272 return page_table::search_key_pair(len, &K, idx);
273}
274
276{
277 int l, r, m, c;
278 //void *res;
279 int f_found = FALSE;
280
281 if (len == 0) {
282 idx = 0;
283 return FALSE;
284 }
285 l = 0;
286 r = len;
287 // invariant:
288 // v[i] <= a for i < l;
289 // v[i] > a for i >= r;
290 // r - l is the length of the area to search in.
291 while (l < r) {
292 m = (l + r) >> 1;
293 // if the length of the search area is even
294 // we examine the element above the middle
295 //res = registry_pointer[m] - p;
296 //cout << "search l=" << l << " m=" << m << " r="
297 // << r << "a=" << a << " v[m]=" << v[m] << " res=" << res << endl;
298 c = btree_page_registry_key_pair_compare_void_void(K, btree_table + m);
299 if (c <= 0) {
300 l = m + 1;
301 if (c == 0) {
302 f_found = TRUE;
303 }
304 }
305 else {
306 r = m;
307 }
308 }
309 // now: l == r;
310 // and f_found is set accordingly */
311 if (f_found) {
312 l--;
313 }
314 idx = l;
315 return f_found;
316}
317
318void page_table::save_page(Buffer *BF, int buf_idx, int verbose_level)
319{
320 int f_v = (verbose_level >= 1);
321 int x, idx, ref;
322 PageTyp *P;
323
324 if (f_v) {
325 cout << "page_table::save_page" << endl;
326 }
327 x = BF->PageNum;
329 buf_idx, x, idx)) {
330 if (f_v) {
331 cout << "making a new table entry" << endl;
332 }
333 //print();
334 //exit(1);
335
336 Buffer *empty_buf;
337 empty_buf = new Buffer;
338
339 allocate_rec(empty_buf, buf_idx, x, verbose_level - 1);
340
341 delete empty_buf;
342
344 buf_idx, x, idx)) {
345 cout << "page_table::save_page cannot find the page in the table (2nd time)" << endl;
346 cout << "x=" << x << endl;
347 cout << "buf_idx=" << buf_idx << endl;
348 print();
349 exit(1);
350 }
351 }
352 ref = btree_table[idx].ref;
353 P = (PageTyp *) btree_pages->s_i(ref);
354 *P = BF->Page;
355}
356
357int page_table::load_page(Buffer *BF, int x, int buf_idx, int verbose_level)
358{
359 int f_v = (verbose_level >= 1);
360 int idx, ref;
361 PageTyp *P;
362
363 if (f_v) {
364 cout << "page_table::load_page x=" << x << endl;
365 }
367 buf_idx, x, idx)) {
368 if (f_v) {
369 cout << "page_table::load_page cannot find the page in the table" << endl;
370 cout << "x=" << x << endl;
371 cout << "buf_idx=" << buf_idx << endl;
372 }
373 //print();
374 //exit(1);
375 return FALSE;
376 }
377 ref = btree_table[idx].ref;
378 P = (PageTyp *) btree_pages->s_i(ref);
379 BF->Page = *P;
380 return TRUE;
381}
382
383void page_table::allocate_rec(Buffer *BF, int buf_idx, int x, int verbose_level)
384{
385 int f_v = (verbose_level >= 1);
386 int ref;
387 int idx, i;
388
389 if (f_v) {
390 cout << "page_table::allocate_rec x=" << x << endl;
391 }
393 reallocate_table(verbose_level - 1);
394 }
395
396 fill_char((char *)BF, sizeof(Buffer), 0);
397 ref = btree_pages->store((uchar *) &BF->Page);
398
399 if (search(btree_page_registry_length, buf_idx, x, idx)) {
400 cout << "page_table::allocate_rec error, found entry in the table" << endl;
401 cout << "page_table::allocate_rec btree_table: at " << idx << " x=" << x << " buf_idx = " << buf_idx << " ref=" << ref << endl;
402 print();
403 exit(1);
404 }
405 for (i = btree_page_registry_length; i > idx; i--) {
406 btree_table[i] = btree_table[i - 1];
407 }
408 btree_table[idx].x = x;
409 btree_table[idx].idx = buf_idx;
410 btree_table[idx].ref = ref;
411 //cout << "btree::AllocateRec() btree_table: at " << idx << " x=" << x << " idx = " << buf_idx() << " ref=" << ref << endl;
413 /*if ((btree_page_registry_length % 10) == 0) {
414 btree_page_registry_print();
415 }*/
416}
417
418void page_table::write_pages_to_file(btree *B, int buf_idx, int verbose_level)
419{
420 int f_v = (verbose_level >= 1);
421 int i, ref, x;
422 PageTyp *P;
423
424 if (f_v) {
425 cout << "page_table::write_pages_to_file" << endl;
426 }
427
428 for (i = 0; i < btree_page_registry_length; i++) {
429 if (btree_table[i].idx == buf_idx) {
430 ref = btree_table[i].ref;
431 x = btree_table[i].x;
432 if (f_v) {
433 cout << "writing page " << x << " (ref=" << ref << ")" << endl;
434 }
435 P = (PageTyp *) btree_pages->s_i(ref);
436 B->file_seek(x);
437 B->file_write(P, "page_table::write_pages_to_file");
438 }
439 }
440}
441
442}}
bulk storage of group elements in compressed form
void init(int entry_size, int page_length_log, int verbose_level)
DISCRETA class for a database.
Definition: discreta.h:1672
void file_write(PageTyp *page, const char *message)
Definition: btree.cpp:2143
void file_seek(int page_no)
Definition: btree.cpp:2175
DISCRETA class for bulk storage.
Definition: discreta.h:1848
int search_key_pair(int len, btree_page_registry_key_pair *K, int &idx)
Definition: page_table.cpp:275
void allocate_rec(Buffer *BF, int buf_idx, int x, int verbose_level)
Definition: page_table.cpp:383
void save_page(Buffer *BF, int buf_idx, int verbose_level)
Definition: page_table.cpp:318
int load_page(Buffer *BF, int x, int buf_idx, int verbose_level)
Definition: page_table.cpp:357
layer1_foundations::data_structures::page_storage * btree_pages
Definition: discreta.h:1850
void reallocate_table(int verbose_level)
Definition: page_table.cpp:223
btree_page_registry_key_pair * btree_table
Definition: discreta.h:1853
void write_pages_to_file(btree *B, int buf_idx, int verbose_level)
Definition: page_table.cpp:418
int search(int len, int btree_idx, int btree_x, int &idx)
Definition: page_table.cpp:266
void init(int verbose_level)
Definition: page_table.cpp:197
#define BTREE_PAGE_LENGTH_LOG
Definition: discreta.h:1618
unsigned char uchar
Definition: foundations.h:204
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
void fill_char(void *v, int cnt, int c)
Definition: global.cpp:1605
struct btree_page_registry_key_pair btree_page_registry_key_pair
Definition: discreta.h:1826
struct orbiter::layer2_discreta::buffer Buffer
DISCRETA auxiliary class related to the class database.
void page_table_exit(int verbose_level)
Definition: page_table.cpp:51
int page_table_alloc(int verbose_level)
Definition: page_table.cpp:69
void page_table_free(int idx, int verbose_level)
Definition: page_table.cpp:98
page_table * page_table_pointer(int slot)
Definition: page_table.cpp:130
void page_table_init(int verbose_level)
Definition: page_table.cpp:33
class page_table page_table
DISCRETA internal class related to class database.
Definition: discreta.h:1839
the orbiter library for the classification of combinatorial objects
#define MAX_BTREE_PAGE_TABLE
Definition: page_table.cpp:17
DISCRETA internal class related to class database.
Definition: discreta.h:1830
DISCRETA auxiliary class related to the class database.
Definition: discreta.h:1659
DISCRETA auxiliary class related to the class database.
Definition: discreta.h:1642