Fixed all the reported issues by the Unit testing.
This commit is contained in:
parent
ef5fdbd377
commit
d2c81e7779
44
build.gradle
44
build.gradle
|
@ -83,6 +83,14 @@ task generateTestSource(type: JavaExec) {
|
|||
args = ['tests', 'silent']
|
||||
}
|
||||
|
||||
task forceGenerateTestSource(type: JavaExec) {
|
||||
group = 'internal'
|
||||
description = 'Builds the sourcecode for the Tests'
|
||||
classpath = sourceSets.builder.runtimeClasspath
|
||||
main = 'speiger.src.builder.PrimitiveCollectionsBuilder'
|
||||
args = ['tests', 'silent', 'force']
|
||||
}
|
||||
|
||||
task generateLimitSource(type: JavaExec) {
|
||||
group = 'internal'
|
||||
description = 'Builds the Sourcecode with the ModuleSettings.json applied'
|
||||
|
@ -121,7 +129,7 @@ task testBooleans(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxHeapSize = maxMemory
|
||||
}
|
||||
|
||||
task testBytes(type: Test) {
|
||||
|
@ -133,8 +141,8 @@ task testBytes(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
task testShorts(type: Test) {
|
||||
|
@ -146,8 +154,8 @@ task testShorts(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
task testChars(type: Test) {
|
||||
|
@ -159,8 +167,8 @@ task testChars(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
task testInts(type: Test) {
|
||||
|
@ -172,8 +180,8 @@ task testInts(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
task testLongs(type: Test) {
|
||||
|
@ -185,8 +193,8 @@ task testLongs(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
task testFloats(type: Test) {
|
||||
|
@ -198,8 +206,8 @@ task testFloats(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
task testDoubles(type: Test) {
|
||||
|
@ -211,8 +219,8 @@ task testDoubles(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
task testObjects(type: Test) {
|
||||
|
@ -224,8 +232,8 @@ task testObjects(type: Test) {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxParallelForks = 2
|
||||
maxHeapSize = maxMemory
|
||||
maxParallelForks = testThreads as Integer
|
||||
}
|
||||
|
||||
if(System.getProperty("full_test_suite", "false").toBoolean()) {
|
||||
|
@ -248,7 +256,7 @@ test {
|
|||
}
|
||||
useJUnit()
|
||||
ignoreFailures = true
|
||||
maxHeapSize = "1024m"
|
||||
maxHeapSize = maxMemory
|
||||
}
|
||||
|
||||
jacocoTestReport {
|
||||
|
|
|
@ -1 +1,4 @@
|
|||
org.gradle.jvmargs=-Xmx3G
|
||||
|
||||
maxMemory = 1024m
|
||||
testThreads = 2
|
|
@ -680,7 +680,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
try {
|
||||
int index = seg.firstIndex;
|
||||
while(index != -1){
|
||||
action.accept(new MapEntry(index, i));
|
||||
action.accept(new ValueMapEntry(index, i));
|
||||
index = (int)seg.links[index];
|
||||
}
|
||||
}
|
||||
|
@ -720,7 +720,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
try {
|
||||
int index = seg.firstIndex;
|
||||
while(index != -1) {
|
||||
action.accept(count++, new MapEntry(index, i));
|
||||
action.accept(count++, new ValueMapEntry(index, i));
|
||||
index = (int)seg.links[index];
|
||||
}
|
||||
}
|
||||
|
@ -739,7 +739,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
try {
|
||||
int index = seg.firstIndex;
|
||||
while(index != -1) {
|
||||
action.accept(input, new MapEntry(index, i));
|
||||
action.accept(input, new ValueMapEntry(index, i));
|
||||
index = (int)seg.links[index];
|
||||
}
|
||||
}
|
||||
|
@ -825,7 +825,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
try {
|
||||
int index = seg.firstIndex;
|
||||
while(index != -1) {
|
||||
state = operator.apply(state, new MapEntry(index, i));
|
||||
state = operator.apply(state, new ValueMapEntry(index, i));
|
||||
index = (int)seg.links[index];
|
||||
}
|
||||
}
|
||||
|
@ -849,11 +849,11 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
while(index != -1) {
|
||||
if(empty) {
|
||||
empty = false;
|
||||
state = new MapEntry(index, i);
|
||||
state = new ValueMapEntry(index, i);
|
||||
index = (int)seg.links[index];
|
||||
continue;
|
||||
}
|
||||
state = operator.apply(state, new MapEntry(index, i));
|
||||
state = operator.apply(state, new ValueMapEntry(index, i));
|
||||
index = (int)seg.links[index];
|
||||
}
|
||||
}
|
||||
|
@ -1547,12 +1547,12 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return entry = new MapEntry(nextEntry(), currentSegment());
|
||||
return entry = new ValueMapEntry(nextEntry(), currentSegment());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE previous() {
|
||||
return entry = new MapEntry(previousEntry(), currentSegment());
|
||||
return entry = new ValueMapEntry(previousEntry(), currentSegment());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1737,6 +1737,33 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
}
|
||||
}
|
||||
|
||||
protected class ValueMapEntry extends MapEntry {
|
||||
protected KEY_TYPE key;
|
||||
protected VALUE_TYPE value;
|
||||
|
||||
public ValueMapEntry(int index, int segmentIndex) {
|
||||
super(index, segmentIndex);
|
||||
key = segments[segmentIndex].keys[index];
|
||||
value = segments[segmentIndex].values[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public KEY_TYPE ENTRY_KEY() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE ENTRY_VALUE() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE setValue(VALUE_TYPE value) {
|
||||
this.value = value;
|
||||
return super.setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
protected class MapEntry implements MAP.Entry KEY_VALUE_GENERIC_TYPE, Map.Entry<CLASS_TYPE, CLASS_VALUE_TYPE> {
|
||||
int index = -1;
|
||||
int segmentIndex = -1;
|
||||
|
@ -1772,7 +1799,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||
long stamp = seg.writeLock();
|
||||
try
|
||||
{
|
||||
VALUE_TYPE oldValue = ENTRY_VALUE();
|
||||
VALUE_TYPE oldValue = seg.values[index];
|
||||
seg.values[index] = value;
|
||||
return oldValue;
|
||||
}
|
||||
|
|
|
@ -680,7 +680,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||
public void forEach(Consumer<? super MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
int index = firstIndex;
|
||||
while(index != -1) {
|
||||
action.accept(new MapEntry(index));
|
||||
action.accept(new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
}
|
||||
|
@ -703,7 +703,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||
int count = 0;
|
||||
int index = firstIndex;
|
||||
while(index != -1) {
|
||||
action.accept(count++, new MapEntry(index));
|
||||
action.accept(count++, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
}
|
||||
|
@ -714,7 +714,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||
if(size() <= 0) return;
|
||||
int index = firstIndex;
|
||||
while(index != -1) {
|
||||
action.accept(input, new MapEntry(index));
|
||||
action.accept(input, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
}
|
||||
|
@ -767,7 +767,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||
E state = identity;
|
||||
int index = firstIndex;
|
||||
while(index != -1) {
|
||||
state = operator.apply(state, new MapEntry(index));
|
||||
state = operator.apply(state, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
return state;
|
||||
|
@ -782,11 +782,11 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||
while(index != -1) {
|
||||
if(empty) {
|
||||
empty = false;
|
||||
state = new MapEntry(index);
|
||||
state = new ValueMapEntry(index);
|
||||
index = (int)links[index];
|
||||
continue;
|
||||
}
|
||||
state = operator.apply(state, new MapEntry(index));
|
||||
state = operator.apply(state, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
return state;
|
||||
|
@ -1312,12 +1312,12 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return entry = new MapEntry(nextEntry());
|
||||
return entry = new ValueMapEntry(nextEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE previous() {
|
||||
return entry = new MapEntry(previousEntry());
|
||||
return entry = new ValueMapEntry(previousEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -878,6 +878,33 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
}
|
||||
}
|
||||
|
||||
protected class ValueMapEntry extends MapEntry {
|
||||
protected KEY_TYPE key;
|
||||
protected VALUE_TYPE value;
|
||||
|
||||
public ValueMapEntry(int index) {
|
||||
super(index);
|
||||
key = keys[index];
|
||||
value = values[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public KEY_TYPE ENTRY_KEY() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE ENTRY_VALUE() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE setValue(VALUE_TYPE value) {
|
||||
this.value = value;
|
||||
return super.setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
protected class MapEntry implements MAP.Entry KEY_VALUE_GENERIC_TYPE, Map.Entry<CLASS_TYPE, CLASS_VALUE_TYPE> {
|
||||
public int index = -1;
|
||||
|
||||
|
@ -912,19 +939,19 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
if(obj instanceof Map.Entry) {
|
||||
if(obj instanceof MAP.Entry) {
|
||||
MAP.Entry KEY_VALUE_GENERIC_TYPE entry = (MAP.Entry KEY_VALUE_GENERIC_TYPE)obj;
|
||||
return KEY_EQUALS(keys[index], entry.ENTRY_KEY()) && VALUE_EQUALS(values[index], entry.ENTRY_VALUE());
|
||||
return KEY_EQUALS(ENTRY_KEY(), entry.ENTRY_KEY()) && VALUE_EQUALS(ENTRY_VALUE(), entry.ENTRY_VALUE());
|
||||
}
|
||||
Map.Entry<?, ?> entry = (Map.Entry<?, ?>)obj;
|
||||
Object key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
#if TYPE_OBJECT && VALUE_OBJECT
|
||||
return KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], value);
|
||||
return KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else if TYPE_OBJECT
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#else if VALUE_OBJECT
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], value);
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
|
@ -932,12 +959,12 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return strategy.hashCode(keys[index]) ^ VALUE_TO_HASH(values[index]);
|
||||
return strategy.hashCode(ENTRY_KEY()) ^ VALUE_TO_HASH(ENTRY_VALUE());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return KEY_TO_STRING(keys[index]) + "=" + VALUE_TO_STRING(values[index]);
|
||||
return KEY_TO_STRING(ENTRY_KEY()) + "=" + VALUE_TO_STRING(ENTRY_VALUE());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -954,9 +981,9 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
|
||||
@Override
|
||||
public void forEach(Consumer<? super MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
if(containsNull) action.accept(new MapEntry(nullIndex));
|
||||
if(containsNull) action.accept(new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1;i>=0;i--)
|
||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(new MapEntry(i));
|
||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(new ValueMapEntry(i));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -978,9 +1005,9 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
public void forEachIndexed(IntObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
Objects.requireNonNull(action);
|
||||
if(size() <= 0) return;
|
||||
if(containsNull) action.accept(0, new MapEntry(nullIndex));
|
||||
if(containsNull) action.accept(0, new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1, index = containsNull ? 1 : 0;i>=0;i--) {
|
||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(index++, new MapEntry(i));
|
||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(index++, new ValueMapEntry(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -988,9 +1015,9 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
public <E> void forEach(E input, ObjectObjectConsumer<E, MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
Objects.requireNonNull(action);
|
||||
if(size() <= 0) return;
|
||||
if(containsNull) action.accept(input, new MapEntry(nullIndex));
|
||||
if(containsNull) action.accept(input, new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1;i>=0;i--) {
|
||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(input, new MapEntry(i));
|
||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(input, new ValueMapEntry(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1052,10 +1079,10 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
public <E> E reduce(E identity, BiFunction<E, MAP.Entry KEY_VALUE_GENERIC_TYPE, E> operator) {
|
||||
Objects.requireNonNull(operator);
|
||||
E state = identity;
|
||||
if(containsNull) state = operator.apply(state, new MapEntry(nullIndex));
|
||||
if(containsNull) state = operator.apply(state, new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1;i>=0;i--) {
|
||||
if(strategy.equals(keys[i], EMPTY_KEY_VALUE)) continue;
|
||||
state = operator.apply(state, new MapEntry(i));
|
||||
state = operator.apply(state, new ValueMapEntry(i));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
@ -1066,17 +1093,17 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||
boolean empty = true;
|
||||
if(containsNull) {
|
||||
state = new MapEntry(nullIndex);
|
||||
state = new ValueMapEntry(nullIndex);
|
||||
empty = false;
|
||||
}
|
||||
for(int i = nullIndex-1;i>=0;i--) {
|
||||
if(strategy.equals(keys[i], EMPTY_KEY_VALUE)) continue;
|
||||
if(empty) {
|
||||
empty = false;
|
||||
state = new MapEntry(i);
|
||||
state = new ValueMapEntry(i);
|
||||
continue;
|
||||
}
|
||||
state = operator.apply(state, new MapEntry(i));
|
||||
state = operator.apply(state, new ValueMapEntry(i));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
@ -1525,7 +1552,7 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||
MapEntry entry;
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return entry = new MapEntry(nextEntry());
|
||||
return entry = new ValueMapEntry(nextEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -684,7 +684,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||
public void forEach(Consumer<? super MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
int index = firstIndex;
|
||||
while(index != -1){
|
||||
action.accept(new MapEntry(index));
|
||||
action.accept(new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
}
|
||||
|
@ -707,7 +707,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||
int count = 0;
|
||||
int index = firstIndex;
|
||||
while(index != -1) {
|
||||
action.accept(count++, new MapEntry(index));
|
||||
action.accept(count++, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
}
|
||||
|
@ -718,7 +718,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||
if(size() <= 0) return;
|
||||
int index = firstIndex;
|
||||
while(index != -1) {
|
||||
action.accept(input, new MapEntry(index));
|
||||
action.accept(input, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
}
|
||||
|
@ -771,7 +771,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||
E state = identity;
|
||||
int index = firstIndex;
|
||||
while(index != -1) {
|
||||
state = operator.apply(state, new MapEntry(index));
|
||||
state = operator.apply(state, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
return state;
|
||||
|
@ -786,11 +786,11 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||
while(index != -1) {
|
||||
if(empty) {
|
||||
empty = false;
|
||||
state = new MapEntry(index);
|
||||
state = new ValueMapEntry(index);
|
||||
index = (int)links[index];
|
||||
continue;
|
||||
}
|
||||
state = operator.apply(state, new MapEntry(index));
|
||||
state = operator.apply(state, new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
return state;
|
||||
|
@ -1312,12 +1312,12 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return entry = new MapEntry(nextEntry());
|
||||
return entry = new ValueMapEntry(nextEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE previous() {
|
||||
return entry = new MapEntry(previousEntry());
|
||||
return entry = new ValueMapEntry(previousEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -837,6 +837,33 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
}
|
||||
}
|
||||
|
||||
protected class ValueMapEntry extends MapEntry {
|
||||
protected KEY_TYPE key;
|
||||
protected VALUE_TYPE value;
|
||||
|
||||
public ValueMapEntry(int index) {
|
||||
super(index);
|
||||
key = keys[index];
|
||||
value = values[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public KEY_TYPE ENTRY_KEY() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE ENTRY_VALUE() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE setValue(VALUE_TYPE value) {
|
||||
this.value = value;
|
||||
return super.setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
protected class MapEntry implements MAP.Entry KEY_VALUE_GENERIC_TYPE, Map.Entry<CLASS_TYPE, CLASS_VALUE_TYPE> {
|
||||
public int index = -1;
|
||||
|
||||
|
@ -871,19 +898,19 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
if(obj instanceof Map.Entry) {
|
||||
if(obj instanceof MAP.Entry) {
|
||||
MAP.Entry KEY_VALUE_GENERIC_TYPE entry = (MAP.Entry KEY_VALUE_GENERIC_TYPE)obj;
|
||||
return KEY_EQUALS(keys[index], entry.ENTRY_KEY()) && VALUE_EQUALS(values[index], entry.ENTRY_VALUE());
|
||||
return KEY_EQUALS(ENTRY_KEY(), entry.ENTRY_KEY()) && VALUE_EQUALS(ENTRY_VALUE(), entry.ENTRY_VALUE());
|
||||
}
|
||||
Map.Entry<?, ?> entry = (Map.Entry<?, ?>)obj;
|
||||
Object key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
#if TYPE_OBJECT && VALUE_OBJECT
|
||||
return KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], value);
|
||||
return KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else if TYPE_OBJECT
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#else if VALUE_OBJECT
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], value);
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
|
@ -891,12 +918,12 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return KEY_TO_HASH(keys[index]) ^ VALUE_TO_HASH(values[index]);
|
||||
return KEY_TO_HASH(ENTRY_KEY()) ^ VALUE_TO_HASH(ENTRY_VALUE());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return KEY_TO_STRING(keys[index]) + "=" + VALUE_TO_STRING(values[index]);
|
||||
return KEY_TO_STRING(ENTRY_KEY()) + "=" + VALUE_TO_STRING(ENTRY_VALUE());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -913,9 +940,9 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
|
||||
@Override
|
||||
public void forEach(Consumer<? super MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
if(containsNull) action.accept(new MapEntry(nullIndex));
|
||||
if(containsNull) action.accept(new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1;i>=0;i--)
|
||||
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(new MapEntry(i));
|
||||
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(new ValueMapEntry(i));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -937,9 +964,9 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
public void forEachIndexed(IntObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
Objects.requireNonNull(action);
|
||||
if(size() <= 0) return;
|
||||
if(containsNull) action.accept(0, new MapEntry(nullIndex));
|
||||
if(containsNull) action.accept(0, new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1, index = containsNull ? 1 : 0;i>=0;i--) {
|
||||
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(index++, new MapEntry(i));
|
||||
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(index++, new ValueMapEntry(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -947,9 +974,9 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
public <E> void forEach(E input, ObjectObjectConsumer<E, MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
Objects.requireNonNull(action);
|
||||
if(size() <= 0) return;
|
||||
if(containsNull) action.accept(input, new MapEntry(nullIndex));
|
||||
if(containsNull) action.accept(input, new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1;i>=0;i--) {
|
||||
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(input, new MapEntry(i));
|
||||
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(input, new ValueMapEntry(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1011,10 +1038,10 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
public <E> E reduce(E identity, BiFunction<E, MAP.Entry KEY_VALUE_GENERIC_TYPE, E> operator) {
|
||||
Objects.requireNonNull(operator);
|
||||
E state = identity;
|
||||
if(containsNull) state = operator.apply(state, new MapEntry(nullIndex));
|
||||
if(containsNull) state = operator.apply(state, new ValueMapEntry(nullIndex));
|
||||
for(int i = nullIndex-1;i>=0;i--) {
|
||||
if(KEY_EQUALS_NULL(keys[i])) continue;
|
||||
state = operator.apply(state, new MapEntry(i));
|
||||
state = operator.apply(state, new ValueMapEntry(i));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
@ -1025,17 +1052,17 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||
boolean empty = true;
|
||||
if(containsNull) {
|
||||
state = new MapEntry(nullIndex);
|
||||
state = new ValueMapEntry(nullIndex);
|
||||
empty = false;
|
||||
}
|
||||
for(int i = nullIndex-1;i>=0;i--) {
|
||||
if(KEY_EQUALS_NULL(keys[i])) continue;
|
||||
if(empty) {
|
||||
empty = false;
|
||||
state = new MapEntry(i);
|
||||
state = new ValueMapEntry(i);
|
||||
continue;
|
||||
}
|
||||
state = operator.apply(state, new MapEntry(i));
|
||||
state = operator.apply(state, new ValueMapEntry(i));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
@ -1480,7 +1507,7 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||
MapEntry entry;
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return entry = new MapEntry(nextEntry());
|
||||
return entry = new ValueMapEntry(nextEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -876,7 +876,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
public void forEach(Consumer<? super MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
Objects.requireNonNull(action);
|
||||
for(int i = 0;i<size;i++)
|
||||
action.accept(new MapEntry(i));
|
||||
action.accept(new ValueMapEntry(i));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -894,7 +894,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
public void forEachIndexed(IntObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
Objects.requireNonNull(action);
|
||||
for(int i = 0;i<size;i++) {
|
||||
action.accept(i, new MapEntry(i));
|
||||
action.accept(i, new ValueMapEntry(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -902,7 +902,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
public <E> void forEach(E input, ObjectObjectConsumer<E, MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
Objects.requireNonNull(action);
|
||||
for(int i = 0;i<size;i++) {
|
||||
action.accept(input, new MapEntry(i));
|
||||
action.accept(input, new ValueMapEntry(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -947,7 +947,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
Objects.requireNonNull(operator);
|
||||
E state = identity;
|
||||
for(int i = 0;i<size;i++) {
|
||||
state = operator.apply(state, new MapEntry(i));
|
||||
state = operator.apply(state, new ValueMapEntry(i));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
@ -960,10 +960,10 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
for(int i = 0;i<size;i++) {
|
||||
if(empty) {
|
||||
empty = false;
|
||||
state = new MapEntry(i);
|
||||
state = new ValueMapEntry(i);
|
||||
continue;
|
||||
}
|
||||
state = operator.apply(state, new MapEntry(i));
|
||||
state = operator.apply(state, new ValueMapEntry(i));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
@ -1364,12 +1364,12 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return entry = new MapEntry(nextEntry());
|
||||
return entry = new ValueMapEntry(nextEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE previous() {
|
||||
return entry = new MapEntry(previousEntry());
|
||||
return entry = new ValueMapEntry(previousEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1485,6 +1485,33 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
}
|
||||
}
|
||||
|
||||
protected class ValueMapEntry extends MapEntry {
|
||||
protected KEY_TYPE key;
|
||||
protected VALUE_TYPE value;
|
||||
|
||||
public ValueMapEntry(int index) {
|
||||
super(index);
|
||||
key = keys[index];
|
||||
value = values[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public KEY_TYPE ENTRY_KEY() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE ENTRY_VALUE() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE setValue(VALUE_TYPE value) {
|
||||
this.value = value;
|
||||
return super.setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
private class MapEntry implements MAP.Entry KEY_VALUE_GENERIC_TYPE, Map.Entry<CLASS_TYPE, CLASS_VALUE_TYPE> {
|
||||
int index = -1;
|
||||
|
||||
|
@ -1519,19 +1546,19 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
if(obj instanceof Map.Entry) {
|
||||
if(obj instanceof MAP.Entry) {
|
||||
MAP.Entry KEY_VALUE_GENERIC_TYPE entry = (MAP.Entry KEY_VALUE_GENERIC_TYPE)obj;
|
||||
return KEY_EQUALS(keys[index], entry.ENTRY_KEY()) && VALUE_EQUALS(values[index], entry.ENTRY_VALUE());
|
||||
return KEY_EQUALS(keys[index], entry.ENTRY_KEY()) && VALUE_EQUALS(ENTRY_VALUE(), entry.ENTRY_VALUE());
|
||||
}
|
||||
Map.Entry<?, ?> entry = (Map.Entry<?, ?>)obj;
|
||||
Object key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
#if TYPE_OBJECT && VALUE_OBJECT
|
||||
return KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], value);
|
||||
return KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else if TYPE_OBJECT
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#else if VALUE_OBJECT
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], value);
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
|
@ -1539,12 +1566,12 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return KEY_TO_HASH(keys[index]) ^ VALUE_TO_HASH(values[index]);
|
||||
return KEY_TO_HASH(ENTRY_KEY()) ^ VALUE_TO_HASH(ENTRY_VALUE());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return KEY_TO_STRING(keys[index]) + "=" + VALUE_TO_STRING(values[index]);
|
||||
return KEY_TO_STRING(ENTRY_KEY()) + "=" + VALUE_TO_STRING(ENTRY_VALUE());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -636,7 +636,7 @@ public class ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE
|
|||
public void forEach(Consumer<? super MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
if(size() <= 0) return;
|
||||
for(int i = 0,m=keys.length;i<m;i++) {
|
||||
if(isSet(i)) action.accept(new BasicEntryKV_BRACES(keys[i], values[i]));
|
||||
if(isSet(i)) action.accept(new ValueMapEntry(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -719,7 +719,7 @@ public class ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE
|
|||
class EntryIterator extends MapIterator implements ObjectIterator<MAP.Entry KEY_VALUE_GENERIC_TYPE> {
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return new MapEntry(nextEntry());
|
||||
return new ValueMapEntry(nextEntry());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -766,6 +766,33 @@ public class ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE
|
|||
}
|
||||
}
|
||||
|
||||
protected class ValueMapEntry extends MapEntry {
|
||||
protected KEY_TYPE key;
|
||||
protected VALUE_TYPE value;
|
||||
|
||||
public ValueMapEntry(int index) {
|
||||
super(index);
|
||||
key = keys[index];
|
||||
value = values[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public KEY_TYPE ENTRY_KEY() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE ENTRY_VALUE() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE setValue(VALUE_TYPE value) {
|
||||
this.value = value;
|
||||
return super.setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
protected class MapEntry implements MAP.Entry KEY_VALUE_GENERIC_TYPE, Map.Entry<CLASS_TYPE, CLASS_VALUE_TYPE> {
|
||||
public int index = -1;
|
||||
|
||||
|
@ -800,19 +827,19 @@ public class ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE
|
|||
if(obj instanceof Map.Entry) {
|
||||
if(obj instanceof MAP.Entry) {
|
||||
MAP.Entry KEY_VALUE_GENERIC_TYPE entry = (MAP.Entry KEY_VALUE_GENERIC_TYPE)obj;
|
||||
return KEY_EQUALS(keys[index], entry.ENTRY_KEY()) && VALUE_EQUALS(values[index], entry.ENTRY_VALUE());
|
||||
return KEY_EQUALS(ENTRY_KEY(), entry.ENTRY_KEY()) && VALUE_EQUALS(ENTRY_VALUE(), entry.ENTRY_VALUE());
|
||||
}
|
||||
Map.Entry<?, ?> entry = (Map.Entry<?, ?>)obj;
|
||||
Object key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
#if TYPE_OBJECT && VALUE_OBJECT
|
||||
return KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], value);
|
||||
return KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else if TYPE_OBJECT
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#else if VALUE_OBJECT
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], value);
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
|
@ -820,12 +847,12 @@ public class ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return KEY_TO_HASH(keys[index]) ^ VALUE_TO_HASH(values[index]);
|
||||
return KEY_TO_HASH(ENTRY_KEY()) ^ VALUE_TO_HASH(ENTRY_VALUE());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return KEY_TO_STRING(keys[index]) + "=" + VALUE_TO_STRING(values[index]);
|
||||
return KEY_TO_STRING(ENTRY_KEY()) + "=" + VALUE_TO_STRING(ENTRY_VALUE());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -480,7 +480,7 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
|
|||
public void forEach(Consumer<? super MAP.Entry KEY_VALUE_GENERIC_TYPE> action) {
|
||||
int index = firstIndex;
|
||||
while(index != -1){
|
||||
action.accept(new MapEntry(index));
|
||||
action.accept(new ValueMapEntry(index));
|
||||
index = (int)links[index];
|
||||
}
|
||||
}
|
||||
|
@ -749,12 +749,12 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
|
|||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE next() {
|
||||
return entry = new MapEntry(nextEntry());
|
||||
return entry = new ValueMapEntry(nextEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE previous() {
|
||||
return entry = new MapEntry(previousEntry());
|
||||
return entry = new ValueMapEntry(previousEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -903,6 +903,33 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
|
|||
}
|
||||
}
|
||||
|
||||
protected class ValueMapEntry extends MapEntry {
|
||||
protected KEY_TYPE key;
|
||||
protected VALUE_TYPE value;
|
||||
|
||||
public ValueMapEntry(int index) {
|
||||
super(index);
|
||||
key = keys[index];
|
||||
value = values[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public KEY_TYPE ENTRY_KEY() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE ENTRY_VALUE() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VALUE_TYPE setValue(VALUE_TYPE value) {
|
||||
this.value = value;
|
||||
return super.setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
protected class MapEntry implements MAP.Entry KEY_VALUE_GENERIC_TYPE, Map.Entry<CLASS_TYPE, CLASS_VALUE_TYPE> {
|
||||
public int index = -1;
|
||||
|
||||
|
@ -937,19 +964,19 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
|
|||
if(obj instanceof Map.Entry) {
|
||||
if(obj instanceof MAP.Entry) {
|
||||
MAP.Entry KEY_VALUE_GENERIC_TYPE entry = (MAP.Entry KEY_VALUE_GENERIC_TYPE)obj;
|
||||
return KEY_EQUALS(keys[index], entry.ENTRY_KEY()) && VALUE_EQUALS(values[index], entry.ENTRY_VALUE());
|
||||
return KEY_EQUALS(ENTRY_KEY(), entry.ENTRY_KEY()) && VALUE_EQUALS(ENTRY_VALUE(), entry.ENTRY_VALUE());
|
||||
}
|
||||
Map.Entry<?, ?> entry = (Map.Entry<?, ?>)obj;
|
||||
Object key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
#if TYPE_OBJECT && VALUE_OBJECT
|
||||
return KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], value);
|
||||
return KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else if TYPE_OBJECT
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], key) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), key) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#else if VALUE_OBJECT
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], value);
|
||||
return key instanceof CLASS_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), value);
|
||||
#else
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(keys[index], CLASS_TO_KEY(key)) && VALUE_EQUALS(values[index], CLASS_TO_VALUE(value));
|
||||
return key instanceof CLASS_TYPE && value instanceof CLASS_VALUE_TYPE && KEY_EQUALS(ENTRY_KEY(), CLASS_TO_KEY(key)) && VALUE_EQUALS(ENTRY_VALUE(), CLASS_TO_VALUE(value));
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
|
@ -957,12 +984,12 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return KEY_TO_HASH(keys[index]) ^ VALUE_TO_HASH(values[index]);
|
||||
return KEY_TO_HASH(ENTRY_KEY()) ^ VALUE_TO_HASH(ENTRY_VALUE());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return KEY_TO_STRING(keys[index]) + "=" + VALUE_TO_STRING(values[index]);
|
||||
return KEY_TO_STRING(ENTRY_KEY()) + "=" + VALUE_TO_STRING(ENTRY_VALUE());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -341,12 +341,20 @@ public class MAPS
|
|||
@Override
|
||||
public VALUE_TYPE COMPUTE(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTENonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENT(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENTNonDefault(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENT(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENTNonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENT(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENTNonDefault(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE MERGE(KEY_TYPE key, VALUE_TYPE value, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public void BULK_MERGE(MAP KEY_VALUE_GENERIC_TYPE m, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
|
@ -403,12 +411,20 @@ public class MAPS
|
|||
@Override
|
||||
public VALUE_TYPE COMPUTE(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTENonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENT(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENTNonDefault(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENT(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENTNonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENT(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENTNonDefault(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE MERGE(KEY_TYPE key, VALUE_TYPE value, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public void BULK_MERGE(MAP KEY_VALUE_GENERIC_TYPE m, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
|
@ -654,12 +670,20 @@ public class MAPS
|
|||
@Override
|
||||
public VALUE_TYPE COMPUTE(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTENonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENT(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENTNonDefault(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENT(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENTNonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENT(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENTNonDefault(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public VALUE_TYPE MERGE(KEY_TYPE key, VALUE_TYPE value, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public void BULK_MERGE(MAP KEY_VALUE_GENERIC_TYPE m, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { throw new UnsupportedOperationException(); }
|
||||
|
@ -1086,12 +1110,20 @@ public class MAPS
|
|||
@Override
|
||||
public VALUE_TYPE COMPUTE(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { return map.COMPUTE(key, mappingFunction); } }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTENonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { return map.COMPUTENonDefault(key, mappingFunction); } }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENT(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { return map.COMPUTE_IF_ABSENT(key, mappingFunction); } }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_ABSENTNonDefault(KEY_TYPE key, FUNCTION KEY_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { return map.COMPUTE_IF_ABSENTNonDefault(key, mappingFunction); } }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENT(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { return map.COMPUTE_IF_PRESENT(key, mappingFunction); } }
|
||||
@Override
|
||||
public VALUE_TYPE COMPUTE_IF_PRESENTNonDefault(KEY_TYPE key, UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { return map.COMPUTE_IF_PRESENTNonDefault(key, mappingFunction); } }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENT(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { synchronized(mutex) { return map.SUPPLY_IF_ABSENT(key, valueProvider); } }
|
||||
@Override
|
||||
public VALUE_TYPE SUPPLY_IF_ABSENTNonDefault(KEY_TYPE key, VALUE_SUPPLIER VALUE_GENERIC_TYPE valueProvider) { synchronized(mutex) { return map.SUPPLY_IF_ABSENTNonDefault(key, valueProvider); } }
|
||||
@Override
|
||||
public VALUE_TYPE MERGE(KEY_TYPE key, VALUE_TYPE value, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { return map.MERGE(key, value, mappingFunction); } }
|
||||
@Override
|
||||
public void BULK_MERGE(MAP KEY_VALUE_GENERIC_TYPE m, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) { synchronized(mutex) { map.BULK_MERGE(m, mappingFunction); } }
|
||||
|
|
|
@ -26,11 +26,10 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
@MapFeature.Require(SUPPORTS_PUT)
|
||||
#endignore
|
||||
public void testComputeIfAbsent_supportedAbsent() {
|
||||
assertEquals("COMPUTE_IF_ABSENT(notPresent, function) should return new value", v3(),
|
||||
getMap().COMPUTE_IF_ABSENT(k3(), k -> {
|
||||
assertEquals(k3(), k);
|
||||
return v3();
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_ABSENT(notPresent, function) should return new value", v3(), getMap().COMPUTE_IF_ABSENTNonDefault(k3(), k -> {
|
||||
assertEquals(k3(), k);
|
||||
return v3();
|
||||
}));
|
||||
expectAdded(e3());
|
||||
}
|
||||
|
||||
|
@ -41,11 +40,10 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
#endignore
|
||||
public void testComputeIfAbsent_supportedAbsentFirst() {
|
||||
getMap().setDefaultReturnValue(v0());
|
||||
assertEquals("COMPUTE_IF_ABSENT(notPresent, function) should return new value", v3(),
|
||||
getMap().COMPUTE_IF_ABSENT(k0(), k -> {
|
||||
assertEquals(k0(), k);
|
||||
return v3();
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_ABSENT(notPresent, function) should return new value", v3(), getMap().COMPUTE_IF_ABSENTNonDefault(k0(), k -> {
|
||||
assertEquals(k0(), k);
|
||||
return v3();
|
||||
}));
|
||||
expectContents(entry(k0(), v3()));
|
||||
}
|
||||
|
||||
|
@ -55,8 +53,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
#endignore
|
||||
public void testComputeIfAbsent_supportedAbsentSameResult() {
|
||||
getMap().setDefaultReturnValue(v0());
|
||||
assertEquals("COMPUTE_IF_ABSENT(notPresent, function) should return new value", v0(),
|
||||
getMap().COMPUTE_IF_ABSENT(k0(), k -> {
|
||||
assertEquals("COMPUTE_IF_ABSENT(notPresent, function) should return new value", v0(), getMap().COMPUTE_IF_ABSENTNonDefault(k0(), k -> {
|
||||
assertEquals(k0(), k);
|
||||
return v0();
|
||||
}));
|
||||
|
@ -69,10 +66,9 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
@CollectionSize.Require(absent = ZERO)
|
||||
#endignore
|
||||
public void testComputeIfAbsent_supportedPresent() {
|
||||
assertEquals("COMPUTE_IF_ABSENT(present, function) should return existing value", v0(),
|
||||
getMap().COMPUTE_IF_ABSENT(k0(), k -> {
|
||||
throw new AssertionFailedError();
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_ABSENT(present, function) should return existing value", v0(), getMap().COMPUTE_IF_ABSENTNonDefault(k0(), k -> {
|
||||
throw new AssertionFailedError();
|
||||
}));
|
||||
expectUnchanged();
|
||||
}
|
||||
|
||||
|
@ -80,11 +76,10 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
@MapFeature.Require(SUPPORTS_PUT)
|
||||
#endignore
|
||||
public void testComputeIfAbsent_functionReturnsNullNotInserted() {
|
||||
assertEquals("COMPUTE_IF_ABSENT(absent, returnsNull) should return INVALID_VALUE",
|
||||
INVALID_VALUE, getMap().COMPUTE_IF_ABSENT(k3(), k -> {
|
||||
assertEquals(k3(), k);
|
||||
return INVALID_VALUE;
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_ABSENT(absent, returnsNull) should return INVALID_VALUE", INVALID_VALUE, getMap().COMPUTE_IF_ABSENTNonDefault(k3(), k -> {
|
||||
assertEquals(k3(), k);
|
||||
return INVALID_VALUE;
|
||||
}));
|
||||
expectUnchanged();
|
||||
}
|
||||
|
||||
|
@ -97,7 +92,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
#endignore
|
||||
public void testComputeIfAbsent_functionThrows() {
|
||||
try {
|
||||
getMap().COMPUTE_IF_ABSENT(k3(), k -> {
|
||||
getMap().COMPUTE_IF_ABSENTNonDefault(k3(), k -> {
|
||||
assertEquals(k3(), k);
|
||||
throw new ExpectedException();
|
||||
});
|
||||
|
@ -112,7 +107,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
#endignore
|
||||
public void testComputeIfAbsent_unsupportedAbsent() {
|
||||
try {
|
||||
getMap().COMPUTE_IF_ABSENT(k3(), k -> {
|
||||
getMap().COMPUTE_IF_ABSENTNonDefault(k3(), k -> {
|
||||
// allowed to be called
|
||||
assertEquals(k3(), k);
|
||||
return v3();
|
||||
|
@ -129,11 +124,10 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
#endignore
|
||||
public void testComputeIfAbsent_unsupportedPresentExistingValue() {
|
||||
try {
|
||||
assertEquals("COMPUTE_IF_ABSENT(present, returnsCurrentValue) should return present or throw", v0(),
|
||||
getMap().COMPUTE_IF_ABSENT(k0(), k -> {
|
||||
assertEquals(k0(), k);
|
||||
return v0();
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_ABSENT(present, returnsCurrentValue) should return present or throw", v0(), getMap().COMPUTE_IF_ABSENTNonDefault(k0(), k -> {
|
||||
assertEquals(k0(), k);
|
||||
return v0();
|
||||
}));
|
||||
} catch (UnsupportedOperationException tolerated) {
|
||||
}
|
||||
expectUnchanged();
|
||||
|
@ -145,11 +139,10 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfAbsentTester KEY_VALUE_GEN
|
|||
#endignore
|
||||
public void testComputeIfAbsent_unsupportedPresentDifferentValue() {
|
||||
try {
|
||||
assertEquals("COMPUTE_IF_ABSENT(present, returnsDifferentValue) should return present or throw", v0(),
|
||||
getMap().COMPUTE_IF_ABSENT(k0(), k -> {
|
||||
assertEquals(k0(), k);
|
||||
return v3();
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_ABSENT(present, returnsDifferentValue) should return present or throw", v0(), getMap().COMPUTE_IF_ABSENTNonDefault(k0(), k -> {
|
||||
assertEquals(k0(), k);
|
||||
return v3();
|
||||
}));
|
||||
} catch (UnsupportedOperationException tolerated) {
|
||||
}
|
||||
expectUnchanged();
|
||||
|
|
|
@ -21,10 +21,9 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfPresentTester KEY_VALUE_GE
|
|||
@MapFeature.Require(SUPPORTS_PUT)
|
||||
#endignore
|
||||
public void testComputeIfPresent_supportedAbsent() {
|
||||
assertEquals("COMPUTE_IF_PRESENT(notPresent, function) should return INVALID_VALUE", INVALID_VALUE,
|
||||
getMap().COMPUTE_IF_PRESENT(k3(), (k, v) -> {
|
||||
throw new AssertionFailedError();
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_PRESENT(notPresent, function) should return INVALID_VALUE", INVALID_VALUE, getMap().COMPUTE_IF_PRESENTNonDefault(k3(), (k, v) -> {
|
||||
throw new AssertionFailedError();
|
||||
}));
|
||||
expectUnchanged();
|
||||
}
|
||||
|
||||
|
@ -33,12 +32,11 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfPresentTester KEY_VALUE_GE
|
|||
@CollectionSize.Require(absent = ZERO)
|
||||
#endignore
|
||||
public void testComputeIfPresent_supportedPresent() {
|
||||
assertEquals("COMPUTE_IF_PRESENT(present, function) should return new value", v3(),
|
||||
getMap().COMPUTE_IF_PRESENT(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
return v3();
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_PRESENT(present, function) should return new value", v3(), getMap().COMPUTE_IF_PRESENTNonDefault(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
return v3();
|
||||
}));
|
||||
expectReplacement(entry(k0(), v3()));
|
||||
}
|
||||
|
||||
|
@ -47,12 +45,11 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfPresentTester KEY_VALUE_GE
|
|||
@CollectionSize.Require(absent = ZERO)
|
||||
#endignore
|
||||
public void testComputeIfPresent_functionReturnsNull() {
|
||||
assertEquals("COMPUTE_IF_PRESENT(present, returnsNull) should return INVALID_VALUE", INVALID_VALUE,
|
||||
getMap().COMPUTE_IF_PRESENT(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
return INVALID_VALUE;
|
||||
}));
|
||||
assertEquals("COMPUTE_IF_PRESENT(present, returnsNull) should return INVALID_VALUE", INVALID_VALUE, getMap().COMPUTE_IF_PRESENTNonDefault(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
return INVALID_VALUE;
|
||||
}));
|
||||
expectMissing(e0());
|
||||
}
|
||||
|
||||
|
@ -66,7 +63,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfPresentTester KEY_VALUE_GE
|
|||
#endignore
|
||||
public void testComputeIfPresent_functionThrows() {
|
||||
try {
|
||||
getMap().COMPUTE_IF_PRESENT(k0(), (k, v) -> {
|
||||
getMap().COMPUTE_IF_PRESENTNonDefault(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
throw new ExpectedException();
|
||||
|
@ -82,7 +79,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfPresentTester KEY_VALUE_GE
|
|||
#endignore
|
||||
public void testComputeIfPresent_unsupportedAbsent() {
|
||||
try {
|
||||
getMap().COMPUTE_IF_PRESENT(k3(), (k, v) -> {
|
||||
getMap().COMPUTE_IF_PRESENTNonDefault(k3(), (k, v) -> {
|
||||
throw new AssertionFailedError();
|
||||
});
|
||||
} catch (UnsupportedOperationException tolerated) {
|
||||
|
@ -96,7 +93,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeIfPresentTester KEY_VALUE_GE
|
|||
#endignore
|
||||
public void testComputeIfPresent_unsupportedPresent() {
|
||||
try {
|
||||
getMap().COMPUTE_IF_PRESENT(k0(), (k, v) -> v3());
|
||||
getMap().COMPUTE_IF_PRESENTNonDefault(k0(), (k, v) -> v3());
|
||||
fail("Expected UnsupportedOperationException");
|
||||
} catch (UnsupportedOperationException expected) {
|
||||
}
|
||||
|
|
|
@ -21,12 +21,11 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
@MapFeature.Require({ SUPPORTS_PUT, SUPPORTS_REMOVE })
|
||||
#endignore
|
||||
public void testCompute_absentToPresent() {
|
||||
assertEquals("Map.COMPUTE(absent, functionReturningValue) should return value", v3(),
|
||||
getMap().COMPUTE(k3(), (k, v) -> {
|
||||
assertEquals(k3(), k);
|
||||
assertEquals(INVALID_VALUE, v);
|
||||
return v3();
|
||||
}));
|
||||
assertEquals("Map.COMPUTE(absent, functionReturningValue) should return value", v3(), getMap().COMPUTENonDefault(k3(), (k, v) -> {
|
||||
assertEquals(k3(), k);
|
||||
assertEquals(INVALID_VALUE, v);
|
||||
return v3();
|
||||
}));
|
||||
expectAdded(e3());
|
||||
assertEquals(getNumElements() + 1, getMap().size());
|
||||
}
|
||||
|
@ -35,7 +34,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
@MapFeature.Require({ SUPPORTS_PUT, SUPPORTS_REMOVE })
|
||||
#endignore
|
||||
public void testCompute_absentToAbsent() {
|
||||
assertEquals("Map.COMPUTE(absent, functionReturningNull) should return INVALID_VALUE", INVALID_VALUE, getMap().COMPUTE(k3(), (k, v) -> {
|
||||
assertEquals("Map.COMPUTE(absent, functionReturningNull) should return INVALID_VALUE", INVALID_VALUE, getMap().COMPUTENonDefault(k3(), (k, v) -> {
|
||||
assertEquals(k3(), k);
|
||||
assertEquals(INVALID_VALUE, v);
|
||||
return INVALID_VALUE;
|
||||
|
@ -49,12 +48,11 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
@CollectionSize.Require(absent = ZERO)
|
||||
#endignore
|
||||
public void testCompute_presentToPresent() {
|
||||
assertEquals("Map.COMPUTE(present, functionReturningValue) should return new value", v3(),
|
||||
getMap().COMPUTE(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
return v3();
|
||||
}));
|
||||
assertEquals("Map.COMPUTE(present, functionReturningValue) should return new value", v3(), getMap().COMPUTENonDefault(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
return v3();
|
||||
}));
|
||||
expectReplacement(entry(k0(), v3()));
|
||||
assertEquals(getNumElements(), getMap().size());
|
||||
}
|
||||
|
@ -64,7 +62,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
@CollectionSize.Require(absent = ZERO)
|
||||
#endignore
|
||||
public void testCompute_presentToAbsent() {
|
||||
assertEquals("Map.COMPUTE(present, functionReturningNull) should return INVALID_VALUE", INVALID_VALUE, getMap().COMPUTE(k0(), (k, v) -> {
|
||||
assertEquals("Map.COMPUTE(present, functionReturningNull) should return INVALID_VALUE", INVALID_VALUE, getMap().COMPUTENonDefault(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
return INVALID_VALUE;
|
||||
|
@ -84,7 +82,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
#endignore
|
||||
public void testCompute_presentFunctionThrows() {
|
||||
try {
|
||||
getMap().COMPUTE(k0(), (k, v) -> {
|
||||
getMap().COMPUTENonDefault(k0(), (k, v) -> {
|
||||
assertEquals(k0(), k);
|
||||
assertEquals(v0(), v);
|
||||
throw new ExpectedException();
|
||||
|
@ -100,7 +98,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
#endignore
|
||||
public void testCompute_absentFunctionThrows() {
|
||||
try {
|
||||
getMap().COMPUTE(k3(), (k, v) -> {
|
||||
getMap().COMPUTENonDefault(k3(), (k, v) -> {
|
||||
assertEquals(k3(), k);
|
||||
assertEquals(INVALID_VALUE, v);
|
||||
throw new ExpectedException();
|
||||
|
@ -116,7 +114,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
#endignore
|
||||
public void testCompute_removeAbsent() {
|
||||
try {
|
||||
getMap().COMPUTE(k3(), (k, v) -> {
|
||||
getMap().COMPUTENonDefault(k3(), (k, v) -> {
|
||||
assertEquals(k3(), k);
|
||||
assertEquals(INVALID_VALUE, v);
|
||||
return INVALID_VALUE;
|
||||
|
@ -132,7 +130,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapComputeTester KEY_VALUE_GENERIC_TYP
|
|||
#endignore
|
||||
public void testCompute_putAbsent() {
|
||||
try {
|
||||
getMap().COMPUTE(k3(), (k, v) -> {
|
||||
getMap().COMPUTENonDefault(k3(), (k, v) -> {
|
||||
assertEquals(k3(), k);
|
||||
assertEquals(INVALID_VALUE, v);
|
||||
return INVALID_VALUE;
|
||||
|
|
|
@ -26,8 +26,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
@MapFeature.Require(SUPPORTS_PUT)
|
||||
#endignore
|
||||
public void testSupplyIfAbsent_supportedAbsent() {
|
||||
assertEquals("SUPPLY_IF_ABSENT(notPresent, function) should return new value", v3(),
|
||||
getMap().SUPPLY_IF_ABSENT(k3(), this::v3));
|
||||
assertEquals("SUPPLY_IF_ABSENT(notPresent, function) should return new value", v3(), getMap().SUPPLY_IF_ABSENTNonDefault(k3(), this::v3));
|
||||
expectAdded(e3());
|
||||
}
|
||||
|
||||
|
@ -38,8 +37,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
#endignore
|
||||
public void testSupplyIfAbsent_supportedAbsentFirst() {
|
||||
getMap().setDefaultReturnValue(v0());
|
||||
assertEquals("SUPPLY_IF_ABSENT(notPresent, function) should return new value", v3(),
|
||||
getMap().SUPPLY_IF_ABSENT(k0(), this::v3));
|
||||
assertEquals("SUPPLY_IF_ABSENT(notPresent, function) should return new value", v3(), getMap().SUPPLY_IF_ABSENTNonDefault(k0(), this::v3));
|
||||
expectContents(entry(k0(), v3()));
|
||||
}
|
||||
|
||||
|
@ -49,8 +47,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
#endignore
|
||||
public void testSupplyIfAbsent_supportedAbsentSameResult() {
|
||||
getMap().setDefaultReturnValue(v0());
|
||||
assertEquals("SUPPLY_IF_ABSENT(notPresent, function) should return new value", v0(),
|
||||
getMap().SUPPLY_IF_ABSENT(k0(), this::v0));
|
||||
assertEquals("SUPPLY_IF_ABSENT(notPresent, function) should return new value", v0(), getMap().SUPPLY_IF_ABSENTNonDefault(k0(), this::v0));
|
||||
expectUnchanged();
|
||||
}
|
||||
|
||||
|
@ -60,10 +57,9 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
@CollectionSize.Require(absent = ZERO)
|
||||
#endignore
|
||||
public void testSupplyIfAbsent_supportedPresent() {
|
||||
assertEquals("SUPPLY_IF_ABSENT(present, function) should return existing value", v0(),
|
||||
getMap().SUPPLY_IF_ABSENT(k0(), () -> {
|
||||
throw new AssertionFailedError();
|
||||
}));
|
||||
assertEquals("SUPPLY_IF_ABSENT(present, function) should return existing value", v0(), getMap().SUPPLY_IF_ABSENTNonDefault(k0(), () -> {
|
||||
throw new AssertionFailedError();
|
||||
}));
|
||||
expectUnchanged();
|
||||
}
|
||||
|
||||
|
@ -71,7 +67,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
@MapFeature.Require(SUPPORTS_PUT)
|
||||
#endignore
|
||||
public void testSupplyIfAbsent_functionReturnsNullNotInserted() {
|
||||
assertEquals("SUPPLY_IF_ABSENT(absent, returnsNull) should return INVALID_VALUE", INVALID_VALUE, getMap().SUPPLY_IF_ABSENT(k3(), () -> INVALID_VALUE));
|
||||
assertEquals("SUPPLY_IF_ABSENT(absent, returnsNull) should return INVALID_VALUE", INVALID_VALUE, getMap().SUPPLY_IF_ABSENTNonDefault(k3(), () -> INVALID_VALUE));
|
||||
expectUnchanged();
|
||||
}
|
||||
|
||||
|
@ -84,7 +80,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
#endignore
|
||||
public void testSupplyIfAbsent_functionThrows() {
|
||||
try {
|
||||
getMap().SUPPLY_IF_ABSENT(k3(), () -> {
|
||||
getMap().SUPPLY_IF_ABSENTNonDefault(k3(), () -> {
|
||||
throw new ExpectedException();
|
||||
});
|
||||
fail("Expected ExpectedException");
|
||||
|
@ -98,7 +94,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
#endignore
|
||||
public void testSupplyIfAbsent_unsupportedAbsent() {
|
||||
try {
|
||||
getMap().SUPPLY_IF_ABSENT(k3(), this::v3);
|
||||
getMap().SUPPLY_IF_ABSENTNonDefault(k3(), this::v3);
|
||||
fail("SUPPLY_IF_ABSENT(notPresent, function) should throw");
|
||||
} catch (UnsupportedOperationException expected) {
|
||||
}
|
||||
|
@ -111,7 +107,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
#endignore
|
||||
public void testSupplyIfAbsent_unsupportedPresentExistingValue() {
|
||||
try {
|
||||
assertEquals("SUPPLY_IF_ABSENT(present, returnsCurrentValue) should return present or throw", v0(), getMap().SUPPLY_IF_ABSENT(k0(), this::v0));
|
||||
assertEquals("SUPPLY_IF_ABSENT(present, returnsCurrentValue) should return present or throw", v0(), getMap().SUPPLY_IF_ABSENTNonDefault(k0(), this::v0));
|
||||
} catch (UnsupportedOperationException tolerated) {
|
||||
}
|
||||
expectUnchanged();
|
||||
|
@ -123,7 +119,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapSupplyIfAbsentTester KEY_VALUE_GENE
|
|||
#endignore
|
||||
public void testSupplyIfAbsent_unsupportedPresentDifferentValue() {
|
||||
try {
|
||||
assertEquals("SUPPLY_IF_ABSENT(present, returnsDifferentValue) should return present or throw", v0(), getMap().SUPPLY_IF_ABSENT(k0(), this::v3));
|
||||
assertEquals("SUPPLY_IF_ABSENT(present, returnsDifferentValue) should return present or throw", v0(), getMap().SUPPLY_IF_ABSENTNonDefault(k0(), this::v3));
|
||||
} catch (UnsupportedOperationException tolerated) {
|
||||
}
|
||||
expectUnchanged();
|
||||
|
|
Loading…
Reference in New Issue