blob: f4fe8fc13708731463b5623da123cdfba6232235 [file] [log] [blame]
Benny Prijono4766ffe2005-11-01 17:56:59 +00001/* $Id$
Benny Prijonof010e692005-11-11 19:01:31 +00002 */
3#ifndef __PJPP_TREE_HPP__
4#define __PJPP_TREE_HPP__
5
6#include <pj/rbtree.h>
7
8//
9// Tree.
10//
11class PJ_Tree
12{
13public:
14 typedef pj_rbtree_comp Comp;
15 class iterator;
16 class reverse_iterator;
17
18 class Node : private pj_rbtree_node
19 {
20 friend class PJ_Tree;
21 friend class iterator;
22 friend class reverse_iterator;
23
24 public:
25 Node() {}
26 explicit Node(void *data) { user_data = data; }
27 void set_user_data(void *data) { user_data = data; }
28 void *get_user_data() const { return user_data; }
29 };
30
31 class iterator
32 {
33 public:
34 iterator() {}
35 iterator(const iterator &rhs) : tr_(rhs.tr_), nd_(rhs.nd_) {}
36 iterator(pj_rbtree *tr, pj_rbtree_node *nd) : tr_(tr), nd_(nd) {}
37 Node *operator*() { return (Node*)nd_; }
38 bool operator==(const iterator &rhs) const { return tr_==rhs.tr_ && nd_==rhs.nd_; }
39 iterator &operator=(const iterator &rhs) { tr_=rhs.tr_; nd_=rhs.nd_; return *this; }
40 void operator++() { nd_=pj_rbtree_next(tr_, nd_); }
41 void operator--() { nd_=pj_rbtree_prev(tr_, nd_); }
42 protected:
43 pj_rbtree *tr_;
44 pj_rbtree_node *nd_;
45 };
46
47 class reverse_iterator : public iterator
48 {
49 public:
50 reverse_iterator() {}
51 reverse_iterator(const reverse_iterator &it) : iterator(it) {}
52 reverse_iterator(pj_rbtree *t, pj_rbtree_node *n) : iterator(t, n) {}
53 reverse_iterator &operator=(const reverse_iterator &rhs) { iterator::operator=(rhs); return *this; }
54 Node *operator*() { return (Node*)nd_; }
55 bool operator==(const reverse_iterator &rhs) const { return iterator::operator==(rhs); }
56 void operator++() { nd_=pj_rbtree_prev(tr_, nd_); }
57 void operator--() { nd_=pj_rbtree_next(tr_, nd_); }
58 };
59
60 explicit PJ_Tree(Comp *comp) { pj_rbtree_init(&t_, comp); }
61
62 iterator begin()
63 {
64 return iterator(&t_, pj_rbtree_first(&t_));
65 }
66
67 iterator end()
68 {
69 return iterator(&t_, NULL);
70 }
71
72 reverse_iterator rbegin()
73 {
74 return reverse_iterator(&t_, pj_rbtree_last(&t_));
75 }
76
77 reverse_iterator rend()
78 {
79 return reverse_iterator(&t_, NULL);
80 }
81
82 bool insert(Node *node)
83 {
84 return pj_rbtree_insert(&t_, node)==0 ? true : false;
85 }
86
87 Node *find(const void *key)
88 {
89 return (Node*)pj_rbtree_find(&t_, key);
90 }
91
92 Node *erase(Node *node)
93 {
94 return (Node*)pj_rbtree_erase(&t_, node);
95 }
96
97 unsigned max_height(Node *node=NULL)
98 {
99 return pj_rbtree_max_height(&t_, node);
100 }
101
102 unsigned min_height(Node *node=NULL)
103 {
104 return pj_rbtree_min_height(&t_, node);
105 }
106
107private:
108 pj_rbtree t_;
109};
110
111#endif /* __PJPP_TREE_HPP__ */
112