| Class | Irc::NetmaskDb::Tree |
| In: |
lib/rbot/maskdb.rb
|
| Parent: | Object |
| chi | [R] | |
| pre | [R] |
# File lib/rbot/maskdb.rb, line 7
7: def initialize(pre = '', chi = Hash.new)
8: @pre = pre
9: @chi = chi
10: end
# File lib/rbot/maskdb.rb, line 12
12: def add(val, *prefs)
13: str = prefs.shift or raise 'empty prefs'
14: @pre = str.dup if @chi.empty?
15:
16: n = 0
17: @pre.size.times do
18: break if @pre[n] != str[n]
19: n += 1
20: end
21:
22: rest = str.slice(n .. -1)
23:
24: if n != @pre.size
25: prest = @pre.slice!(n .. -1)
26: pc = prest.slice! 0
27: @chi = {pc => Tree.new(prest, @chi)}
28: end
29:
30: c = rest.slice!(0)
31:
32: if c
33: (@chi[c] ||= Tree.new).add(val, rest, *prefs)
34: else
35: if prefs.empty?
36: (@chi[''] ||= Array.new).push val
37: else
38: (@chi[''] ||= Tree.new).add(val, *prefs)
39: end
40: end
41: end
# File lib/rbot/maskdb.rb, line 71
71: def find(*prefs)
72: str = prefs.shift or raise 'empty prefs?'
73: self.find_helper(str, *prefs) + self.find_helper(str.reverse, *prefs)
74: end
# File lib/rbot/maskdb.rb, line 47
47: def remove(*prefs, &block)
48: str = prefs.shift or raise 'empty prefs?'
49: return nil unless @pre.empty? or str.index(@pre) == 0
50: c = str.slice(@pre.size) || ''
51: return nil unless @chi.include? c
52: if c == ''
53: if prefs.empty?
54: @chi[c].reject!(&block)
55: else
56: @chi[c].remove(*prefs, &block)
57: end
58: else
59: @chi[c].remove(str.slice((@pre.size + 1) .. -1), *prefs, &block)
60: end
61: @chi.delete(c) if @chi[c].empty?
62:
63: if @chi.size == 1
64: k = @chi.keys.shift
65: return nil if k == ''
66: @pre << k << @chi[k].pre
67: @chi = @chi[k].chi
68: end
69: end
# File lib/rbot/maskdb.rb, line 77
77: def find_helper(*prefs)
78: str = prefs.shift or raise 'empty prefs?'
79: return [] unless @pre.empty? or str.index(@pre) == 0
80: # puts "#{self.inspect}: #{str} == #{@pre} pfx matched"
81: if !@chi.include? ''
82: matches = []
83: elsif Array === @chi['']
84: matches = @chi['']
85: else
86: matches = @chi[''].find(*prefs)
87: end
88:
89: c = str.slice(@pre.size)
90:
91: more = []
92: if c and @chi.include?(c)
93: more = @chi[c].find_helper(str.slice((@pre.size + 1) .. -1), *prefs)
94: end
95: return more + matches
96: end