return null;
}
- private bool set_to_node (ref Node<K, V>? node, K key, V value, out V old_value, Node<K, V>? prev, Node<K, V>? next) {
+ private bool set_to_node (ref Node<K, V>? node, K key, V value, out V? old_value, Node<K, V>? prev, Node<K, V>? next) {
if (node == null) {
+ old_value = null;
node = new Node<K,V> (key, value, prev, next);
if (prev == null) {
first = node;
bool changed;
if (cmp == 0) {
if (value_equal_func (value, node.value)) {
+ old_value = null;
changed = false;
} else {
old_value = (owned) node.value;
private void fix_removal (ref Node<K,V> node, out K? key = null, out V? value) {
Node<K,V> n = (owned) node;
- if (&key != null)
- key = (owned) n.key;
- else
- n.key = null;
- if (&value != null)
- value = (owned) n.value;
+ key = (owned) n.key;
+ value = (owned) n.value;
if (n.prev != null) {
n.prev.next = n.next;
} else {
fix_up (ref node);
}
- private bool remove_from_node (ref Node<K, V>? node, K key, out V value, out unowned Node<K, V>? prev = null, out unowned Node<K, V>? next = null) {
+ private bool remove_from_node (ref Node<K, V>? node, K key, out V? value, out unowned Node<K, V>? prev = null, out unowned Node<K, V>? next = null) {
if (node == null) {
+ value = null;
+ next = null;
+ prev = null;
return false;
} else if (key_compare_func (key, node.key) < 0) {
weak Node<K,V> left = node.left;
if (left == null) {
+ value = null;
+ next = null;
+ prev = null;
return false;
}
if (node.left != null && is_black (left) && is_black (left.left)) {
weak Node<K,V>? r = node.right;
if (key_compare_func (key, node.key) == 0 && r == null) {
- if (&prev != null)
- prev = node.prev;
- if (&next != null)
- next = node.next;
+ prev = node.prev;
+ next = node.next;
fix_removal (ref node, null, out value);
return true;
}
}
if (key_compare_func (key, node.key) == 0) {
value = (owned) node.value;
- if (&prev != null)
- prev = node.prev;
- if (&next != null)
- next = node;
+ prev = node.prev;
+ next = node;
remove_minimal (ref node.right, out node.key, out node.value);
fix_up (ref node);
return true;
* {@inheritDoc}
*/
public override bool unset (K key, out V? value = null) {
- V node_value;
- bool b = remove_from_node (ref root, key, out node_value);
-
- if (&value != null) {
- value = (owned) node_value;
- }
+ bool b = remove_from_node (ref root, key, out value);
if (root != null) {
root.color = Node.Color.BLACK;
}
public override bool unset (K key, out V? value = null) {
+ value = null;
return range.in_range (key) && map.unset (key, out value);
}
private inline void fix_removal (ref Node<G> node, out G? key = null) {
Node<G> n = (owned)node;
- if (&key != null)
- key = (owned) n.key;
- else
- n.key = null;
+ key = (owned) n.key;
if (n.prev != null) {
n.prev.next = n.next;
} else {
stdout.printf ("Removing %s from %s\n", (string)item, node != null ? (string)node.key : null);
#endif
if (node == null) {
+ prev = null;
+ next = null;
return false;
} else if (compare_func (item, node.key) < 0) {
weak Node<G> left = node.left;
if (left == null) {
+ prev = null;
+ next = null;
return false;
}
if (is_black (left) && is_black (left.left)) {
weak Node<G>? r = node.right;
if (compare_func (item, node.key) == 0 && r == null) {
- if (&prev != null)
- prev = node.prev;
- if (&next != null)
- next = node.next;
+ prev = node.prev;
+ next = node.next;
fix_removal (ref node, null);
return true;
}
move_red_right (ref node);
}
if (compare_func (item, node.key) == 0) {
- if (&prev != null)
- prev = node.prev;
- if (&next != null)
- next = node;
+ prev = node.prev;
+ next = node;
remove_minimal (ref node.right, out node.key);
fix_up (ref node);
return true;