class Object
Constants
- OJ_LOADED
Public Instance Methods
bit_set?(addr, i)
click to toggle source
# File lib/sqreen/trie.rb, line 198 def bit_set?(addr, i) addr[max_num_bits - i - 1] == 1 end
node_to_ip_addr(node)
click to toggle source
# File lib/sqreen/trie.rb, line 191 def node_to_ip_addr(node) ret = IPAddr.new(node.prefix.address, node.prefix.family) ret.send(:mask!, node.prefix.bitlen) ret.singleton_class.send(:define_method, :data) { node.prefix.data } ret end
search_best(addr, family)
click to toggle source
# File lib/sqreen/trie.rb, line 172 def search_best(addr, family) nodes = search_common(addr, family) for i in (nodes.size - 1).downto(0) xcur = nodes[i] return node_to_ip_addr(xcur) if xcur.prefix.matches?(addr, family) end nil end
search_common(addr, family)
click to toggle source
# File lib/sqreen/trie.rb, line 202 def search_common(addr, family) raise 'family mismatch' unless family == self.family xstack = [] xcur = head while !xcur.nil? unless xcur.empty? xstack << xcur end xcur = bit_set?(addr, xcur.bit) ? xcur.r : xcur.l end xstack end
search_matching(addr, family)
click to toggle source
# File lib/sqreen/trie.rb, line 182 def search_matching(addr, family) nodes = search_common(addr, family) nodes.select { |xcur| xcur.prefix.matches?(addr, family) } .map { |xcur| node_to_ip_addr(xcur) } .reverse end
to_dot(header = true)
click to toggle source
generate pdf with `dot -Tpdf <input> > foo.pdf`
# File lib/sqreen/trie.rb, line 144 def to_dot(header = true) res = '' res = "graph trie {\n" if header next_name = 'a' obj_label_map = Hash.new do |h, k| h[k] = next_name next_name = next_name.next h[k] end head.walk(max_num_bits, true) do |node| node_name = obj_label_map[node.object_id] if node.empty? label = "<glue at bit #{node.bit}>" else ip_addr = IPAddr.new(node.prefix.address, node.prefix.family) label = ip_addr.to_s + '/' + node.prefix.bitlen.to_s end res += "#{node_name} [label=\"#{label}\"]\n" res += "#{node_name} -- #{obj_label_map[node.l.object_id]} [label=\"l\"]\n" if node.l res += "#{node_name} -- #{obj_label_map[node.r.object_id]} [label=\"r\"]\n" if node.r end res += "}\n" if header res end