Fixed put and remove for bimaps

master
Robinson 2023-08-05 19:39:19 -06:00
parent a1a4cfb88f
commit 8536dbd0b3
No known key found for this signature in database
GPG Key ID: 8E7DB78588BD6F5C
2 changed files with 15 additions and 10 deletions

View File

@ -168,12 +168,14 @@ class LockFreeIntBiMap<V: Any> : MutableMap<Int, V>, Cloneable, Serializable {
override fun put(key: Int, value: V): V? {
val prevForwardValue = forwardHashMap.put(key, value)
if (prevForwardValue != null) {
reverseHashMap.remove(prevForwardValue, defaultReturnValue)
reverseHashMap.remove(prevForwardValue)
}
val prevReverseValue = reverseHashMap[value, defaultReturnValue]!!
val prevReverseValue = reverseHashMap[value, defaultReturnValue]
reverseHashMap.put(value, key)
if (prevReverseValue != defaultReturnValue) {
// WHOOPS!
// put the old value back
if (prevForwardValue != null) {
forwardHashMap.put(key, prevForwardValue)
@ -181,6 +183,7 @@ class LockFreeIntBiMap<V: Any> : MutableMap<Int, V>, Cloneable, Serializable {
else {
forwardHashMap.remove(key)
}
reverseHashMap.put(value, prevReverseValue)
throw StateException("Value already exists. Keys and values must both be unique!")
@ -277,7 +280,7 @@ class LockFreeIntBiMap<V: Any> : MutableMap<Int, V>, Cloneable, Serializable {
override fun remove(key: Int): V? {
val value = forwardHashMap.remove(key)
if (value != null) {
reverseHashMap.remove(value, defaultReturnValue)
reverseHashMap.remove(value)
}
return value
}

View File

@ -165,23 +165,25 @@ class LockFreeObjectIntBiMap<K: Any> : MutableMap<K, Int>, Cloneable, Serializab
* unmodified in this event. To avoid this exception, call [.putForce] putForce(K, V) instead.
*/
@Synchronized
@Throws(IllegalArgumentException::class)
override fun put(key: K, value: Int): Int {
val prevForwardValue = forwardHashMap[key, defaultReturnValue]!!
forwardHashMap.put(key, value)
if (prevForwardValue != defaultReturnValue) {
@Throws(StateException::class)
override fun put(key: K, value: Int): Int? {
val prevForwardValue = forwardHashMap.put(key, value)
if (prevForwardValue != null) {
reverseHashMap.remove(prevForwardValue)
}
val prevReverseValue = reverseHashMap.put(value, key)
if (prevReverseValue != null) {
// WHOOPS!!
// put the old value back
if (prevForwardValue != defaultReturnValue) {
if (prevForwardValue != null) {
forwardHashMap.put(key, prevForwardValue)
}
else {
forwardHashMap.remove(key, defaultReturnValue)
forwardHashMap.remove(key)
}
reverseHashMap.put(value, prevReverseValue)
throw StateException("Value already exists. Keys and values must both be unique!")