* {@inheritDoc}
*/
public override bool unset (K key, out V? value = null) {
- Node<K,V>** node = lookup_node (key);
- if (*node != null) {
- Node<K,V> next = (owned) (*node)->next;
-
- value = (owned) (*node)->value;
-
- (*node)->key = null;
- (*node)->value = null;
- delete *node;
-
- *node = (owned) next;
-
- _nnodes--;
- resize ();
- _stamp++;
- return true;
- } else {
- value = null;
+ bool b = unset_helper (key, out value);
+ if(b) {
+ resize();
}
- return false;
+ return b;
}
/**
return new MapIterator<K,V> (this);
}
- private void resize () {
+ private inline bool unset_helper (K key, out V? value = null) {
+ Node<K,V>** node = lookup_node (key);
+ if (*node != null) {
+ Node<K,V> next = (owned) (*node)->next;
+
+ value = (owned) (*node)->value;
+
+ (*node)->key = null;
+ (*node)->value = null;
+ delete *node;
+
+ *node = (owned) next;
+
+ _nnodes--;
+ _stamp++;
+ return true;
+ } else {
+ value = null;
+ }
+ return false;
+ }
+
+ private inline void resize () {
if ((_array_size >= 3 * _nnodes && _array_size >= MIN_SIZE) ||
(3 * _array_size <= _nnodes && _array_size < MAX_SIZE)) {
int new_array_size = (int) SpacedPrimes.closest (_nnodes);
assert (_stamp == _map._stamp);
assert (_node != null);
has_next ();
- _map.unset (_node.key);
+ _map.unset_helper (_node.key);
_node = null;
_stamp = _map._stamp;
}
* {@inheritDoc}
*/
public override bool remove (G key) {
- Node<G>** node = lookup_node (key);
- if (*node != null) {
- assert (*node != null);
- Node<G> next = (owned) (*node)->next;
-
- (*node)->key = null;
- delete *node;
-
- *node = (owned) next;
-
- _nnodes--;
+ bool b = remove_helper(key);
+ if(b) {
resize ();
- _stamp++;
- return true;
}
- return false;
+ return b;
}
/**
resize ();
}
+ private inline bool remove_helper (G key) {
+ Node<G>** node = lookup_node (key);
+ if (*node != null) {
+ assert (*node != null);
+ Node<G> next = (owned) (*node)->next;
+
+ (*node)->key = null;
+ delete *node;
+
+ *node = (owned) next;
+
+ _nnodes--;
+ _stamp++;
+ return true;
+ }
+ return false;
+ }
+
private void resize () {
if ((_array_size >= 3 * _nnodes && _array_size >= MIN_SIZE) ||
(3 * _array_size <= _nnodes && _array_size < MAX_SIZE)) {
assert (_stamp == _set._stamp);
assert (_node != null);
has_next ();
- _set.remove (_node.key);
+ _set.remove_helper (_node.key);
_node = null;
_stamp = _set._stamp;
}