TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
ttktree.h
Go to the documentation of this file.
1 #ifndef TTKTREE_H
2 #define TTKTREE_H
3 
4 /***************************************************************************
5  * This file is part of the TTK Library Module project
6  * Copyright (C) 2015 - 2025 Greedysky Studio
7 
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12 
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17 
18  * You should have received a copy of the GNU Lesser General Public License along
19  * with this program; If not, see <http://www.gnu.org/licenses/>.
20  ***************************************************************************/
21 
22 #include "ttkmoduleexport.h"
23 
27 //Red-Black Tree
28 template <typename _Key, typename _Value>
30 {
31 public:
32  using key_type = _Key;
33  using value_type = _Value;
34  using reference = _Value&;
35  using const_reference = const _Value&;
36 
37 private:
38  struct Node
39  {
45  alignas(sizeof(void*)) bool m_b;
46 
47  Node(const key_type &k, const value_type &v) noexcept
48  : m_key(k),
49  m_value(v),
50  m_left(nullptr),
51  m_right(nullptr),
52  m_parent(nullptr),
53  m_b(false)
54  {
55 
56  }
57 
58  Node(const key_type &k, value_type &&v) noexcept
59  : m_key(k),
60  m_value(std::move(v)),
61  m_left(nullptr),
62  m_right(nullptr),
63  m_parent(nullptr),
64  m_b(false)
65  {
66 
67  }
68  };
69 
72 
73  inline void rotateLeft(Node *x) noexcept
74  {
75  Node *y = x->m_right;
76  x->m_right = y->m_left;
77 
78  if(y->m_left != m_nil)
79  {
80  y->m_left->m_parent = x;
81  }
82  y->m_parent = x->m_parent;
83 
84  if(x->m_parent == m_nil)
85  {
86  m_root = y;
87  }
88  else if(x == x->m_parent->m_left)
89  {
90  x->m_parent->m_left = y;
91  }
92  else
93  {
94  x->m_parent->m_right = y;
95  }
96 
97  y->m_left = x;
98  x->m_parent = y;
99  }
100 
101  inline void rotateRight(Node *x) noexcept
102  {
103  Node *y = x->m_left;
104  x->m_left = y->m_right;
105 
106  if(y->m_right != m_nil)
107  {
108  y->m_right->m_parent = x;
109  }
110  y->m_parent = x->m_parent;
111 
112  if(x->m_parent == m_nil)
113  {
114  m_root = y;
115  }
116  else if(x == x->m_parent->m_right)
117  {
118  x->m_parent->m_right = y;
119  }
120  else
121  {
122  x->m_parent->m_left = y;
123  }
124 
125  y->m_right = x;
126  x->m_parent = y;
127  }
128 
129  void fixInsert(Node *z) noexcept
130  {
131  while(z != m_root && !z->m_parent->m_b)
132  {
133  if(z->m_parent == z->m_parent->m_parent->m_left)
134  {
135  Node *y = z->m_parent->m_parent->m_right;
136  if(!y->m_b)
137  {
138  z->m_parent->m_b = true;
139  y->m_b = true;
140  z->m_parent->m_parent->m_b = false;
141  z = z->m_parent->m_parent;
142  }
143  else
144  {
145  if(z == z->m_parent->m_right)
146  {
147  z = z->m_parent;
148  rotateLeft(z);
149  }
150 
151  z->m_parent->m_b = true;
152  z->m_parent->m_parent->m_b = false;
153  rotateRight(z->m_parent->m_parent);
154  }
155  }
156  else
157  {
158  Node *y = z->m_parent->m_parent->m_left;
159  if(!y->m_b)
160  {
161  z->m_parent->m_b = true;
162  y->m_b = true;
163  z->m_parent->m_parent->m_b = false;
164  z = z->m_parent->m_parent;
165  }
166  else
167  {
168  if(z == z->m_parent->m_left)
169  {
170  z = z->m_parent;
171  rotateRight(z);
172  }
173 
174  z->m_parent->m_b = true;
175  z->m_parent->m_parent->m_b = false;
176  rotateLeft(z->m_parent->m_parent);
177  }
178  }
179  }
180 
181  m_root->m_b = true;
182  }
183 
184  inline void transplant(Node *u, Node *v) noexcept
185  {
186  if(u->m_parent == m_nil)
187  {
188  m_root = v;
189  }
190  else if(u == u->m_parent->m_left)
191  {
192  u->m_parent->m_left = v;
193  }
194  else
195  {
196  u->m_parent->m_right = v;
197  }
198  v->m_parent = u->m_parent;
199  }
200 
201  void fixDelete(Node *x) noexcept
202  {
203  while(x != m_root && x->m_b)
204  {
205  if(x == x->m_parent->m_left)
206  {
207  Node *w = x->m_parent->m_right;
208  if(!w->m_b)
209  {
210  w->m_b = true;
211  x->m_parent->m_b = false;
212  rotateLeft(x->m_parent);
213  w = x->m_parent->m_right;
214  }
215 
216  if(w->m_left->m_b && w->m_right->m_b)
217  {
218  w->m_b = false;
219  x = x->m_parent;
220  }
221  else
222  {
223  if(w->m_right->m_b)
224  {
225  w->m_left->m_b = true;
226  w->m_b = false;
227  rotateRight(w);
228  w = x->m_parent->m_right;
229  }
230 
231  w->m_b = x->m_parent->m_b;
232  x->m_parent->m_b = true;
233  w->m_right->m_b = true;
234  rotateLeft(x->m_parent);
235  x = m_root;
236  }
237  }
238  else
239  {
240  Node *w = x->m_parent->m_left;
241  if(!w->m_b)
242  {
243  w->m_b = true;
244  x->m_parent->m_b = false;
245  rotateRight(x->m_parent);
246  w = x->m_parent->m_left;
247  }
248 
249  if(w->m_right->m_b && w->m_left->m_b)
250  {
251  w->m_b = false;
252  x = x->m_parent;
253  }
254  else
255  {
256  if(w->m_left->m_b)
257  {
258  w->m_right->m_b = true;
259  w->m_b = false;
260  rotateLeft(w);
261  w = x->m_parent->m_left;
262  }
263 
264  w->m_b = x->m_parent->m_b;
265  x->m_parent->m_b = true;
266  w->m_left->m_b = true;
267  rotateRight(x->m_parent);
268  x = m_root;
269  }
270  }
271  }
272 
273  x->m_b = true;
274  }
275 
276  void deleteNode(Node *z) noexcept
277  {
278  Node *y = z;
279  bool yColor = y->m_b;
280  Node *x;
281 
282  if(z->m_left == m_nil)
283  {
284  x = z->m_right;
285  transplant(z, z->m_right);
286  }
287  else if(z->m_right == m_nil)
288  {
289  x = z->m_left;
290  transplant(z, z->m_left);
291  }
292  else
293  {
294  y = minimum(z->m_right);
295  yColor = y->m_b;
296  x = y->m_right;
297 
298  if(y->m_parent == z)
299  {
300  x->m_parent = y;
301  }
302  else
303  {
304  transplant(y, y->m_right);
305  y->m_right = z->m_right;
306  y->m_right->m_parent = y;
307  }
308 
309  transplant(z, y);
310  y->m_left = z->m_left;
311  y->m_left->m_parent = y;
312  y->m_b = z->m_b;
313  }
314  delete z;
315 
316  if(yColor == true)
317  {
318  fixDelete(x);
319  }
320  }
321 
322  void destroy(Node *node) noexcept
323  {
324  if(node != m_nil)
325  {
326  destroy(node->m_left);
327  destroy(node->m_right);
328  delete node;
329  }
330  }
331 
332 public:
334  {
335  Node *x = m_root;
336  while(x != m_nil)
337  {
338  if(key < x->m_key)
339  {
340  x = x->m_left;
341  }
342  else if(x->m_key < key)
343  {
344  x = x->m_right;
345  }
346  else
347  {
348  return x->m_value;
349  }
350  }
351 
352  Node *z = new Node(key, value_type());
353  Node *y = m_nil;
354  x = m_root;
355 
356  while(x != m_nil)
357  {
358  y = x;
359  x = z->m_key < x->m_key ? x->m_left : x->m_right;
360  }
361 
362  z->m_parent = y;
363 
364  if(y == m_nil)
365  {
366  m_root = z;
367  }
368  else if(z->m_key < y->m_key)
369  {
370  y->m_left = z;
371  }
372  else
373  {
374  y->m_right = z;
375  }
376 
377  z->m_left = m_nil;
378  z->m_right = m_nil;
379  fixInsert(z);
380  return z->m_value;
381  }
382 
383  struct iterator
384  {
385  const Node *nil;
386  mutable Node *curr;
387 
388  public:
389  iterator(Node *ptr = nullptr, Node *n = nullptr) noexcept : nil(n), curr(ptr) { }
390  inline bool operator!=(const iterator &other) const noexcept { return curr != other.curr; }
391  inline bool operator==(const iterator &other) const noexcept { return !(*this != other); }
392  inline std::pair<const key_type, value_type>* operator->() const noexcept { return reinterpret_cast<std::pair<const key_type, value_type>*>(&curr->m_key); }
393  inline std::pair<const key_type, value_type>& operator*() const noexcept { return reinterpret_cast<std::pair<const key_type, value_type>&>(curr->m_key); }
394 
395  iterator& operator++() noexcept
396  {
397  if(curr->m_right != nil)
398  {
399  Node *x = curr->m_right;
400  while(x->m_left != nil)
401  {
402  x = x->m_left;
403  }
404  curr = x;
405  }
406  else
407  {
408  Node *y = curr->m_parent;
409  while(y != nil && curr == y->m_right)
410  {
411  curr = y;
412  y = y->m_parent;
413  }
414  curr = y;
415  }
416  return *this;
417  }
418 
419  iterator operator++(int) noexcept
420  {
421  iterator v = *this;
422  ++(*this);
423  return v;
424  }
425  };
426 
427  inline iterator begin() noexcept
428  {
429  Node *x = m_root;
430  while(x->m_left != m_nil)
431  {
432  x = x->m_left;
433  }
434  return iterator(x, m_nil);
435  }
436 
437  inline iterator end() const noexcept
438  {
439  return iterator(m_nil, m_nil);
440  }
441 
443  {
444  m_nil = new Node(key_type(), value_type());
445  m_nil->m_b = true;
446  m_nil->m_left = m_nil->m_right = m_nil->m_parent = m_nil;
447  m_root = m_nil;
448  }
449 
451  {
452  destroy(m_root);
453  delete m_nil;
454  }
455 
456  void insert(const key_type &key, const value_type &value) noexcept
457  {
458  Node *z = new Node(key, value);
459  Node *y = m_nil;
460  Node *x = m_root;
461 
462  while(x != m_nil)
463  {
464  y = x;
465  x = z->m_key < x->m_key ? x->m_left : x->m_right;
466  }
467 
468  z->m_parent = y;
469 
470  if(y == m_nil)
471  {
472  m_root = z;
473  }
474  else if(z->m_key < y->m_key)
475  {
476  y->m_left = z;
477  }
478  else
479  {
480  y->m_right = z;
481  }
482 
483  z->m_left = m_nil;
484  z->m_right = m_nil;
485  fixInsert(z);
486  }
487 
488  inline void remove(const key_type &key) noexcept
489  {
490  Node *z = find(key);
491  if(z != nullptr)
492  {
493  deleteNode(z);
494  }
495  }
496 
497  inline Node *find(const key_type &key) const noexcept
498  {
499  Node *x = m_root;
500  while(x != m_nil)
501  {
502  if(key < x->m_key)
503  {
504  x = x->m_left;
505  }
506  else if(x->m_key < key)
507  {
508  x = x->m_right;
509  }
510  else
511  {
512  return x;
513  }
514  }
515  return nullptr;
516  }
517 
518  inline bool empty() const noexcept { return m_root == m_nil; }
519  inline void clear() noexcept
520  {
521  destroy(m_root);
522  m_root = m_nil;
523  }
524  // Add to RedBlackTree public section:
525  inline Node *minimum(Node *x) const noexcept
526  {
527  while(x->m_left != m_nil)
528  {
529  x = x->m_left;
530  }
531  return x;
532  }
533 };
534 
535 
536 //Splay Tree
537 template <typename _Key, typename _Value>
539 {
540 public:
541  using key_type = _Key;
542  using value_type = _Value;
543  using reference = _Value&;
544  using const_reference = const _Value&;
545 
546 private:
547  struct Node
548  {
554 
555  Node(const key_type &k, const value_type &v) noexcept
556  : m_key(k),
557  m_value(v),
558  m_left(nullptr),
559  m_right(nullptr),
560  m_parent(nullptr)
561  {
562 
563  }
564 
565  Node(const key_type &k, value_type &&v) noexcept
566  : m_key(k),
567  m_value(std::move(v)),
568  m_left(nullptr),
569  m_right(nullptr),
570  m_parent(nullptr)
571  {
572 
573  }
574  };
575 
577 
578  inline void rotateLeft(Node *x) noexcept
579  {
580  Node *y = x->m_right;
581  x->m_right = y->m_left;
582 
583  if(y->m_left)
584  {
585  y->m_left->m_parent = x;
586  }
587  y->m_parent = x->m_parent;
588 
589  if(x->m_parent)
590  {
591  m_root = y;
592  }
593  else if(x == x->m_parent->m_left)
594  {
595  x->m_parent->m_left = y;
596  }
597  else
598  {
599  x->m_parent->m_right = y;
600  }
601 
602  y->m_left = x;
603  x->m_parent = y;
604  }
605 
606  inline void rotateRight(Node *x) noexcept
607  {
608  Node *y = x->m_left;
609  x->m_left = y->m_right;
610 
611  if(y->m_right)
612  {
613  y->m_right->m_parent = x;
614  }
615  y->m_parent = x->m_parent;
616 
617  if(x->m_parent)
618  {
619  m_root = y;
620  }
621  else if(x == x->m_parent->m_left)
622  {
623  x->m_parent->m_left = y;
624  }
625  else
626  {
627  x->m_parent->m_right = y;
628  }
629 
630  y->m_right = x;
631  x->m_parent = y;
632  }
633 
634  void splay(Node *x)
635  {
636  while(x->m_parent)
637  {
638  if(!x->m_parent->m_parent)
639  {
640  if(x == x->m_parent->m_left)
641  {
642  rotateRight(x->m_parent);
643  }
644  else
645  {
646  rotateLeft(x->m_parent);
647  }
648  }
649  else if(x == x->m_parent->m_left && x->m_parent == x->m_parent->m_parent->m_left)
650  {
651  rotateRight(x->m_parent->m_parent);
652  rotateRight(x->m_parent);
653  }
654  else if(x == x->m_parent->m_right && x->m_parent == x->m_parent->m_parent->m_right)
655  {
656  rotateLeft(x->m_parent->m_parent);
657  rotateLeft(x->m_parent);
658  }
659  else if(x == x->m_parent->m_right && x->m_parent == x->m_parent->m_parent->m_left)
660  {
661  rotateLeft(x->m_parent);
662  rotateRight(x->m_parent);
663  }
664  else
665  {
666  rotateRight(x->m_parent);
667  rotateLeft(x->m_parent);
668  }
669  }
670  }
671 
672  void destroy(Node *node) noexcept
673  {
674  if(node)
675  {
676  destroy(node->m_left);
677  destroy(node->m_right);
678  delete node;
679  }
680  }
681 
682 public:
684  : m_root(nullptr)
685  {
686 
687  }
688 
690  {
691  destroy(m_root);
692  }
693 
694  void insert(const key_type &key, const value_type &value)
695  {
696  Node *z = new Node(key, value);
697  Node *x = m_root;
698  Node *y = nullptr;
699 
700  while(x)
701  {
702  y = x;
703  if(key < x->m_key)
704  {
705  x = x->m_left;
706  }
707  else if(key > x->m_key)
708  {
709  x = x->m_right;
710  }
711  else
712  {
713  x->m_value = value;
714  splay(x);
715  delete z;
716  return;
717  }
718  }
719 
720  z->m_parent = y;
721 
722  if(!y)
723  {
724  m_root = z;
725  }
726  else if(key < y->m_key)
727  {
728  y->m_left = z;
729  }
730  else
731  {
732  y->m_right = z;
733  }
734 
735  splay(z);
736  }
737 
738  inline value_type* find(const key_type &key)
739  {
740  Node *x = m_root;
741  while(x)
742  {
743  if(key < x->m_key)
744  {
745  x = x->m_left;
746  }
747  else if(key > x->m_key)
748  {
749  x = x->m_right;
750  }
751  else
752  {
753  splay(x);
754  return &x->m_value;
755  }
756  }
757  return nullptr;
758  }
759 
760  void remove(const key_type &key)
761  {
762  Node *x = m_root;
763  while(x)
764  {
765  if(key < x->m_key)
766  {
767  x = x->m_left;
768  }
769  else if(key > x->m_key)
770  {
771  x = x->m_right;
772  }
773  else
774  {
775  break;
776  }
777  }
778 
779  if(!x)
780  {
781  return;
782  }
783 
784  splay(x);
785 
786  Node *l = x->m_left;
787  if(l)
788  {
789  l->m_parent = nullptr;
790  }
791 
792  Node *r = x->m_right;
793  if(r)
794  {
795  r->m_parent = nullptr;
796  }
797 
798  delete x;
799 
800  if(!l)
801  {
802  m_root = r;
803  }
804  else
805  {
806  while(l->m_right)
807  {
808  l = l->m_right;
809  }
810 
811  splay(l);
812  l->m_right = r;
813 
814  if(r)
815  {
816  r->m_parent = l;
817  }
818  m_root = l;
819  }
820  }
821 
822  //Similar to RedBlackTree's operator[]
824  {
825  Node *x = m_root;
826  while(x)
827  {
828  if(key < x->m_key)
829  {
830  x = x->m_left;
831  }
832  else if(x->m_key < key)
833  {
834  x = x->m_right;
835  }
836  else
837  {
838  splay(x); //Splay finds the node to the root
839  return x->m_value;
840  }
841  }
842  //Not found, insert new node
843  Node *z = new Node(key, value_type());
844  Node *y = nullptr;
845  x = m_root;
846 
847  while(x)
848  {
849  y = x;
850  x = key < x->m_key ? x->m_left : x->m_right;
851  }
852 
853  z->m_parent = y;
854 
855  if(!y)
856  {
857  m_root = z;
858  }
859  else if(key < y->m_key)
860  {
861  y->m_left = z;
862  }
863  else
864  {
865  y->m_right = z;
866  }
867 
868  splay(z); //Splay new node to root
869  return z->m_value;
870  }
871 
872  // Iterator implementation
873  template<typename A, typename B>
874  struct iterator
875  {
877  iterator(Node *ptr = nullptr): m_curr(ptr) { }
878  bool operator!=(const iterator& other) const { return m_curr != other.m_curr; }
879  bool operator==(const iterator& other) const { return m_curr == other.m_curr; }
880  std::pair<const A, B>* operator->() const { return reinterpret_cast<std::pair<const A, B>*>(&m_curr->m_key); }
881 
883  {
884  if(m_curr->m_right)
885  {
886  m_curr = m_curr->m_right;
887  while(m_curr->m_left)
888  {
889  m_curr = m_curr->m_left;
890  }
891  }
892  else
893  {
894  Node *y = m_curr->m_parent;
895  while(y && m_curr == y->m_right)
896  {
897  m_curr = y;
898  y = y->m_parent;
899  }
900  m_curr = y;
901  }
902  return *this;
903  }
904  };
905 
907  {
908  Node *x = m_root;
909  if(!x)
910  {
911  return iterator<key_type, value_type>(nullptr);
912  }
913 
914  while(x->m_left)
915  {
916  x = x->m_left;
917  }
919  }
920 
922  {
923  return iterator<key_type, value_type>(nullptr);
924  }
925 
926  inline bool empty() const { return m_root == nullptr; }
927  inline void clear() noexcept
928  {
929  destroy(m_root);
930  m_root = nullptr;
931  }
932 };
933 
934 #endif // TTKTREE_H
_Value value_type
Definition: ttktree.h:33
void insert(const key_type &key, const value_type &value)
Definition: ttktree.h:694
void insert(const key_type &key, const value_type &value) noexcept
Definition: ttktree.h:456
#define TTK_MODULE_EXPORT
iterator operator++(int) noexcept
Definition: ttktree.h:419
iterator(Node *ptr=nullptr)
Definition: ttktree.h:877
bool operator==(const iterator &other) const
Definition: ttktree.h:879
bool operator==(const iterator &other) const noexcept
Definition: ttktree.h:391
_Value & reference
Definition: ttktree.h:34
void destroy(Node *node) noexcept
Definition: ttktree.h:672
Node * m_root
Definition: ttktree.h:70
void rotateRight(Node *x) noexcept
Definition: ttktree.h:101
void splay(Node *x)
Definition: ttktree.h:634
~TTKSplayTree()
Definition: ttktree.h:689
void clear() noexcept
Definition: ttktree.h:519
reference operator[](const key_type &key)
Definition: ttktree.h:333
value_type m_value
Definition: ttktree.h:41
Node(const key_type &k, const value_type &v) noexcept
Definition: ttktree.h:47
Definition: ttkcompat.h:39
std::pair< const A, B > * operator->() const
Definition: ttktree.h:880
bool operator!=(const iterator &other) const
Definition: ttktree.h:878
value_type m_value
Definition: ttktree.h:550
void destroy(Node *node) noexcept
Definition: ttktree.h:322
void fixInsert(Node *z) noexcept
Definition: ttktree.h:129
void clear() noexcept
Definition: ttktree.h:927
std::pair< const key_type, value_type > * operator->() const noexcept
Definition: ttktree.h:392
Node(const key_type &k, value_type &&v) noexcept
Definition: ttktree.h:58
iterator & operator++()
Definition: ttktree.h:882
Node * m_nil
Definition: ttktree.h:71
void fixDelete(Node *x) noexcept
Definition: ttktree.h:201
const _Value & const_reference
Definition: ttktree.h:544
void rotateLeft(Node *x) noexcept
Definition: ttktree.h:578
static constexpr wchar_t key[]
void deleteNode(Node *z) noexcept
Definition: ttktree.h:276
iterator< key_type, value_type > end()
Definition: ttktree.h:921
value_type * find(const key_type &key)
Definition: ttktree.h:738
_Key key_type
Definition: ttktree.h:541
_Value value_type
Definition: ttktree.h:542
Node * m_root
Definition: ttktree.h:576
iterator(Node *ptr=nullptr, Node *n=nullptr) noexcept
Definition: ttktree.h:389
bool empty() const noexcept
Definition: ttktree.h:518
Node(const key_type &k, const value_type &v) noexcept
Definition: ttktree.h:555
iterator< key_type, value_type > begin()
Definition: ttktree.h:906
_Key key_type
Definition: ttktree.h:32
std::pair< const key_type, value_type > & operator*() const noexcept
Definition: ttktree.h:393
bool operator!=(const iterator &other) const noexcept
Definition: ttktree.h:390
TTKSplayTree()
Definition: ttktree.h:683
Node(const key_type &k, value_type &&v) noexcept
Definition: ttktree.h:565
reference operator[](const key_type &key)
Definition: ttktree.h:823
const _Value & const_reference
Definition: ttktree.h:35
iterator & operator++() noexcept
Definition: ttktree.h:395
void rotateLeft(Node *x) noexcept
Definition: ttktree.h:73
iterator end() const noexcept
Definition: ttktree.h:437
The class of the tree modules.
Definition: ttktree.h:29
Node * find(const key_type &key) const noexcept
Definition: ttktree.h:497
key_type m_key
Definition: ttktree.h:549
#define const
Definition: zconf.h:233
void transplant(Node *u, Node *v) noexcept
Definition: ttktree.h:184
bool empty() const
Definition: ttktree.h:926
Node * minimum(Node *x) const noexcept
Definition: ttktree.h:525
_Value & reference
Definition: ttktree.h:543
iterator begin() noexcept
Definition: ttktree.h:427
void rotateRight(Node *x) noexcept
Definition: ttktree.h:606