static VALUE walk_all_paths_with_values(Trie *trie, VALUE children, TrieState *state, char *prefix, int prefix_size) { int c; for(c = 1; c < 256; c++) { if(trie_state_is_walkable(state,c)) { TrieState *next_state = trie_state_clone(state); trie_state_walk(next_state, c); prefix[prefix_size] = c; prefix[prefix_size + 1] = 0; if(trie_state_is_terminal(next_state)) { TrieState *end_state = trie_state_clone(next_state); trie_state_walk(end_state, '\0'); char *word = (char*) malloc(prefix_size + 2); memcpy(word, prefix, prefix_size + 2); VALUE tuple = rb_ary_new(); rb_ary_push(tuple, rb_str_new2(word)); TrieData trie_data = trie_state_get_data(end_state); rb_ary_push(tuple, (VALUE)trie_data); rb_ary_push(children, tuple); trie_state_free(end_state); } walk_all_paths_with_values(trie, children, next_state, prefix, prefix_size + 1); prefix[prefix_size] = 0; trie_state_free(next_state); } } }
/* * call-seq: * children(prefix) -> [ key, ... ] * * Finds all keys in the Trie beginning with the given prefix. * */ static VALUE rb_trie_children(VALUE self, VALUE prefix) { if(NIL_P(prefix)) return rb_ary_new(); StringValue(prefix); Trie *trie; Data_Get_Struct(self, Trie, trie); int prefix_size = RSTRING_LEN(prefix); TrieState *state = trie_root(trie); VALUE children = rb_ary_new(); TrieChar *char_prefix = (TrieChar*)RSTRING_PTR(prefix); const TrieChar *iterator = char_prefix; while(*iterator != 0) { if(!trie_state_is_walkable(state, *iterator)) return children; trie_state_walk(state, *iterator); iterator++; } if(trie_state_is_terminal(state)) rb_ary_push(children, prefix); char prefix_buffer[1024]; memcpy(prefix_buffer, char_prefix, prefix_size); prefix_buffer[prefix_size] = 0; walk_all_paths(trie, children, state, prefix_buffer, prefix_size); trie_state_free(state); return children; }
Bool sb_trie_state_is_walkable (const SBTrieState *s, SBChar c) { return trie_state_is_walkable ( s->trie_state, alpha_map_char_to_alphabet (s->sb_trie->alpha_map, (UniChar) c) ); }
static VALUE walk_all_paths(Trie *trie, VALUE children, TrieState *state, char *prefix, int prefix_size) { int c; for(c = 1; c < 256; c++) { if(trie_state_is_walkable(state,c)) { TrieState *next_state = trie_state_clone(state); trie_state_walk(next_state, c); prefix[prefix_size] = c; prefix[prefix_size + 1] = 0; if(trie_state_is_terminal(next_state)) { char *word = (char*) malloc(prefix_size + 2); memcpy(word, prefix, prefix_size + 2); rb_ary_push(children, rb_str_new2(word)); } walk_all_paths(trie, children, next_state, prefix, prefix_size + 1); prefix[prefix_size] = 0; trie_state_free(next_state); } } }
bool ATTrie :: isTerminal(ATTrie::Position pos) { Bool ret = trie_state_is_walkable( (TrieState*)pos, TRIE_CHAR_TERM); return ret == true; }
bool ATTrie :: isWalkable(ATTrie::Position pos, QChar c) { Bool ret = trie_state_is_walkable( (TrieState*)pos, c.unicode()); return ret == true; }