Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,13 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
* @since 1.0.0
*/
public {{ key }}2ObjectBucketSyncMap(final SpreadFunction spreadFunction, final int initialCapacity, final float loadFactor) {
requireNonNull(spreadFunction, "spreadFunction");

if(initialCapacity < 0) throw new IllegalArgumentException("Initial capacity must be non-negative");
if(loadFactor <= 0.0F || !Float.isFinite(loadFactor)) {
throw new IllegalArgumentException("Load factor must be positive and finite");
}

final int capacity = initialCapacity >= {{ key }}2ObjectBucketSyncMap.MAXIMUM_CAPACITY
? {{ key }}2ObjectBucketSyncMap.MAXIMUM_CAPACITY
: {{ key }}2ObjectBucketSyncMap.tableSizeFor(initialCapacity);
Expand Down Expand Up @@ -510,16 +517,14 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
@Override
@Deprecated
@SuppressWarnings("deprecation")
public @Nullable V getOrDefault(final Object key, final V defaultValue) {
public @Nullable V getOrDefault(final Object key, final @Nullable V defaultValue) {
requireNonNull(key, "key");

return super.getOrDefault(key, defaultValue);
return this.getOrDefault(({{ keyPrimitive }}) key, defaultValue);
}

@Override
public V getOrDefault(final {{ keyPrimitive }} key, final V defaultValue) {
requireNonNull(defaultValue, "defaultValue");

public @Nullable V getOrDefault(final {{ keyPrimitive }} key, final @Nullable V defaultValue) {
Node@UnknownNullability [] table = this.immutableTable;
int length = table.length;
Node node;
Expand Down Expand Up @@ -897,10 +902,12 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
}
}

if(!this.amended || (mutable = this.mutableTable) == null) return null;

final int index;
if((node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) != null) {
if(!this.amended || (mutable == null && (mutable = this.mutableTable) == null) || (node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) == null) {
return null;
} else if(node.hash == {{ key }}2ObjectBucketSyncMap.NODE_MOVED) {
mutable = this.forward((ForwardingNode) node);
} else {
synchronized(node) {
if({{ key }}2ObjectBucketSyncMap.getNodePlain(mutable, index) == node) {
for(Node previousNode = null; ; ) {
Expand Down Expand Up @@ -1339,7 +1346,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
Object previous;

Node[] immutable;
Node@org.jetbrains.annotations.Nullable [] mutable;
Node@org.jetbrains.annotations.Nullable [] mutable = null;
int length;
Node node;

Expand Down Expand Up @@ -1376,10 +1383,12 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
}
}

if(!this.amended || (mutable = this.mutableTable) == null) return null;

final int index;
if((node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) != null) {
if(!this.amended || (mutable == null && (mutable = this.mutableTable) == null) || (node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) == null) {
return null;
} else if(node.hash == {{ key }}2ObjectBucketSyncMap.NODE_MOVED) {
mutable = this.forward((ForwardingNode) node);
} else {
synchronized(node) {
if({{ key }}2ObjectBucketSyncMap.getNodePlain(mutable, index) == node) {
for(Node previousNode = null; ; ) {
Expand Down Expand Up @@ -1433,7 +1442,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
requireNonNull(value, "value");

Node[] immutable;
Node@org.jetbrains.annotations.Nullable [] mutable;
Node@org.jetbrains.annotations.Nullable [] mutable = null;
int length;
Node node;

Expand Down Expand Up @@ -1471,10 +1480,12 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
}
}

if(!this.amended || (mutable = this.mutableTable) == null) return false;

final int index;
if((node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) != null) {
if(!this.amended || (mutable == null && (mutable = this.mutableTable) == null) || (node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) == null) {
return false;
} else if(node.hash == {{ key }}2ObjectBucketSyncMap.NODE_MOVED) {
mutable = this.forward((ForwardingNode) node);
} else {
synchronized(node) {
if({{ key }}2ObjectBucketSyncMap.getNodePlain(mutable, index) == node) {
for(Node previousNode = null; ; ) {
Expand Down Expand Up @@ -1532,7 +1543,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
Object previous;

Node[] immutable;
Node@org.jetbrains.annotations.Nullable [] mutable;
Node@org.jetbrains.annotations.Nullable [] mutable = null;
int length;
Node node;

Expand Down Expand Up @@ -1569,10 +1580,12 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
}
}

if(!this.amended || (mutable = this.mutableTable) == null) return null;

final int index;
if((node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) != null) {
if(!this.amended || (mutable == null && (mutable = this.mutableTable) == null) || (node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) == null) {
return null;
} else if(node.hash == {{ key }}2ObjectBucketSyncMap.NODE_MOVED) {
mutable = this.forward((ForwardingNode) node);
} else {
synchronized(node) {
if({{ key }}2ObjectBucketSyncMap.getNodePlain(mutable, index) == node) {
for(; ; ) {
Expand Down Expand Up @@ -1620,7 +1633,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
Object previous;

Node[] immutable;
Node@org.jetbrains.annotations.Nullable [] mutable;
Node@org.jetbrains.annotations.Nullable [] mutable = null;
int length;
Node node;

Expand Down Expand Up @@ -1658,10 +1671,12 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
}
}

if(!this.amended || (mutable = this.mutableTable) == null) return false;

final int index;
if((node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) != null) {
if(!this.amended || (mutable == null && (mutable = this.mutableTable) == null) || (node = {{ key }}2ObjectBucketSyncMap.getNode(mutable, index = (mutable.length - 1) & hash)) == null) {
return false;
} else if(node.hash == {{ key }}2ObjectBucketSyncMap.NODE_MOVED) {
mutable = this.forward((ForwardingNode) node);
} else {
synchronized(node) {
if({{ key }}2ObjectBucketSyncMap.getNodePlain(mutable, index) == node) {
for(; ; ) {
Expand Down Expand Up @@ -1733,7 +1748,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
final ObjectReference reference = node.referencePlain();
Object current = reference.get();
for(; ; ) {
if(current == null || current == {{ key }}2ObjectBucketSyncMap.EXPUNGED) continue;
if(current == null || current == {{ key }}2ObjectBucketSyncMap.EXPUNGED) break;

final Object witness = reference.compareAndExchange(current, null);
if(witness != current) {
Expand Down Expand Up @@ -1881,6 +1896,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
if(!this.amended
|| (source = this.mutableTable) == null
|| (length = source.length) <= 0
|| length >= {{ key }}2ObjectBucketSyncMap.MAXIMUM_CAPACITY
|| this.size.sum() < ((long) length * this.loadFactor)) return;

operation = StampLock.operation(state);
Expand Down Expand Up @@ -2451,7 +2467,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa
}

@SuppressWarnings("unchecked")
private <V> V valueOr(final V defaultValue) {
private <V> @Nullable V valueOr(final @Nullable V defaultValue) {
final Object value;
return ((value = ObjectReference.VALUE.getAcquire(this)) != null && value != {{ key }}2ObjectBucketSyncMap.EXPUNGED) ? (V) value : defaultValue;
}
Expand Down Expand Up @@ -2613,7 +2629,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa

@Override
public int hashCode() {
return Objects.hash(this.key, this.value);
return Objects.hashCode(this.key) ^ Objects.hashCode(this.value);
}

@Override
Expand All @@ -2626,7 +2642,7 @@ public class {{ key }}2ObjectBucketSyncMap<V> extends Abstract{{ key }}2ObjectMa

@Override
public String toString() {
return "SyncMap.Entry{key=" + this.key + ", value=" + this.value + "}";
return "{{ key }}2ObjectBucketSyncMap.Entry{key=" + this.key + ", value=" + this.value + "}";
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@ public abstract class {{ key }}2ObjectAbstractMapTest<V> {
@Test
public void test_getOrDefault_nullKey() {
final {{ key }}2ObjectMap<V> map = this.createMap();
assertThrows(NullPointerException.class, () -> map.getOrDefault(this.key(3), null), "Map should throw exception when given a null default value.");
assertThrows(NullPointerException.class, () -> map.getOrDefault(null, this.value(3)), "Map should throw exception when given a null key.");
}

Expand Down