5 #ifndef HOBBES_UTIL_TRIE_HPP_INCLUDED 6 #define HOBBES_UTIL_TRIE_HPP_INCLUDED 13 template <
typename K,
typename V,
typename KMap>
15 typedef typename KMap::template map<prefix_tree_node<K, V, KMap>*>::type
SubkeyMap;
19 for (
typename SubkeyMap::const_iterator c = this->
children.begin(); c != this->
children.end(); ++c) {
27 void values(std::vector<V>* vs)
const {
28 if (
const V* v = get<V>(this->value)) {
32 for (
typename SubkeyMap::const_iterator c = this->children.begin(); c != this->children.end(); ++c) {
33 c->second->values(vs);
38 template <
typename K,
typename V,
typename KMap>
44 template <
typename KIter>
46 node_t*
r = this->root;
47 for (KIter i = begin; i !=
end; ++i) {
57 template <
typename KIter>
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);
78 template <
typename KIter>
80 makeNode(begin, end)->value = v;
83 template <
typename KIter>
85 node_t* n = (node_t*)findNode(begin, end);
86 return n ? get<V>(n->
value) : 0;
89 void insert(
const std::vector<K>& k,
const V& v) {
90 insert(k.begin(), k.end(), v);
93 V*
lookup(
const std::vector<K>& k)
const {
94 return lookup(k.begin(), k.end());
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;
119 void keysAt(KeySeq* ks, point_t base)
const {
120 const node_t* n = (node_t*)base;
122 for (
typename node_t::SubkeyMap::const_iterator c = n->
children.begin(); c != n->
children.end(); ++c) {
123 ks->push_back(c->first);
136 const node_t* n = (node_t*)base;
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));
144 return get<V>(((node_t*)base)->value);
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
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
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
~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