9 #ifndef __libutilxx__sella__container__radix_tree_H__
10 #define __libutilxx__sella__container__radix_tree_H__
18 #include "radix_tree_it.h"
19 #include "radix_tree_node.h"
21 #include "ContainerException.h"
26 K radix_substr(
const K &key,
int begin,
int num);
29 inline std::string radix_substr<std::string>(
const std::string &key,
int begin,
int num) {
30 return key.substr(begin, num);
34 K radix_join(
const K &key1,
const K &key2);
37 inline std::string radix_join<std::string>(
const std::string &key1,
const std::string &key2) {
42 int radix_length(
const K &key);
45 inline int radix_length<std::string>(
const std::string &key) {
49 template <
typename K,
typename T>
53 typedef T mapped_type;
54 typedef std::pair<const K, T> value_type;
56 typedef std::size_t size_type;
60 if (m_root != NULL)
delete m_root;
63 size_type size()
const {
79 std::pair<iterator, bool> insert(
const value_type &val);
80 bool erase(
const K &key);
82 void prefix_match(
const K &key, std::vector<iterator> &vec);
83 void greedy_match(
const K &key, std::vector<iterator> &vec);
84 iterator longest_match(
const K &key);
86 bool contains(
const K &key) {
87 return (find(key) != end());
90 T& operator[] (
const K &lhs);
91 T& at(
const K &lhs)
throw (ContainerException);
104 template <
typename K,
typename T>
112 K key_sub1, key_sub2;
114 node = find_node(key, m_root, 0);
117 node = node->m_parent;
119 int len = radix_length(key) - node->m_depth;
120 key_sub1 = radix_substr(key, node->m_depth, len);
121 key_sub2 = radix_substr(node->m_key, 0, len);
123 if (key_sub1 != key_sub2)
126 greedy_match(node, vec);
129 template <
typename K,
typename T>
130 typename radix_tree<K, T>::iterator radix_tree<K, T>::longest_match(
const K &key) {
132 return iterator(NULL);
134 radix_tree_node<K, T> *node;
137 node = find_node(key, m_root, 0);
140 return iterator(node);
142 key_sub = radix_substr(key, node->m_depth, radix_length(node->m_key));
144 if (! (key_sub == node->m_key))
145 node = node->m_parent;
147 K nul = radix_substr(key, 0, 0);
149 while (node != NULL) {
150 typename radix_tree_node<K, T>::it_child it;
151 it = node->m_children.find(nul);
152 if (it != node->m_children.end() && it->second->m_is_leaf)
153 return iterator(it->second);
155 node = node->m_parent;
158 return iterator(NULL);
161 template <
typename K,
typename T>
162 typename radix_tree<K, T>::iterator radix_tree<K, T>::end() {
163 return iterator(NULL);
166 template <
typename K,
typename T>
167 typename radix_tree<K, T>::iterator radix_tree<K, T>::begin() {
168 radix_tree_node<K, T> *node;
173 node = begin(m_root);
175 return iterator(node);
178 template <
typename K,
typename T>
179 radix_tree_node<K, T>* radix_tree<K, T>::begin(radix_tree_node<K, T> *node) {
183 assert(!node->m_children.empty());
185 return begin(node->m_children.begin()->second);
188 template <
typename K,
typename T>
189 T& radix_tree<K, T>::operator[] (
const K &lhs) {
190 iterator it = find(lhs);
196 std::pair<iterator, bool> ret;
199 assert(ret.second ==
true);
207 template <
typename K,
typename T>
208 T& radix_tree<K, T>::at(
const K &lhs)
throw (ContainerException) {
209 iterator it = find(lhs);
212 THROW(ContainerException,
"index is out of range");
218 template <
typename K,
typename T>
219 void radix_tree<K, T>::greedy_match(
const K &key, std::vector<iterator> &vec) {
220 radix_tree_node<K, T> *node;
227 node = find_node(key, m_root, 0);
230 node = node->m_parent;
232 greedy_match(node, vec);
235 template <
typename K,
typename T>
236 void radix_tree<K, T>::greedy_match(radix_tree_node<K, T> *node, std::vector<iterator> &vec) {
237 if (node->m_is_leaf) {
238 vec.push_back(iterator(node));
242 typename std::map<K, radix_tree_node<K, T>*>::iterator it;
244 for (it = node->m_children.begin(); it != node->m_children.end(); ++it) {
245 greedy_match(it->second, vec);
249 template <
typename K,
typename T>
250 void radix_tree<K, T>::erase(iterator it) {
254 template <
typename K,
typename T>
255 bool radix_tree<K, T>::erase(
const K &key) {
259 radix_tree_node<K, T> *child;
260 radix_tree_node<K, T> *parent;
261 radix_tree_node<K, T> *grandparent;
262 K nul = radix_substr(key, 0, 0);
264 child = find_node(key, m_root, 0);
266 if (! child->m_is_leaf)
269 parent = child->m_parent;
270 parent->m_children.erase(nul);
276 if (parent == m_root)
279 if (parent->m_children.size() > 1)
282 if (parent->m_children.empty()) {
283 grandparent = parent->m_parent;
284 grandparent->m_children.erase(parent->m_key);
287 grandparent = parent;
290 if (grandparent == m_root) {
294 if (grandparent->m_children.size() == 1) {
296 typename std::map<K, radix_tree_node<K, T>*>::iterator it;
297 it = grandparent->m_children.begin();
299 radix_tree_node<K, T> *uncle = it->second;
301 if (uncle->m_is_leaf)
304 uncle->m_depth = grandparent->m_depth;
305 uncle->m_key = radix_join(grandparent->m_key, uncle->m_key);
306 uncle->m_parent = grandparent->m_parent;
308 grandparent->m_children.erase(it);
310 grandparent->m_parent->m_children.erase(grandparent->m_key);
311 grandparent->m_parent->m_children[uncle->m_key] = uncle;
319 template <
typename K,
typename T>
320 radix_tree_node<K, T>* radix_tree<K, T>::append(radix_tree_node<K, T> *parent,
const value_type &val) {
323 K nul = radix_substr(val.first, 0, 0);
324 radix_tree_node<K, T> *node_c, *node_cc;
326 depth = parent->m_depth + radix_length(parent->m_key);
327 len = radix_length(val.first) - depth;
330 node_c =
new radix_tree_node<K, T>(val);
332 node_c->m_depth = depth;
333 node_c->m_parent = parent;
335 node_c->m_is_leaf =
true;
337 parent->m_children[nul] = node_c;
341 node_c =
new radix_tree_node<K, T>(val);
343 K key_sub = radix_substr(val.first, depth, len);
345 parent->m_children[key_sub] = node_c;
347 node_c->m_depth = depth;
348 node_c->m_parent = parent;
349 node_c->m_key = key_sub;
352 node_cc =
new radix_tree_node<K, T>(val);
353 node_c->m_children[nul] = node_cc;
355 node_cc->m_depth = depth + len;
356 node_cc->m_parent = node_c;
357 node_cc->m_key = nul;
358 node_cc->m_is_leaf =
true;
364 template <
typename K,
typename T>
365 radix_tree_node<K, T>* radix_tree<K, T>::prepend(radix_tree_node<K, T> *node,
const value_type &val) {
369 len1 = radix_length(node->m_key);
370 len2 = radix_length(val.first) - node->m_depth;
372 for (count = 0; count < len1 && count < len2; count++) {
373 if (! (node->m_key[count] == val.first[count + node->m_depth]) )
379 node->m_parent->m_children.erase(node->m_key);
381 radix_tree_node<K, T> *node_a =
new radix_tree_node<K, T>;
383 node_a->m_parent = node->m_parent;
384 node_a->m_key = radix_substr(node->m_key, 0, count);
385 node_a->m_depth = node->m_depth;
386 node_a->m_parent->m_children[node_a->m_key] = node_a;
389 node->m_depth += count;
390 node->m_parent = node_a;
391 node->m_key = radix_substr(node->m_key, count, len1 - count);
392 node->m_parent->m_children[node->m_key] = node;
394 K nul = radix_substr(val.first, 0, 0);
396 radix_tree_node<K, T> *node_b;
398 node_b =
new radix_tree_node<K, T>(val);
400 node_b->m_parent = node_a;
402 node_b->m_depth = node_a->m_depth + count;
403 node_b->m_is_leaf =
true;
404 node_b->m_parent->m_children[nul] = node_b;
408 radix_tree_node<K, T> *node_b, *node_c;
410 node_b =
new radix_tree_node<K, T>;
412 node_b->m_parent = node_a;
413 node_b->m_depth = node->m_depth;
414 node_b->m_key = radix_substr(val.first, node_b->m_depth, len2 - count);
415 node_b->m_parent->m_children[node_b->m_key] = node_b;
417 node_c =
new radix_tree_node<K, T>(val);
419 node_c->m_parent = node_b;
420 node_c->m_depth = radix_length(val.first);
422 node_c->m_is_leaf =
true;
423 node_c->m_parent->m_children[nul] = node_c;
429 template <
typename K,
typename T>
430 std::pair<typename radix_tree<K, T>::iterator,
bool> radix_tree<K, T>::insert(
const value_type &val) {
431 if (m_root == NULL) {
432 K nul = radix_substr(val.first, 0, 0);
434 m_root =
new radix_tree_node<K, T>;
439 radix_tree_node<K, T> *node = find_node(val.first, m_root, 0);
441 if (node->m_is_leaf) {
442 return std::pair<iterator, bool>(node,
false);
443 }
else if (node == m_root) {
445 return std::pair<iterator, bool>(append(m_root, val),
true);
448 int len = radix_length(node->m_key);
449 K key_sub = radix_substr(val.first, node->m_depth, len);
451 if (key_sub == node->m_key) {
452 return std::pair<iterator, bool>(append(node, val),
true);
454 return std::pair<iterator, bool>(prepend(node, val),
true);
459 template <
typename K,
typename T>
460 typename radix_tree<K, T>::iterator radix_tree<K, T>::find(
const K &key) {
462 return iterator(NULL);
464 radix_tree_node<K, T> *node = find_node(key, m_root, 0);
467 if (! node->m_is_leaf)
468 return iterator(NULL);
470 return iterator(node);
473 template <
typename K,
typename T>
474 radix_tree_node<K, T>* radix_tree<K, T>::find_node(
const K &key, radix_tree_node<K, T> *node,
int depth) {
477 if (node->m_children.empty())
480 typename radix_tree_node<K, T>::it_child it;
481 int len_key = radix_length(key) - depth;
483 for (it = node->m_children.begin(); it != node->m_children.end(); ++it) {
485 if (it->second->m_is_leaf)
491 if (! it->second->m_is_leaf && key[depth] == it->first[0] ) {
492 int len_node = radix_length(it->first);
493 K key_sub = radix_substr(key, depth, len_node);
495 if (key_sub == it->first) {