Added subFrom (which is the inverse of addTo)

This commit is contained in:
2021-12-25 20:07:37 +01:00
parent 8f32b2d887
commit 7a4a0f05d1
12 changed files with 142 additions and 9 deletions
@@ -341,6 +341,30 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
return getDefaultReturnValue();
}
@Override
public VALUE_TYPE subFrom(KEY_TYPE key, VALUE_TYPE value) {
if(tree == null) return getDefaultReturnValue();
int compare = 0;
Node KEY_VALUE_GENERIC_TYPE parent = tree;
while(true) {
if((compare = compare(key, parent.key)) == 0)
{
VALUE_TYPE oldValue = parent.subFrom(value);
if(value < 0 ? (parent.value >= getDefaultReturnValue()) : (parent.value <= getDefaultReturnValue())) removeNode(parent);
return oldValue;
}
if(compare < 0) {
if(parent.left == null) break;
parent = parent.left;
}
else if(compare > 0) {
if(parent.right == null) break;
parent = parent.right;
}
}
return getDefaultReturnValue();
}
#endif
@Override
public VALUE_TYPE putAndMoveToFirst(KEY_TYPE key, VALUE_TYPE value) { throw new UnsupportedOperationException(); }
@@ -1659,6 +1683,12 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
return map.addTo(key, value);
}
@Override
public VALUE_TYPE subFrom(KEY_TYPE key, VALUE_TYPE value) {
if(!inRange(key)) throw new IllegalArgumentException("key out of range");
return map.subFrom(key, value);
}
#endif
#if TYPE_OBJECT
@Override
@@ -2730,6 +2760,12 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
this.value += value;
return oldValue;
}
VALUE_TYPE subFrom(VALUE_TYPE value) {
VALUE_TYPE oldValue = this.value;
this.value -= value;
return oldValue;
}
#endif
@Override