COVISE Core
dmgr_mem_avltrees.h
Go to the documentation of this file.
1/* This file is part of COVISE.
2
3 You can use it under the terms of the GNU Lesser General Public License
4 version 2.1 or later, see lgpl-2.1.txt.
5
6 * License: LGPL 2+ */
7
8#ifndef DMGR_AVL_TREE_H
9#define DMGR_AVL_TREE_H
10
11#include <shm/covise_shm.h>
12
13//*****************************************************************//
14// search for a special value in a binary tree. return value is
15// if search==-2: the biggest node with value < data,
16// if search==+2: the smallest node with value > data,
17// if search==-1: the biggest node with value <= data,
18// if search==+1: the smallest node with value >= data,
19// if search== 0: the node with value == data,
20// or NULL, if the condition cannot be satisfied.
21//*****************************************************************//
22
23/*
24const int GREATER_THAN = 2;
25const int GT_EQUAL = 1;
26const int EQUAL = 0;
27const int LS_EQUAL = -1;
28const int LESS_THAN = -2;
29*/
30
31#ifndef GREATER_THAN
32#define GREATER_THAN 2
33#endif
34#ifndef GT_EQUAL
35#define GT_EQUAL 1
36#endif
37#ifndef EQUAL
38#define EQUAL 0
39#endif
40#ifndef LS_EQUAL
41#define LS_EQUAL -1
42#endif
43#ifndef LESS_THAN
44#define LESS_THAN -2
45#endif
46
47namespace covise
48{
49
50class CO_MemAddAVLTree;
51
52const int NO_OF_TREES = 256;
53const int NO_OF_MEMCHUNKS = 1000;
54
56{
57 friend class AddressOrderedTree;
58 friend class CO_MemSizeAVLNode;
59 friend class CO_MemAddAVLTree;
60 friend class CO_MemSizeAVLTree;
61 int seq_no;
63 char *address;
64
65public:
66 class MemChunk *next;
68 : seq_no(0)
69 , size(0)
70 , address(0L)
71 , next(0L){};
72 MemChunk(int no, void *add, shmSizeType s)
73 : seq_no(no)
74 , size(s)
75 , address((char *)add)
76 , next(0L){};
79 {
80 MemChunk *new_node = new MemChunk(seq_no, address, s);
81 size = size - s;
82 address = address + s;
83 return new_node;
84 };
86 {
88 coShmPtr *ptr = new coShmPtr(seq_no, covise::shmSizeType(address - (char *)shm->get_pointer(seq_no)));
89 return ptr;
90 };
92 {
93 return address;
94 };
96 {
97 return size;
98 };
100 {
101 size += incr;
102 };
103 void print();
104 void set(int no, void *add, shmSizeType s)
105 {
106 seq_no = no;
107 size = s;
108 address = (char *)add;
109 };
110};
111
112AVL_EXTERN MemChunk *new_memchunk();
113AVL_EXTERN MemChunk *new_memchunk(int no, void *add, shmSizeType s);
114AVL_EXTERN void delete_memchunk(MemChunk *);
115
116class DMGREXPORT CO_MemAVLNode /* structure for AVL-trees */
117{
118public:
119 CO_MemAVLNode *left; /* pointer to left subtree */
120 CO_MemAVLNode *right; /* pointer to right subtree */
121 CO_MemAVLNode *up; /* pointer to father node */
122 int balance; /* balance of subtrees =h(R)-h(L), normally -1..1 */
123 MemChunk *data; /* data the tree is sorted by */
125 {
126 data = d;
127 left = 0L;
128 right = 0L;
129 up = 0L;
130 balance = 0;
131 };
132 CO_MemAVLNode() // does not delete data!!
133 {
134 data = 0L;
135 delete left;
136 delete right;
137 };
138 void print()
139 {
140 if (left)
141 left->print();
142 // if(data) data->print();
143 if (right)
144 right->print();
145 };
146 void remove_nod(int dispo_chunk)
147 {
148 if (left)
149 {
150 left->remove_nod(dispo_chunk);
151 delete left;
152 }
153 if (right)
154 {
155 right->remove_nod(dispo_chunk);
156 delete right;
157 }
158 if (dispo_chunk && data)
160 };
161};
162
164{
165 friend class CO_MemAddAVLTree;
166 friend class CO_MemSizeAVLTree;
167 int m_reb_active; //rebalance of the tree active - default true
168public:
169 CO_MemAVLTree() // standard initialization
170 {
171 m_reb_active = 1;
172 };
174
175 void activate_reb(void)
176 {
177 m_reb_active = 1;
178 };
179 void deactivate_reb(void)
180 {
181 m_reb_active = 0;
182 };
184 {
185 return m_reb_active;
186 };
187
188 void show_tree(CO_MemAVLNode *curr_node);
189};
190
192{
194 CO_MemAVLNode *best_node; /* after a search the found node can be found here */
195public:
197 : root(0L){};
199 void rebalance_tree(CO_MemAVLNode *tree_node, int add_balance,
200 int grow_shrink);
201 MemChunk *search_node(MemChunk *data, int search);
202 MemChunk *search_and_remove_node(MemChunk *data, int search);
203 int insert_node(MemChunk *data);
204 MemChunk *remove_node(MemChunk *data);
205 void empty_tree(int dispo_chunk)
206 {
207 if (root)
208 {
209 root->remove_nod(dispo_chunk);
210 delete root;
211 root = NULL;
212 }
213 };
214};
215#ifdef WIN32
216#pragma warning (push)
217#pragma warning (disable : 4311)
218#pragma warning (disable : 4302)
219#endif
221{
222private:
224
225public:
229 {
230 return trees[(long)data->address & 0xff00 >> 8].search_node(data, search);
231 };
233 {
234 return trees[(long)data->address & 0xff00 >> 8].insert_node(data);
235 };
237 {
238 return trees[(long)data->address & 0xff00 >> 8].search_and_remove_node(data, EQUAL);
239 };
240 void empty_trees(int dispo_chunk)
241 {
242 for (int i = 0; i < NO_OF_TREES; i++)
243 trees[i].empty_tree(dispo_chunk);
244 };
245};
246
247#ifdef WIN32
248#pragma warning (pop)
249#endif
250
251class DMGREXPORT CO_MemSizeAVLNode /* structure for AVL-trees */
252{
253public:
254 CO_MemSizeAVLNode *left; /* pointer to left subtree */
255 CO_MemSizeAVLNode *right; /* pointer to right subtree */
256 CO_MemSizeAVLNode *up; /* pointer to father node */
257 int balance; /* balance of subtrees =h(R)-h(L), normally -1..1 */
258 shmSizeType size; /* data the tree is sorted by */
262 : left(0L)
263 , right(0L)
264 , up(0)
265 , balance(0)
266 , number_of_chunks(1)
267 {
268 d->next = 0L;
269 node_list = d;
270 size = d->size;
271 };
273 {
274 while (node_list)
275 {
276 fprintf(stderr, "Fehler!!!\n");
277 MemChunk *tmp = node_list->next;
278 delete_memchunk(node_list);
279 node_list = tmp;
280 }
281 // Uwe delete left;
282 // delete right;
283 }; // does not delete data!!
285 {
286 d->next = node_list;
287 node_list = d;
288 number_of_chunks++;
289 };
291 {
292 MemChunk *tmpptr = node_list;
293 node_list = node_list->next;
294 number_of_chunks--;
295 return tmpptr;
296 };
298 {
299 MemChunk *tmpptr = node_list;
300 if (tmpptr == data)
301 {
302 node_list = node_list->next;
303 number_of_chunks--;
304 return tmpptr;
305 }
306 while (tmpptr->next)
307 {
308 if (tmpptr->next == data)
309 {
310 tmpptr->next = data->next;
311 number_of_chunks--;
312 return data;
313 }
314 else
315 tmpptr = tmpptr->next;
316 }
317 return 0L;
318 };
319 void print()
320 {
321 if (left)
322 left->print();
323 // if(data) data->print();
324 if (right)
325 right->print();
326 };
327 void remove_nod(void)
328 {
329 if (left)
330 {
331 left->remove_nod();
332 delete left;
333 }
334 if (right)
335 {
336 right->remove_nod();
337 delete right;
338 }
339 while (node_list)
340 {
341 MemChunk *tmp = node_list->next;
342 delete_memchunk(node_list);
343 node_list = tmp;
344 }
345 };
346};
347
349{
351 CO_MemSizeAVLNode *best_node; /* after a search the found node can be found here */
352public:
354 : root(0L){};
356 void rebalance_tree(CO_MemSizeAVLNode *tree_node, int add_balance,
357 int grow_shrink);
358 MemChunk *search_and_remove_node(shmSizeType size, int search);
359 MemChunk *remove_node(MemChunk *data);
360 int insert_node(MemChunk *data);
361 void empty_tree(void)
362 {
363 if (root)
364 {
365 root->remove_nod();
366 delete root;
367 root = NULL;
368 }
369 };
370};
371
373{
374private:
376
377public:
381 {
382 return tree.search_and_remove_node(size_wanted, GT_EQUAL);
383 };
385 {
386 return tree.remove_node(data);
387 };
389 {
390 return tree.insert_node(data);
391 };
392 void empty_tree(void)
393 {
394 tree.empty_tree();
395 };
396};
397}
398#endif
#define DMGREXPORT
Definition: coExport.h:325
#define NULL
Definition: covise_list.h:22
GLuint address
Definition: khronos-glext.h:10368
GLsizeiptr size
Definition: khronos-glext.h:6610
GLdouble GLdouble right
Definition: khronos-glext.h:12128
GLint left
Definition: khronos-glext.h:8444
GLdouble s
Definition: khronos-glext.h:6441
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: khronos-glext.h:6354
#define AVL_EXTERN
Definition: dmgr_mem_avltrees.cpp:9
#define EQUAL
Definition: dmgr_mem_avltrees.h:38
#define GT_EQUAL
Definition: dmgr_mem_avltrees.h:35
list of all chemical elements
Definition: coConfig.h:27
const int NO_OF_MEMCHUNKS
Definition: dmgr_mem_avltrees.h:53
SHMEXPORT SharedMemory * get_shared_memory()
Definition: covise_shm.cpp:91
unsigned int shmSizeType
Definition: covise_shm.h:202
void delete_memchunk(MemChunk *chunk_ptr)
Definition: dmgr_mem_avltrees.cpp:113
const int NO_OF_TREES
Definition: dmgr_mem_avltrees.h:52
MemChunk * new_memchunk()
Definition: dmgr_mem_avltrees.cpp:89
std::enable_if< I==sizeof...(Tp), void >::type print(Stream &s, const std::tuple< Tp... > &t)
Definition: tokenbuffer_util.h:68
Definition: dmgr_mem_avltrees.h:56
shmSizeType size
Definition: dmgr_mem_avltrees.h:62
void set(int no, void *add, shmSizeType s)
Definition: dmgr_mem_avltrees.h:104
int seq_no
Definition: dmgr_mem_avltrees.h:61
MemChunk(int no, void *add, shmSizeType s)
Definition: dmgr_mem_avltrees.h:72
char * get_plain_address()
Definition: dmgr_mem_avltrees.h:91
void increase_size(shmSizeType incr)
Definition: dmgr_mem_avltrees.h:99
char * address
Definition: dmgr_mem_avltrees.h:63
MemChunk * split(shmSizeType s)
Definition: dmgr_mem_avltrees.h:78
~MemChunk()
Definition: dmgr_mem_avltrees.h:77
class MemChunk * next
Definition: dmgr_mem_avltrees.h:66
shmSizeType get_plain_size()
Definition: dmgr_mem_avltrees.h:95
MemChunk()
Definition: dmgr_mem_avltrees.h:67
coShmPtr * getAddress()
Definition: dmgr_mem_avltrees.h:85
Definition: dmgr_mem_avltrees.h:117
CO_MemAVLNode * up
Definition: dmgr_mem_avltrees.h:121
int balance
Definition: dmgr_mem_avltrees.h:122
void remove_nod(int dispo_chunk)
Definition: dmgr_mem_avltrees.h:146
CO_MemAVLNode * right
Definition: dmgr_mem_avltrees.h:120
CO_MemAVLNode(MemChunk *d)
Definition: dmgr_mem_avltrees.h:124
void print()
Definition: dmgr_mem_avltrees.h:138
CO_MemAVLNode()
Definition: dmgr_mem_avltrees.h:132
MemChunk * data
Definition: dmgr_mem_avltrees.h:123
CO_MemAVLNode * left
Definition: dmgr_mem_avltrees.h:119
Definition: dmgr_mem_avltrees.h:164
void activate_reb(void)
Definition: dmgr_mem_avltrees.h:175
int is_reb_active(void)
Definition: dmgr_mem_avltrees.h:183
~CO_MemAVLTree()
Definition: dmgr_mem_avltrees.h:173
int m_reb_active
Definition: dmgr_mem_avltrees.h:167
CO_MemAVLTree()
Definition: dmgr_mem_avltrees.h:169
void deactivate_reb(void)
Definition: dmgr_mem_avltrees.h:179
Definition: dmgr_mem_avltrees.h:192
void empty_tree(int dispo_chunk)
Definition: dmgr_mem_avltrees.h:205
CO_MemAVLNode * best_node
Definition: dmgr_mem_avltrees.h:194
MemChunk * search_and_remove_node(MemChunk *data, int search)
Definition: dmgr_mem_avltrees.cpp:933
MemChunk * search_node(MemChunk *data, int search)
Definition: dmgr_mem_avltrees.cpp:816
~CO_MemAddAVLTree()
Definition: dmgr_mem_avltrees.h:198
CO_MemAddAVLTree()
Definition: dmgr_mem_avltrees.h:196
int insert_node(MemChunk *data)
Definition: dmgr_mem_avltrees.cpp:1248
CO_MemAVLNode * root
Definition: dmgr_mem_avltrees.h:193
Definition: dmgr_mem_avltrees.h:221
~AddressOrderedTree()
Definition: dmgr_mem_avltrees.h:227
MemChunk * remove_chunk(MemChunk *data)
Definition: dmgr_mem_avltrees.h:236
void empty_trees(int dispo_chunk)
Definition: dmgr_mem_avltrees.h:240
int insert_chunk(MemChunk *data)
Definition: dmgr_mem_avltrees.h:232
AddressOrderedTree()
Definition: dmgr_mem_avltrees.h:226
MemChunk * search_chunk(MemChunk *data, int search)
Definition: dmgr_mem_avltrees.h:228
Definition: dmgr_mem_avltrees.h:252
MemChunk * node_list
Definition: dmgr_mem_avltrees.h:260
~CO_MemSizeAVLNode()
Definition: dmgr_mem_avltrees.h:272
int balance
Definition: dmgr_mem_avltrees.h:257
CO_MemSizeAVLNode * up
Definition: dmgr_mem_avltrees.h:256
CO_MemSizeAVLNode(MemChunk *d)
Definition: dmgr_mem_avltrees.h:261
CO_MemSizeAVLNode * right
Definition: dmgr_mem_avltrees.h:255
shmSizeType size
Definition: dmgr_mem_avltrees.h:258
void add_chunk(MemChunk *d)
Definition: dmgr_mem_avltrees.h:284
MemChunk * remove_chunk()
Definition: dmgr_mem_avltrees.h:290
void print()
Definition: dmgr_mem_avltrees.h:319
MemChunk * remove_chunk(MemChunk *data)
Definition: dmgr_mem_avltrees.h:297
int number_of_chunks
Definition: dmgr_mem_avltrees.h:259
CO_MemSizeAVLNode * left
Definition: dmgr_mem_avltrees.h:254
void remove_nod(void)
Definition: dmgr_mem_avltrees.h:327
Definition: dmgr_mem_avltrees.h:349
int insert_node(MemChunk *data)
Definition: dmgr_mem_avltrees.cpp:1551
MemChunk * remove_node(MemChunk *data)
Definition: dmgr_mem_avltrees.cpp:1913
void empty_tree(void)
Definition: dmgr_mem_avltrees.h:361
~CO_MemSizeAVLTree()
Definition: dmgr_mem_avltrees.h:355
MemChunk * search_and_remove_node(shmSizeType size, int search)
Definition: dmgr_mem_avltrees.cpp:1603
CO_MemSizeAVLTree()
Definition: dmgr_mem_avltrees.h:353
CO_MemSizeAVLNode * root
Definition: dmgr_mem_avltrees.h:350
CO_MemSizeAVLNode * best_node
Definition: dmgr_mem_avltrees.h:351
Definition: dmgr_mem_avltrees.h:373
CO_MemSizeAVLTree tree
Definition: dmgr_mem_avltrees.h:375
int insert_chunk(MemChunk *data)
Definition: dmgr_mem_avltrees.h:388
MemChunk * get_chunk(shmSizeType size_wanted)
Definition: dmgr_mem_avltrees.h:380
~SizeOrderedTree()
Definition: dmgr_mem_avltrees.h:379
SizeOrderedTree()
Definition: dmgr_mem_avltrees.h:378
void empty_tree(void)
Definition: dmgr_mem_avltrees.h:392
MemChunk * remove_chunk(MemChunk *data)
Definition: dmgr_mem_avltrees.h:384
Definition: covise_shm.h:209
void * get_pointer(int no)
Definition: covise_shm.h:246
Definition: covise_shm.h:380