pike.git / lib / modules / ADT.pmod / Trie.pike

version» Context lines:

pike.git/lib/modules/ADT.pmod/Trie.pike:10:   int offset;   mixed value = UNDEFINED;   string|array(int) path = ({});   mapping(int:this_program) trie;      protected array(int) index;      protected void create(string|array(int)|void key, int|void offset)   {    path = key || ({}); -  this_program::offset = offset || sizeof(path); -  path = path[..this_program::offset-1]; +  this::offset = offset || sizeof(path); +  path = path[..this::offset-1];   }      protected void low_merge(int key, this_program o)   {    if (!trie) {    trie = ([ key : o ]);    return;    }    this_program old = trie[key];    if (!old) {
pike.git/lib/modules/ADT.pmod/Trie.pike:72:    low_merge(key, o);    }   }      void merge(this_program o)   {    if (o->offset < offset) {    error("Problem!\n");    }    if (o->offset == offset) { -  if (!zero_type(o->value)) { +  if (!undefinedp(o->value)) {    value = o->value;    }    merge_trie(o->trie);    } else {    low_merge(o->path[offset], o);    }   }      void insert(string|array(int) key, mixed val)   {    this_program o; -  if (zero_type(val)) return; +  if (undefinedp(val)) return;    if (sizeof(key) == offset) {    value = val;    } else if (!trie) {    trie = ([ key[offset]: (o = ADT.Trie(key)) ]);    o->value = val;    } else if (!(o = trie[key[offset]])) {    trie[key[offset]] = o = ADT.Trie(key);    o->value = val;    index = 0; // Invalidated.    } else {
pike.git/lib/modules/ADT.pmod/Trie.pike:139:    } else {    if (o->offset > sizeof(key)) {    return UNDEFINED;    }    int i;    for (i = offset+1; i < o->offset; i++) {    if (key[i] != o->path[i]) {    return UNDEFINED;    }    } -  if (!zero_type(val = o->remove(key))) { -  if (zero_type(o->value)) { +  if (!undefinedp(val = o->remove(key))) { +  if (undefinedp(o->value)) {    if (!o->trie) {    m_delete(trie, key[offset]);    index = 0; // Invalidated.    if (!sizeof(trie)) trie = 0;    } else if (sizeof(o->trie) == 1) {    // Get rid of intermediate level.    trie[key[offset]] = values(o->trie)[0];    }    }    }
pike.git/lib/modules/ADT.pmod/Trie.pike:182:    if (!index) {    index = sort(indices(trie));    }   }      string|array(int) first()   {    if (!trie) return UNDEFINED;    update_index();    this_program o = trie[index[0]]; -  if (zero_type(o->value)) return o->first(); +  if (undefinedp(o->value)) return o->first();    return o->path;   }      string|array(int) next(string|array(int) base)   {    if (!trie) return UNDEFINED;    if (sizeof(base) <= offset) {    return first();    }    this_program o = trie[base[offset]];    if (o) {    for (int i = offset+1; i < o->offset; i++) {    if ((i >= sizeof(base)) || (o->path[i] > base[i])) {    // o is a suffix to base, or is larger. -  if (zero_type(o->value)) return o->first(); +  if (undefinedp(o->value)) return o->first();    return o->path;    } else if (o->path[i] < base[i]) break;    }    string|array(int) res = o->next(base);    if (res) return res;    }    update_index();    for (int i = 0; i < sizeof(index); i++) {    if (index[i] > base[offset]) {    o = trie[index[i]]; -  if (zero_type(o->value)) return o->first(); +  if (undefinedp(o->value)) return o->first();    return o->path;    }    }    return UNDEFINED;   }      protected string render_path()   {    if (arrayp(path)) {    return sprintf("({%s})",    map(path, lambda(int val) {    return sprintf("%O", val);    }) * ", ");    }    return sprintf("%O", path);   }      protected string _sprintf(int c, mapping|void attrs)   { -  + #ifdef ADT_TRIE_DEBUG    if (c == 'O') {    string res = sprintf("ADT.Trie(%s, ([", render_path());    if (trie) {    res += "\n";    foreach(trie || ([]); int key; this_program o) {    res += sprintf(" %O: %O,\n", key, o);    }    } -  if (zero_type(value)) { +  if (undefinedp(value)) {    return res + "]))";    } else {    return res + sprintf("]): %O)", value);    } -  } else { +  } + #endif    return sprintf("ADT.Trie(%s)", render_path());   } - } +