Class: ConcurrentRedBlackTree::ConcurrentNode
- Inherits:
-
Node
- Object
- Node
- ConcurrentRedBlackTree::ConcurrentNode
show all
- Defined in:
- lib/red_black_tree.rb
Defined Under Namespace
Classes: EmptyConcurrentNode
Constant Summary
collapse
- LEFT =
direction: ~LEFT == RIGHT, ~RIGHT == LEFT
-1
- RIGHT =
0
Instance Method Summary
collapse
Instance Method Details
#delete(key) ⇒ Object
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
|
# File 'lib/red_black_tree.rb', line 599
def delete(key)
case key <=> @key
when -1
dir = LEFT
when 0
deleted = self
node, rebalance = delete_node
when 1
dir = RIGHT
else
raise TypeError, "cannot compare #{key} and #{@key} with <=>"
end
if dir
deleted, target, rebalance = child(dir).delete(key)
node = new_child(dir, target)
if rebalance
node, rebalance = node.rebalance_for_delete(dir)
end
end
[deleted, node, rebalance]
end
|
#insert(key, value) ⇒ Object
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
|
# File 'lib/red_black_tree.rb', line 563
def insert(key, value)
case key <=> @key
when -1
dir = LEFT
when 0
node = new_value(value)
when 1
dir = RIGHT
else
raise TypeError, "cannot compare #{key} and #{@key} with <=>"
end
if dir
target = child(dir).insert(key, value)
node = new_child(dir, target)
if black? and child(~dir).black? and target.red? and !target.children_color?(:BLACK)
node = node.rebalance_for_insert(dir)
end
end
node.pullup_red
end
|
#retrieve(key) ⇒ Object
585
586
587
588
589
590
591
592
593
594
595
596
|
# File 'lib/red_black_tree.rb', line 585
def retrieve(key)
case key <=> @key
when -1
@left.retrieve(key)
when 0
@value
when 1
@right.retrieve(key)
else
nil
end
end
|