hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
trie.H
Go to the documentation of this file.
1 /********
2  * trie : a basic prefix-tree data structure
3  *******/
4 
5 #ifndef HOBBES_UTIL_TRIE_HPP_INCLUDED
6 #define HOBBES_UTIL_TRIE_HPP_INCLUDED
7 
8 #include <vector>
9 #include <hobbes/util/variant.H>
10 
11 namespace hobbes {
12 
13 template <typename K, typename V, typename KMap>
15  typedef typename KMap::template map<prefix_tree_node<K, V, KMap>*>::type SubkeyMap;
17 
19  for (typename SubkeyMap::const_iterator c = this->children.begin(); c != this->children.end(); ++c) {
20  delete c->second;
21  }
22  }
23 
24  SubkeyMap children;
25  MaybeV value;
26 
27  void values(std::vector<V>* vs) const {
28  if (const V* v = get<V>(this->value)) {
29  vs->push_back(*v);
30  }
31 
32  for (typename SubkeyMap::const_iterator c = this->children.begin(); c != this->children.end(); ++c) {
33  c->second->values(vs);
34  }
35  }
36  };
37 
38 template <typename K, typename V, typename KMap>
39  class prefix_tree {
40  private:
42  node_t* root;
43 
44  template <typename KIter>
45  node_t* makeNode(KIter begin, KIter end) {
46  node_t* r = this->root;
47  for (KIter i = begin; i != end; ++i) {
48  node_t*& nr = r->children[*i];
49  if (!nr) {
50  nr = new node_t;
51  }
52  r = nr;
53  }
54  return r;
55  }
56 
57  template <typename KIter>
58  const node_t* findNode(KIter begin, KIter end) const {
59  const node_t* r = this->root;
60  for (KIter i = begin; i != end; ++i) {
61  typename node_t::SubkeyMap::const_iterator c = r->children.find(*i);
62  if (c == r->children.end()) {
63  return 0;
64  } else {
65  r = c->second;
66  }
67  }
68  return r;
69  }
70  public:
71  prefix_tree() : root(new node_t) {
72  }
73 
75  delete this->root;
76  }
77 
78  template <typename KIter>
79  void insert(KIter begin, KIter end, const V& v) {
80  makeNode(begin, end)->value = v;
81  }
82 
83  template <typename KIter>
84  V* lookup(KIter begin, KIter end) const {
85  node_t* n = (node_t*)findNode(begin, end);
86  return n ? get<V>(n->value) : 0;
87  }
88 
89  void insert(const std::vector<K>& k, const V& v) {
90  insert(k.begin(), k.end(), v);
91  }
92 
93  V* lookup(const std::vector<K>& k) const {
94  return lookup(k.begin(), k.end());
95  }
96 
97  typedef std::vector<V> ValueSeq;
98  void values(ValueSeq* vs) const {
99  this->root->values(vs);
100  }
101 
102  ValueSeq values() const {
103  ValueSeq vs;
104  values(&vs);
105  return vs;
106  }
107 
108  // support incremental search
109  typedef void* point_t;
110  point_t rootPoint() const { return this->root; }
111 
112  point_t moveTo(const K& k, point_t base) const {
113  const node_t* n = (node_t*)base;
114  typename node_t::SubkeyMap::const_iterator c = n->children.find(k);
115  return (c == n->children.end()) ? 0 : c->second;
116  }
117 
118  typedef std::vector<K> KeySeq;
119  void keysAt(KeySeq* ks, point_t base) const {
120  const node_t* n = (node_t*)base;
121 
122  for (typename node_t::SubkeyMap::const_iterator c = n->children.begin(); c != n->children.end(); ++c) {
123  ks->push_back(c->first);
124  }
125  }
126 
127  KeySeq keysAt(point_t base) const {
128  KeySeq r;
129  keysAt(base, &r);
130  return r;
131  }
132 
133  typedef std::pair<K, point_t> KeyPoint;
134  typedef std::vector<KeyPoint> KeyPointSeq;
135  void keyPointsAt(KeyPointSeq* kps, point_t base) const {
136  const node_t* n = (node_t*)base;
137 
138  for (typename node_t::SubkeyMap::const_iterator c = n->children.begin(); c != n->children.end(); ++c) {
139  kps->push_back(KeyPoint(c->first, c->second));
140  }
141  }
142 
143  V* valueAt(point_t base) const {
144  return get<V>(((node_t*)base)->value);
145  }
146  };
147 
148 }
149 
150 #endif
151 
void insert(stateset *o, const stateset &i)
Definition: regex.C:683
void values(ValueSeq *vs) const
Definition: trie.H:98
void keysAt(KeySeq *ks, point_t base) const
Definition: trie.H:119
prefix_tree()
Definition: trie.H:71
Definition: trie.H:14
V * valueAt(point_t base) const
Definition: trie.H:143
~prefix_tree_node()
Definition: trie.H:18
prefix_tree_node< K, V, KMap > node_t
Definition: trie.H:41
Definition: boot.H:7
void insert(const std::vector< K > &k, const V &v)
Definition: trie.H:89
point_t rootPoint() const
Definition: trie.H:110
MaybeV value
Definition: trie.H:25
void keyPointsAt(KeyPointSeq *kps, point_t base) const
Definition: trie.H:135
V * lookup(const std::vector< K > &k) const
Definition: trie.H:93
std::vector< V > ValueSeq
Definition: trie.H:97
void * point_t
Definition: trie.H:109
KMap::template map< prefix_tree_node< K, V, KMap > * >::type SubkeyMap
Definition: trie.H:15
void values(std::vector< V > *vs) const
Definition: trie.H:27
std::pair< K, point_t > KeyPoint
Definition: trie.H:133
variant< unit, V > MaybeV
Definition: trie.H:16
const T * end(const array< T > *d)
Definition: tylift.H:88
const T * begin(const array< T > *d)
Definition: tylift.H:87
size_t r(const reader::MetaData &md, size_t o, T *t)
Definition: storage.H:1730
point_t moveTo(const K &k, point_t base) const
Definition: trie.H:112
const node_t * findNode(KIter begin, KIter end) const
Definition: trie.H:58
node_t * makeNode(KIter begin, KIter end)
Definition: trie.H:45
Definition: trie.H:39
~prefix_tree()
Definition: trie.H:74
SubkeyMap children
Definition: trie.H:24
std::vector< K > KeySeq
Definition: trie.H:118
V * lookup(KIter begin, KIter end) const
Definition: trie.H:84
std::vector< KeyPoint > KeyPointSeq
Definition: trie.H:134
KeySeq keysAt(point_t base) const
Definition: trie.H:127
T lookup(const std::map< K, T > &tenv, const K &n)
Definition: cc.C:518
ValueSeq values() const
Definition: trie.H:102
node_t * root
Definition: trie.H:42
void insert(KIter begin, KIter end, const V &v)
Definition: trie.H:79