set.h
1 /*************************************************************************/
2 /* set.h */
3 /*************************************************************************/
4 /* This file is part of: */
5 /* GODOT ENGINE */
6 /* http://www.godotengine.org */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
9 /* */
10 /* Permission is hereby granted, free of charge, to any person obtaining */
11 /* a copy of this software and associated documentation files (the */
12 /* "Software"), to deal in the Software without restriction, including */
13 /* without limitation the rights to use, copy, modify, merge, publish, */
14 /* distribute, sublicense, and/or sell copies of the Software, and to */
15 /* permit persons to whom the Software is furnished to do so, subject to */
16 /* the following conditions: */
17 /* */
18 /* The above copyright notice and this permission notice shall be */
19 /* included in all copies or substantial portions of the Software. */
20 /* */
21 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
22 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
23 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
24 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
25 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
26 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
27 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
28 /*************************************************************************/
29 #ifndef SET_H
30 #define SET_H
31 
32 #include "typedefs.h"
33 #include "os/memory.h"
34 
40 // based on the very nice implementation of rb-trees by:
41 // http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html
42 
43 template <class T,class C=Comparator<T>,class A=DefaultAllocator >
44 class Set {
45 
46  enum Color {
47  RED,
48  BLACK
49  };
50  struct _Data;
51 public:
52 
53 
54 
55  class Element {
56 
57  private:
58  friend class Set<T,C,A>;
59  int color;
60  Element* right;
61  Element* left;
62  Element* parent;
63  Element* _next;
64  Element* _prev;
65  T value;
66  //_Data *data;
67 
68  public:
69 
70  const Element *next() const {
71 
72  return _next;
73  }
74  Element *next() {
75 
76  return _next;
77  }
78  const Element *prev() const {
79 
80  return _prev;
81  }
82  Element *prev() {
83 
84  return _prev;
85  }
86  const T& get() const {
87  return value;
88  };
89  Element() {
90  color=RED;
91  right=NULL;
92  left=NULL;
93  parent=NULL;
94  _next=NULL;
95  _prev=NULL;
96  };
97  };
98 
99 
100 private:
101 
102  struct _Data {
103 
104  Element* _root;
105  Element* _nil;
106  int size_cache;
107 
108 
109  _Data() {
110 #ifdef GLOBALNIL_DISABLED
111  _nil = memnew_allocator( Element,A );
112  _nil->parent=_nil->left=_nil->right=_nil;
113  _nil->color=BLACK;
114 #else
115 
116  _nil=(Element*)&_GlobalNilClass::_nil;
117 #endif
118  _root = NULL;
119 
120  size_cache=0;
121  }
122 
123  void _create_root() {
124 
125  _root = memnew_allocator( Element,A );
126  _root->parent=_root->left=_root->right=_nil;
127  _root->color=BLACK;
128  }
129 
130  void _free_root() {
131 
132  if (_root) {
133  memdelete_allocator<Element,A>(_root);
134  _root=NULL;
135  }
136  }
137 
138  ~_Data() {
139 
140  _free_root();
141 #ifdef GLOBALNIL_DISABLED
142  memdelete_allocator<Element,A>(_nil);
143 #endif
144 // memdelete_allocator<Element,A>(_root);
145  }
146  };
147 
148  _Data _data;
149 
150  inline void _set_color(Element *p_node, int p_color) {
151 
152  ERR_FAIL_COND( p_node == _data._nil && p_color == RED );
153  p_node->color=p_color;
154  }
155  inline void _rotate_left(Element *p_node) {
156 
157  Element *r=p_node->right;
158  p_node->right=r->left;
159  if (r->left != _data._nil )
160  r->left->parent=p_node;
161  r->parent=p_node->parent;
162  if (p_node==p_node->parent->left)
163  p_node->parent->left=r;
164  else
165  p_node->parent->right=r;
166 
167  r->left=p_node;
168  p_node->parent=r;
169 
170  }
171 
172  inline void _rotate_right(Element *p_node) {
173 
174  Element *l=p_node->left;
175  p_node->left=l->right;
176  if (l->right != _data._nil)
177  l->right->parent=p_node;
178  l->parent=p_node->parent;
179  if (p_node==p_node->parent->right)
180  p_node->parent->right=l;
181  else
182  p_node->parent->left=l;
183 
184  l->right=p_node;
185  p_node->parent=l;
186 
187  }
188 
189  inline Element* _successor(Element *p_node) const {
190 
191  Element *node=p_node;
192 
193  if (node->right != _data._nil) {
194 
195  node=node->right;
196  while(node->left != _data._nil) { /* returns the minium of the right subtree of node */
197  node=node->left;
198  }
199  return node;
200  } else {
201 
202  while(node == node->parent->right) {
203  node=node->parent;
204  }
205  if (node->parent == _data._root)
206  return NULL;
207  return node->parent;
208  }
209  }
210 
211  inline Element* _predecessor(Element *p_node) const {
212  Element *node=p_node;
213 
214  if (node->left != _data._nil) {
215 
216  node=node->left;
217  while(node->right != _data._nil) { /* returns the minium of the left subtree of node */
218  node=node->right;
219  }
220  return node;
221  } else {
222 
223  while(node == node->parent->left) {
224  if (node->parent == _data._root)
225  return NULL;
226 
227  node=node->parent;
228  }
229  return node->parent;
230  }
231  }
232 
233 
234  Element *_find(const T& p_value) const {
235 
236  Element *node = _data._root->left;
237  C less;
238 
239  while(node!=_data._nil) {
240 
241  if (less(p_value,node->value))
242  node=node->left;
243  else if (less(node->value,p_value))
244  node=node->right;
245  else
246  break; // found
247  }
248 
249  return (node!=_data._nil)?node:NULL;
250  }
251 
252  Element *_lower_bound(const T& p_value) const {
253 
254  Element *node = _data._root->left;
255  Element *prev = NULL;
256  C less;
257 
258  while(node!=_data._nil) {
259  prev=node;
260 
261  if (less(p_value,node->value))
262  node=node->left;
263  else if (less(node->value,p_value))
264  node=node->right;
265  else
266  break; // found
267  }
268 
269  if (node==_data._nil) {
270  if (prev==NULL)
271  return NULL;
272  if (less(prev->value,p_value)) {
273 
274  prev=prev->_next;
275  }
276 
277  return prev;
278 
279  } else
280  return node;
281  }
282 
283 
284  Element *_insert(const T& p_value, bool& r_exists) {
285 
286  Element *new_parent=_data._root;
287  Element *node = _data._root->left;
288  C less;
289 
290  while (node!=_data._nil) {
291 
292  new_parent=node;
293 
294  if (less(p_value,node->value))
295  node=node->left;
296  else if (less(node->value,p_value))
297  node=node->right;
298  else {
299  r_exists=true;
300  return node;
301  }
302  }
303 
304  Element *new_node = memnew_allocator( Element,A );
305 
306  new_node->parent=new_parent;
307  new_node->right=_data._nil;
308  new_node->left=_data._nil;
309  new_node->value=p_value;
310 // new_node->data=_data;
311  if (new_parent==_data._root || less(p_value,new_parent->value)) {
312 
313  new_parent->left=new_node;
314  } else {
315  new_parent->right=new_node;
316  }
317 
318  r_exists=false;
319 
320  new_node->_next=_successor(new_node);
321  new_node->_prev=_predecessor(new_node);
322  if (new_node->_next)
323  new_node->_next->_prev=new_node;
324  if (new_node->_prev)
325  new_node->_prev->_next=new_node;
326 
327 
328  return new_node;
329  }
330 
331  Element * _insert_rb(const T& p_value) {
332 
333  bool exists=false;
334  Element *new_node = _insert(p_value,exists);
335  if (exists)
336  return new_node;
337 
338  Element *node=new_node;
339  _data.size_cache++;
340 
341  while(node->parent->color==RED) {
342 
343  if (node->parent == node->parent->parent->left) {
344 
345  Element *aux=node->parent->parent->right;
346 
347  if (aux->color==RED) {
348  _set_color(node->parent,BLACK);
349  _set_color(aux,BLACK);
350  _set_color(node->parent->parent,RED);
351  node=node->parent->parent;
352  } else {
353  if (node == node->parent->right) {
354  node=node->parent;
355  _rotate_left(node);
356  }
357  _set_color(node->parent,BLACK);
358  _set_color(node->parent->parent,RED);
359  _rotate_right(node->parent->parent);
360  }
361  } else {
362  Element *aux=node->parent->parent->left;
363 
364  if (aux->color==RED) {
365  _set_color(node->parent,BLACK);
366  _set_color(aux,BLACK);
367  _set_color(node->parent->parent,RED);
368  node=node->parent->parent;
369  } else {
370  if (node == node->parent->left) {
371  node=node->parent;
372  _rotate_right(node);
373  }
374  _set_color(node->parent,BLACK);
375  _set_color(node->parent->parent,RED);
376  _rotate_left(node->parent->parent);
377  }
378  }
379  }
380  _set_color(_data._root->left,BLACK);
381  return new_node;
382  }
383 
384  void _erase_fix(Element *p_node) {
385 
386  Element *root = _data._root->left;
387  Element *node=p_node;
388 
389 
390  while( (node->color==BLACK) && (root != node)) {
391  if (node == node->parent->left) {
392  Element *aux=node->parent->right;
393  if (aux->color==RED) {
394  _set_color(aux,BLACK);
395  _set_color(node->parent,RED);
396  _rotate_left(node->parent);
397  aux=node->parent->right;
398  }
399  if ( (aux->right->color==BLACK) && (aux->left->color==BLACK) ) {
400  _set_color(aux,RED);
401  node=node->parent;
402  } else {
403  if (aux->right->color==BLACK) {
404  _set_color(aux->left,BLACK);
405  _set_color(aux,RED);
406  _rotate_right(aux);
407  aux=node->parent->right;
408  }
409  _set_color(aux,node->parent->color);
410  _set_color(node->parent,BLACK);
411  _set_color(aux->right,BLACK);
412  _rotate_left(node->parent);
413  node=root; /* this is to exit while loop */
414  }
415  } else { /* the code below is has left and right switched from above */
416  Element *aux=node->parent->left;
417  if (aux->color==RED) {
418  _set_color(aux,BLACK);
419  _set_color(node->parent,RED);;
420  _rotate_right(node->parent);
421  aux=node->parent->left;
422  }
423  if ( (aux->right->color==BLACK) && (aux->left->color==BLACK) ) {
424  _set_color(aux,RED);
425  node=node->parent;
426  } else {
427  if (aux->left->color==BLACK) {
428  _set_color(aux->right,BLACK);
429  _set_color(aux,RED);
430  _rotate_left(aux);
431  aux=node->parent->left;
432  }
433  _set_color(aux,node->parent->color);
434  _set_color(node->parent,BLACK);
435  _set_color(aux->left,BLACK);
436  _rotate_right(node->parent);
437  node=root;
438  }
439  }
440  }
441 
442  _set_color(node,BLACK);
443 
444  ERR_FAIL_COND(_data._nil->color!=BLACK);
445  }
446 
447  void _erase(Element *p_node) {
448 
449 
450  Element *rp= ((p_node->left == _data._nil) || (p_node->right == _data._nil)) ? p_node : _successor(p_node);
451  if (!rp)
452  rp=_data._nil;
453  Element *node= (rp->left == _data._nil) ? rp->right : rp->left;
454 
455  if (_data._root == (node->parent=rp->parent) ) {
456  _data._root->left=node;
457  } else {
458  if (rp == rp->parent->left) {
459  rp->parent->left=node;
460  } else {
461  rp->parent->right=node;
462  }
463  }
464 
465  if (rp != p_node) {
466 
467  ERR_FAIL_COND( rp == _data._nil );
468 
469  if (rp->color==BLACK)
470  _erase_fix(node);
471 
472 
473  rp->left=p_node->left;
474  rp->right=p_node->right;
475  rp->parent=p_node->parent;
476  rp->color=p_node->color;
477  p_node->left->parent=rp;
478  p_node->right->parent=rp;
479 
480  if (p_node == p_node->parent->left) {
481  p_node->parent->left=rp;
482  } else {
483  p_node->parent->right=rp;
484  }
485  } else {
486  if (p_node->color==BLACK)
487  _erase_fix(node);
488 
489  }
490 
491 
492  if (p_node->_next)
493  p_node->_next->_prev=p_node->_prev;
494  if (p_node->_prev)
495  p_node->_prev->_next=p_node->_next;
496 
497  memdelete_allocator<Element,A>(p_node);
498  _data.size_cache--;
499  ERR_FAIL_COND( _data._nil->color==RED );
500  }
501 
502 
503  void _calculate_depth(Element *p_element,int &max_d,int d) const {
504 
505  if (p_element==_data._nil) {
506  return;
507  }
508  _calculate_depth(p_element->left,max_d,d+1);
509  _calculate_depth(p_element->right,max_d,d+1);
510  if (d>max_d)
511  max_d=d;
512  }
513 
514  void _cleanup_tree(Element *p_element) {
515 
516  if (p_element==_data._nil)
517  return;
518 
519  _cleanup_tree(p_element->left);
520  _cleanup_tree(p_element->right);
521  memdelete_allocator<Element,A>( p_element );
522  }
523 
524  void _copy_from( const Set& p_set) {
525 
526  clear();
527  // not the fastest way, but safeset to write.
528  for(Element *I=p_set.front();I;I=I->next()) {
529 
530  insert(I->get());
531  }
532  }
533 public:
534 
535  const Element *find(const T& p_value) const {
536 
537  if (!_data._root)
538  return NULL;
539 
540  const Element *res=_find(p_value);
541  return res;
542  }
543 
544  Element *find(const T& p_value) {
545 
546  if (!_data._root)
547  return NULL;
548  Element *res=_find(p_value);
549  return res;
550  }
551 
552  bool has(const T& p_value) const {
553 
554  if (!_data._root)
555  return false;
556  return find(p_value)!=NULL;
557  }
558 
559  Element *insert(const T& p_value) {
560 
561  if (!_data._root)
562  _data._create_root();
563  return _insert_rb(p_value);
564 
565  }
566 
567  void erase(Element* p_element) {
568 
569  if (!_data._root)
570  return;
571  _erase(p_element);
572  if (_data.size_cache==0 && _data._root)
573  _data._free_root();
574  }
575 
576  bool erase(const T& p_value) {
577 
578  if (!_data._root)
579  return false;
580  Element *e=find(p_value);
581  if (!e)
582  return false;
583  _erase(e);
584  if (_data.size_cache==0 && _data._root)
585  _data._free_root();
586  return true;
587  }
588 
589  Element *front() const {
590 
591  if (!_data._root)
592  return NULL;
593  Element *e=_data._root->left;
594  if (e==_data._nil)
595  return NULL;
596 
597  while(e->left!=_data._nil)
598  e=e->left;
599 
600  return e;
601  }
602 
603  Element *back() const {
604 
605  if (!_data._root)
606  return NULL;
607  Element *e=_data._root->left;
608  if (e==_data._nil)
609  return NULL;
610 
611  while(e->right!=_data._nil)
612  e=e->right;
613 
614  return e;
615  }
616 
617  Element *lower_bound(const T& p_value) const {
618 
619  return _lower_bound(p_value);
620  }
621 
622 
623  inline int size() const { return _data.size_cache; }
624  int calculate_depth() const {
625  // used for debug mostly
626  if (!_data._root)
627  return 0;
628  int max_d=0;
629  _calculate_depth(_data._root->left,max_d,0);
630  return max_d;
631  }
632 
633  void clear() {
634 
635  if (!_data._root)
636  return;
637 
638  _cleanup_tree(_data._root->left);
639  _data._root->left=_data._nil;
640  _data.size_cache=0;
641  _data._nil->parent=_data._nil;
642  _data._free_root();
643  }
644 
645  void operator=(const Set& p_set) {
646 
647  _copy_from( p_set );
648  }
649 
650  Set(const Set& p_set) {
651 
652  _copy_from( p_set );
653  }
654  _FORCE_INLINE_ Set() {
655 
656 
657  }
658 
659 
660  ~Set() {
661 
662  clear();
663  }
664 
665 };
666 
667 #endif
Definition: set.h:55
Definition: set.h:44
Definition: color.h:37
Definition: tween_interpolaters.cpp:356