use std::cell::Cell;
use std::io::{self, BufRead, Write};
-use std::ptr;
use typed_arena;
let n = line.len();
if n == 0 { break; }
if line[n - 1] == b'\n' { line = &line[0 .. n - 1]; }
-//stdout.write_all(b";; read `")?;
-//stdout.write_all(line)?;
-//stdout.write_all(b"'\n")?;
+ //stdout.write_all(b";; read `")?;
+ //stdout.write_all(line)?;
+ //stdout.write_all(b"'\n")?;
let word: &[u8] = byte_arena.alloc_extend(line.iter().map(|p| *p));
if let MapEntry::Vacant(e) = map.entry(word) {
e.insert(node_arena.alloc(Node { word: word, .. Node::default() }));
let mut max = 0;
for node in map.values() {
-//stdout.write_all(b";; ponder `")?;
-//stdout.write_all(node.word)?;
-//stdout.write_all(b"'\n")?;
+ //stdout.write_all(b";; ponder `")?;
+ //stdout.write_all(node.word)?;
+ //stdout.write_all(b"'\n")?;
let mut node: &Node = node;
let mut parent;
let n = node.word.len();
if n <= 1 { parent = None; }
else { parent = map.get(&node.word[0 .. n - 1]).map(|n| &**n); }
node.up.set(parent);
+ let mut nlen = node.len.get();
while let Some(parent_node) = parent {
- let plen = parent_node.len.get();
- let nlen = node.len.get() + 1;
- if plen > nlen { break; }
- if plen < nlen { parent_node.down.set(None); }
- match parent_node.down.get() {
- Some(link) if ptr::eq(link, node) => (),
- _ => {
- node.right.set(parent_node.down.get());
- parent_node.down.set(Some(node));
- }
+ let plen = parent_node.len.get(); nlen += 1;
+ if plen > nlen
+ { break; }
+ else if plen == nlen {
+ node.right.set(parent_node.down.get());
+ parent_node.down.set(Some(node));
+ break;
+ } else {
+ parent_node.down.set(Some(node));
+ node.right.set(None);
+ parent_node.len.set(nlen);
+ node = parent_node; parent = node.up.get();
}
- parent_node.len.set(nlen);
- if nlen > max { max = nlen; }
- node = parent_node; parent = node.up.get()
}
+ if nlen > max { max = nlen; }
}
for node in map.values() {