delete_marker_from_path(marker, level, terminus)
click to toggle source
def delete_marker_from_path(marker, level, terminus)
cur_node = self
until cur_node == terminus
cur_node.forward_markers[level].delete(marker)
cur_node.markers.delete(marker)
cur_node = cur_node.forward[level]
end
end
demote_inbound_markers(path)
click to toggle source
def demote_inbound_markers(path)
demoted = []
new_demoted = []
top_level.downto(0) do |i|
incoming_markers = path[i].forward_markers[i].dup
incoming_markers.each do |marker|
unless forward_node_with_marker_at_or_above_level?(marker, i)
path[i].forward_markers[i].delete(marker)
new_demoted.push(marker)
end
end
demoted.each do |marker|
path[i + 1].place_marker_on_inbound_path(marker, i, path[i])
if forward[i].markers.include?(marker)
path[i].forward_markers[i].push(marker)
else
new_demoted.push(marker)
end
end
demoted = new_demoted
new_demoted = []
end
end
demote_markers(path)
click to toggle source
def demote_markers(path)
demote_inbound_markers(path)
demote_outbound_markers(path)
end
demote_outbound_markers(path)
click to toggle source
def demote_outbound_markers(path)
demoted = []
new_demoted = []
top_level.downto(0) do |i|
forward_markers[i].each do |marker|
new_demoted.push(marker) unless path[i].forward_markers[i].include?(marker)
end
demoted.each do |marker|
forward[i].place_marker_on_outbound_path(marker, i, forward[i + 1])
new_demoted.push(marker) unless path[i].forward_markers[i].include?(marker)
end
demoted = new_demoted
new_demoted = []
end
end
forward_node_with_marker_at_or_above_level?(marker, level)
click to toggle source
def forward_node_with_marker_at_or_above_level?(marker, level)
level.upto(top_level) do |i|
return true if forward[i].markers.include?(marker)
end
false
end
place_marker_on_inbound_path(marker, level, terminus)
click to toggle source
def place_marker_on_inbound_path(marker, level, terminus)
cur_node = self
until cur_node == terminus
cur_node.forward_markers[level].push(marker)
cur_node = cur_node.forward[level]
cur_node.markers.push(marker)
end
end
place_marker_on_outbound_path(marker, level, terminus)
click to toggle source
def place_marker_on_outbound_path(marker, level, terminus)
cur_node = self
until cur_node == terminus
cur_node.forward_markers[level].push(marker)
cur_node.markers.push(marker)
cur_node = cur_node.forward[level]
end
end
update_forward_pointers(path)
click to toggle source
def update_forward_pointers(path)
0.upto(top_level) do |i|
forward[i] = path[i].forward[i]
path[i].forward[i] = self
end
end