Compare commits
15
Commits
58e20bb513
...
1.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3bff703d91 | ||
|
|
d140aaa788 | ||
|
|
180b603ffd | ||
|
|
2306917b10 | ||
|
|
075f3ad183 | ||
|
|
363160441d | ||
|
|
2a97d017b7 | ||
|
|
374b027120 | ||
|
|
21ccbee3b2 | ||
|
|
58a9eb38b4 | ||
|
|
2f1525ab57 | ||
|
|
9f46091282 | ||
|
|
3d39d5526d | ||
|
|
c6f656ee66 | ||
|
|
f0139d1a22 |
+1
-1
@@ -32,7 +32,7 @@
|
|||||||
<attribute name="gradle_used_by_scope" value="builder"/>
|
<attribute name="gradle_used_by_scope" value="builder"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21/"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
|
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
|
||||||
<classpathentry kind="output" path="bin/default"/>
|
<classpathentry kind="output" path="bin/default"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|||||||
@@ -1,5 +1,23 @@
|
|||||||
# Changelog of versions
|
# Changelog of versions
|
||||||
|
|
||||||
|
### Version 1.0.1
|
||||||
|
-Added: AsyncBuilder now supports CompletableFuture
|
||||||
|
-Added: forEach(BiConsumer, Input)
|
||||||
|
|
||||||
|
|
||||||
|
### Version 1.0.0
|
||||||
|
-Added: Sequenced Collections support.
|
||||||
|
-Added: ReferenceMaps
|
||||||
|
-Added: IndirectSorting
|
||||||
|
-Added: Missing Optionals
|
||||||
|
-Added: Collectors for Lists and Sets
|
||||||
|
-Added: ReverseCollections for Sequenced/OrderedCollections
|
||||||
|
-Breaking Change: FindFirst & reduce without identity use now Optionals instead of defaultValues
|
||||||
|
-Breaking Change: Lists and OrderedSets no longer use Poll prefix they use now the java Remove
|
||||||
|
-Fixed: #33
|
||||||
|
-Fixed: Add/PutAndMoveToFirst wouldn't work if the collection was only with 1 entry present.
|
||||||
|
-Fixed: Various new bugs found with the expansion of the unit tests.
|
||||||
|
|
||||||
### Version 0.9.0
|
### Version 0.9.0
|
||||||
- Added: getFirst/getLast/removeFirst/removeLast to List.class.
|
- Added: getFirst/getLast/removeFirst/removeLast to List.class.
|
||||||
- Added: Dedicated Set toArray implementations.
|
- Added: Dedicated Set toArray implementations.
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
[](https://jitpack.io/#Speiger/Primitive-Collections)
|
[](https://jitpack.io/#Speiger/Primitive-Collections)
|
||||||

|

|
||||||
[](https://opensource.org/licenses/Apache-2.0)
|
[](https://opensource.org/licenses/Apache-2.0)
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
[](https://codecov.io/gh/Speiger/Primitive-Collections)
|
[](https://codecov.io/gh/Speiger/Primitive-Collections)
|
||||||

|

|
||||||
# Primitive-Collections
|
# Primitive-Collections
|
||||||
This is a Simple Primitive Collections Library aimed to outperform Java's Collection Library and FastUtil.
|
This is a Simple Primitive Collections Library aimed to outperform Java's Collection Library and FastUtil.
|
||||||
Both in Performance and Quality of Life Features.
|
Both in Performance and Quality of Life Features.
|
||||||
@@ -27,6 +27,7 @@ Such as pruning classes that are not needed in your code.
|
|||||||
- HashSets/Maps (Linked & HashControl)
|
- HashSets/Maps (Linked & HashControl)
|
||||||
- TreeSets/Maps (RB & AVL)
|
- TreeSets/Maps (RB & AVL)
|
||||||
- EnumMaps
|
- EnumMaps
|
||||||
|
- ReferenceMaps (Weak Keys)
|
||||||
- Immutable Maps/Lists/Sets
|
- Immutable Maps/Lists/Sets
|
||||||
- ConcurrentHashMaps
|
- ConcurrentHashMaps
|
||||||
- Priority Queues
|
- Priority Queues
|
||||||
@@ -51,14 +52,14 @@ repositories {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.github.Speiger:Primitive-Collections:0.9.0'
|
implementation 'com.github.Speiger:Primitive-Collections:1.0.0'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Using Maven Central
|
Using Maven Central
|
||||||
```groovy
|
```groovy
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'io.github.speiger:Primitive-Collections:0.9.0'
|
implementation 'io.github.speiger:Primitive-Collections:1.0.0'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,7 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'java-library'
|
id 'java-library'
|
||||||
id "jacoco"
|
id "jacoco"
|
||||||
|
// id "com.vanniktech.maven.publish" version "0.28.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile) {
|
tasks.withType(JavaCompile) {
|
||||||
@@ -56,7 +57,7 @@ dependencies {
|
|||||||
builderImplementation 'com.google.code.gson:gson:2.10'
|
builderImplementation 'com.google.code.gson:gson:2.10'
|
||||||
builderImplementation 'de.speiger:Simple-Code-Generator:1.3.0'
|
builderImplementation 'de.speiger:Simple-Code-Generator:1.3.0'
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
testImplementation 'com.google.guava:guava-testlib:31.0.1-jre'
|
testImplementation 'com.google.guava:guava-testlib:33.6.0-jre'
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,4 +378,3 @@ tasks.withType(PublishToMavenLocal) {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
//
|
|
||||||
+1
-1
@@ -3,4 +3,4 @@ org.gradle.jvmargs=-Xmx3G
|
|||||||
maxMemory = 2048m
|
maxMemory = 2048m
|
||||||
testThreads = 4
|
testThreads = 4
|
||||||
|
|
||||||
RELEASE_VERSION = 0.9.0
|
RELEASE_VERSION = 1.0.1
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
jdk:
|
jdk:
|
||||||
- openjdk9
|
- openjdk21
|
||||||
install:
|
install:
|
||||||
- chmod +x ./gradlew
|
- chmod +x ./gradlew
|
||||||
- ./gradlew build publishToMavenLocal
|
- ./gradlew build publishToMavenLocal
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ public class FunctionModule extends BaseModule
|
|||||||
protected void loadBlockades()
|
protected void loadBlockades()
|
||||||
{
|
{
|
||||||
if(keyType.isObject()) addBlockedFiles("Consumer", "Comparator");
|
if(keyType.isObject()) addBlockedFiles("Consumer", "Comparator");
|
||||||
if(!MODULE.isEnabled()) addBlockedFiles("Consumer", "BiConsumer", "Comparator", "Supplier", "Function", "UnaryOperator");
|
if(!MODULE.isEnabled()) addBlockedFiles("Consumer", "BiConsumer", "Comparator", "Supplier", "Optional", "Function", "UnaryOperator");
|
||||||
|
if(!keyType.needsCustomJDKType()) addBlockedFiles("Optional");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -60,6 +61,7 @@ public class FunctionModule extends BaseModule
|
|||||||
}
|
}
|
||||||
else addBiRequirement("Function");
|
else addBiRequirement("Function");
|
||||||
addRemapper("BiConsumer", "%sConsumer");
|
addRemapper("BiConsumer", "%sConsumer");
|
||||||
|
addRemapper("Optional", "Optional%s");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,6 +79,7 @@ public class FunctionModule extends BaseModule
|
|||||||
addBiClassMapper("BI_CONSUMER", "Consumer", "");
|
addBiClassMapper("BI_CONSUMER", "Consumer", "");
|
||||||
addClassMapper("BI_TO_OBJECT_CONSUMER", "ObjectConsumer");
|
addClassMapper("BI_TO_OBJECT_CONSUMER", "ObjectConsumer");
|
||||||
addAbstractMapper("BI_FROM_OBJECT_CONSUMER", "Object%sConsumer");
|
addAbstractMapper("BI_FROM_OBJECT_CONSUMER", "Object%sConsumer");
|
||||||
|
addAbstractMapper("BI_TO_OBJECT_CONSUMER", "%sObjectConsumer");
|
||||||
addAbstractMapper("BI_FROM_INT_CONSUMER", "Int%sConsumer");
|
addAbstractMapper("BI_FROM_INT_CONSUMER", "Int%sConsumer");
|
||||||
if(keyType.isObject()) {
|
if(keyType.isObject()) {
|
||||||
addSimpleMapper("TO_OBJECT_FUNCTION", keyType.getNonFileType()+"UnaryOperator");
|
addSimpleMapper("TO_OBJECT_FUNCTION", keyType.getNonFileType()+"UnaryOperator");
|
||||||
@@ -94,6 +97,8 @@ public class FunctionModule extends BaseModule
|
|||||||
|
|
||||||
addFunctionMappers("PREDICATE", "%sPredicate");
|
addFunctionMappers("PREDICATE", "%sPredicate");
|
||||||
addClassMapper("SUPPLIER", "Supplier");
|
addClassMapper("SUPPLIER", "Supplier");
|
||||||
|
addSimpleMapper("OPTIONAL", keyType.isObject() ? "Optional" : String.format("Optional%s", keyType.getFileType()));
|
||||||
|
addSimpleMapper("VALUE_OPTIONAL", valueType.isObject() ? "Optional" : String.format("Optional%s", valueType.getFileType()));
|
||||||
addAbstractMapper("SINGLE_UNARY_OPERATOR", "%1$s%1$sUnaryOperator");
|
addAbstractMapper("SINGLE_UNARY_OPERATOR", "%1$s%1$sUnaryOperator");
|
||||||
addBiClassMapper("UNARY_OPERATOR", "UnaryOperator", "");
|
addBiClassMapper("UNARY_OPERATOR", "UnaryOperator", "");
|
||||||
if(keyType.isObject())
|
if(keyType.isObject())
|
||||||
|
|||||||
@@ -60,6 +60,8 @@ public class JavaModule extends BaseModule
|
|||||||
addSimpleMapper("APPLY_KEY_VALUE", keyType.isObject() ? "apply" : "applyAs"+keyType.getNonFileType());
|
addSimpleMapper("APPLY_KEY_VALUE", keyType.isObject() ? "apply" : "applyAs"+keyType.getNonFileType());
|
||||||
addSimpleMapper("APPLY_VALUE", valueType.isObject() ? "apply" : "applyAs"+valueType.getNonFileType());
|
addSimpleMapper("APPLY_VALUE", valueType.isObject() ? "apply" : "applyAs"+valueType.getNonFileType());
|
||||||
addSimpleMapper("APPLY_CAST", "applyAs"+keyType.getCustomJDKType().getNonFileType());
|
addSimpleMapper("APPLY_CAST", "applyAs"+keyType.getCustomJDKType().getNonFileType());
|
||||||
|
addSimpleMapper("GET_OPTIONAL", keyType.isObject() ? "ofNullable" : "of");
|
||||||
|
addSimpleMapper("GET_OPTIONAL_VALUE", valueType.isObject() ? "ofNullable" : "of");
|
||||||
|
|
||||||
//Shared by Maps and Pairs so moved to java.
|
//Shared by Maps and Pairs so moved to java.
|
||||||
addFunctionMappers("ENTRY_KEY", "get%sKey");
|
addFunctionMappers("ENTRY_KEY", "get%sKey");
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ public class MapModule extends BaseModule
|
|||||||
public static final FunctionDependency ENUM_MAP = MODULE.createDependency("EnumMap").addEntryDependency(IMPLEMENTATION);
|
public static final FunctionDependency ENUM_MAP = MODULE.createDependency("EnumMap").addEntryDependency(IMPLEMENTATION);
|
||||||
public static final FunctionDependency LINKED_ENUM_MAP = MODULE.createDependency("LinkedEnumMap").addEntryDependency(ENUM_MAP).addEntryDependency(ORDERED_MAP);
|
public static final FunctionDependency LINKED_ENUM_MAP = MODULE.createDependency("LinkedEnumMap").addEntryDependency(ENUM_MAP).addEntryDependency(ORDERED_MAP);
|
||||||
|
|
||||||
|
public static final FunctionDependency REF_MAP = MODULE.createDependency("ReferenceHashMap").addEntryDependency(IMPLEMENTATION);
|
||||||
|
public static final FunctionDependency LINKED_REF_MAP = MODULE.createDependency("LinkedReferenceMap").addEntryDependency(REF_MAP).addEntryDependency(ORDERED_MAP);
|
||||||
|
|
||||||
|
|
||||||
public static final FunctionDependency CONCURRENT_MAP = MODULE.createDependency("ConcurrentMap").addEntryDependency(IMPLEMENTATION);
|
public static final FunctionDependency CONCURRENT_MAP = MODULE.createDependency("ConcurrentMap").addEntryDependency(IMPLEMENTATION);
|
||||||
public static final FunctionDependency AVL_TREE_MAP = MODULE.createDependency("AVLTreeMap").addEntryDependency(SORTED_MAP).addEntryDependency(IMPLEMENTATION);
|
public static final FunctionDependency AVL_TREE_MAP = MODULE.createDependency("AVLTreeMap").addEntryDependency(SORTED_MAP).addEntryDependency(IMPLEMENTATION);
|
||||||
public static final FunctionDependency RB_TREE_MAP = MODULE.createDependency("RBTreeMap").addEntryDependency(SORTED_MAP).addEntryDependency(IMPLEMENTATION);
|
public static final FunctionDependency RB_TREE_MAP = MODULE.createDependency("RBTreeMap").addEntryDependency(SORTED_MAP).addEntryDependency(IMPLEMENTATION);
|
||||||
@@ -51,7 +55,7 @@ public class MapModule extends BaseModule
|
|||||||
@Override
|
@Override
|
||||||
public List<IDependency> getDependencies(ClassType keyType, ClassType valueType) {
|
public List<IDependency> getDependencies(ClassType keyType, ClassType valueType) {
|
||||||
List<IDependency> dependencies = new ArrayList<>(Arrays.asList(MODULE, ORDERED_MAP, SORTED_MAP, IMPLEMENTATION, WRAPPERS, ARRAY_MAP, IMMUTABLE_MAP, HASH_MAP, LINKED_MAP, CUSTOM_MAP, LINKED_CUSTOM_MAP, CONCURRENT_MAP, AVL_TREE_MAP, RB_TREE_MAP));
|
List<IDependency> dependencies = new ArrayList<>(Arrays.asList(MODULE, ORDERED_MAP, SORTED_MAP, IMPLEMENTATION, WRAPPERS, ARRAY_MAP, IMMUTABLE_MAP, HASH_MAP, LINKED_MAP, CUSTOM_MAP, LINKED_CUSTOM_MAP, CONCURRENT_MAP, AVL_TREE_MAP, RB_TREE_MAP));
|
||||||
if(keyType == ClassType.OBJECT) dependencies.addAll(Arrays.asList(ENUM_MAP, LINKED_ENUM_MAP));
|
if(keyType == ClassType.OBJECT) dependencies.addAll(Arrays.asList(ENUM_MAP, LINKED_ENUM_MAP, REF_MAP, LINKED_REF_MAP));
|
||||||
return dependencies;
|
return dependencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,6 +74,10 @@ public class MapModule extends BaseModule
|
|||||||
if(AVL_TREE_MAP.isEnabled()) addFlag("AVL_TREE_MAP_FEATURE");
|
if(AVL_TREE_MAP.isEnabled()) addFlag("AVL_TREE_MAP_FEATURE");
|
||||||
if(RB_TREE_MAP.isEnabled()) addFlag("RB_TREE_MAP_FEATURE");
|
if(RB_TREE_MAP.isEnabled()) addFlag("RB_TREE_MAP_FEATURE");
|
||||||
|
|
||||||
|
if(REF_MAP.isEnabled()) addFlag("REF_MAP_FEATURE");
|
||||||
|
if(LINKED_REF_MAP.isEnabled()) addFlag("LINKED_REF_MAP_FEATURE");
|
||||||
|
|
||||||
|
|
||||||
if(CONCURRENT_MAP.isEnabled()) addFlag("CONCURRENT_MAP_FEATURE");
|
if(CONCURRENT_MAP.isEnabled()) addFlag("CONCURRENT_MAP_FEATURE");
|
||||||
if(IMMUTABLE_MAP.isEnabled()) addFlag("IMMUTABLE_MAP_FEATURE");
|
if(IMMUTABLE_MAP.isEnabled()) addFlag("IMMUTABLE_MAP_FEATURE");
|
||||||
if(HASH_MAP.isEnabled()) addFlag("MAP_FEATURE");
|
if(HASH_MAP.isEnabled()) addFlag("MAP_FEATURE");
|
||||||
@@ -85,6 +93,8 @@ public class MapModule extends BaseModule
|
|||||||
if(!IMMUTABLE_MAP.isEnabled()) addBlockedFiles("ImmutableOpenHashMap");
|
if(!IMMUTABLE_MAP.isEnabled()) addBlockedFiles("ImmutableOpenHashMap");
|
||||||
if(!CONCURRENT_MAP.isEnabled()) addBlockedFiles("ConcurrentMap", "ConcurrentOpenHashMap");
|
if(!CONCURRENT_MAP.isEnabled()) addBlockedFiles("ConcurrentMap", "ConcurrentOpenHashMap");
|
||||||
if(!ORDERED_MAP.isEnabled()) addBlockedFiles("OrderedMap");
|
if(!ORDERED_MAP.isEnabled()) addBlockedFiles("OrderedMap");
|
||||||
|
if(!REF_MAP.isEnabled()) addBlockedFiles("ReferenceHashMap");
|
||||||
|
if(!LINKED_REF_MAP.isEnabled()) addBlockedFiles("LinkedReferenceHashMap");
|
||||||
if(!HASH_MAP.isEnabled()) addBlockedFiles("OpenHashMap");
|
if(!HASH_MAP.isEnabled()) addBlockedFiles("OpenHashMap");
|
||||||
if(!LINKED_MAP.isEnabled()) addBlockedFiles("LinkedOpenHashMap");
|
if(!LINKED_MAP.isEnabled()) addBlockedFiles("LinkedOpenHashMap");
|
||||||
if(!CUSTOM_MAP.isEnabled()) addBlockedFiles("OpenCustomHashMap");
|
if(!CUSTOM_MAP.isEnabled()) addBlockedFiles("OpenCustomHashMap");
|
||||||
@@ -127,6 +137,8 @@ public class MapModule extends BaseModule
|
|||||||
addBiRequirement("AbstractMap");
|
addBiRequirement("AbstractMap");
|
||||||
addEnumRequirement("EnumMap");
|
addEnumRequirement("EnumMap");
|
||||||
addEnumRequirement("LinkedEnumMap");
|
addEnumRequirement("LinkedEnumMap");
|
||||||
|
addEnumRequirement("ReferenceHashMap");
|
||||||
|
addEnumRequirement("LinkedReferenceHashMap");
|
||||||
addBiRequirement("ConcurrentOpenHashMap");
|
addBiRequirement("ConcurrentOpenHashMap");
|
||||||
addBiRequirement("ImmutableOpenHashMap");
|
addBiRequirement("ImmutableOpenHashMap");
|
||||||
addBiRequirement("OpenHashMap");
|
addBiRequirement("OpenHashMap");
|
||||||
@@ -141,6 +153,8 @@ public class MapModule extends BaseModule
|
|||||||
addRemapper("AbstractMap", "Abstract%sMap");
|
addRemapper("AbstractMap", "Abstract%sMap");
|
||||||
addRemapper("EnumMap", "Enum2%sMap");
|
addRemapper("EnumMap", "Enum2%sMap");
|
||||||
addRemapper("LinkedEnumMap", "LinkedEnum2%sMap");
|
addRemapper("LinkedEnumMap", "LinkedEnum2%sMap");
|
||||||
|
addRemapper("ReferenceHashMap", "Reference2%sHashMap");
|
||||||
|
addRemapper("LinkedReferenceHashMap", "Reference2%sLinkedHashMap");
|
||||||
addRemapper("ImmutableOpenHashMap", "Immutable%sOpenHashMap");
|
addRemapper("ImmutableOpenHashMap", "Immutable%sOpenHashMap");
|
||||||
|
|
||||||
//Test Classes
|
//Test Classes
|
||||||
@@ -198,6 +212,7 @@ public class MapModule extends BaseModule
|
|||||||
addBiRequirement("SortedMapNavigationTester");
|
addBiRequirement("SortedMapNavigationTester");
|
||||||
addBiRequirement("OrderedMapNavigationTester");
|
addBiRequirement("OrderedMapNavigationTester");
|
||||||
addBiRequirement("OrderedMapMoveTester");
|
addBiRequirement("OrderedMapMoveTester");
|
||||||
|
addBiRequirement("OrderedMapPutTester");
|
||||||
addBiRequirement("MapConstructorTester");
|
addBiRequirement("MapConstructorTester");
|
||||||
|
|
||||||
addRemapper("TestMapGenerator", "Test%sMapGenerator");
|
addRemapper("TestMapGenerator", "Test%sMapGenerator");
|
||||||
@@ -248,6 +263,8 @@ public class MapModule extends BaseModule
|
|||||||
addBiClassMapper("RB_TREE_MAP", "RBTreeMap", "2");
|
addBiClassMapper("RB_TREE_MAP", "RBTreeMap", "2");
|
||||||
addFunctionValueMappers("LINKED_ENUM_MAP", valueType.isObject() ? "LinkedEnum2ObjectMap" : "LinkedEnum2%sMap");
|
addFunctionValueMappers("LINKED_ENUM_MAP", valueType.isObject() ? "LinkedEnum2ObjectMap" : "LinkedEnum2%sMap");
|
||||||
addFunctionValueMappers("ENUM_MAP", valueType.isObject() ? "Enum2ObjectMap" : "Enum2%sMap");
|
addFunctionValueMappers("ENUM_MAP", valueType.isObject() ? "Enum2ObjectMap" : "Enum2%sMap");
|
||||||
|
addFunctionValueMappers("REF_MAP", valueType.isObject() ? "Reference2ObjectHashMap" : "Reference2%sHashMap");
|
||||||
|
addFunctionValueMappers("LINKED_REF_MAP", valueType.isObject() ? "Reference2ObjectLinkedHashMap" : "Reference2%sLinkedHashMap");
|
||||||
addBiClassMapper("HASH_MAP", "OpenHashMap", "2");
|
addBiClassMapper("HASH_MAP", "OpenHashMap", "2");
|
||||||
addBiClassMapper("ARRAY_MAP", "ArrayMap", "2");
|
addBiClassMapper("ARRAY_MAP", "ArrayMap", "2");
|
||||||
|
|
||||||
|
|||||||
+26
-5
@@ -5,6 +5,9 @@ import java.util.function.Consumer;
|
|||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
|
|
||||||
@@ -30,9 +33,15 @@ import speiger.src.collections.PACKAGE.collections.OUTPUT_ITERABLE;
|
|||||||
#endif
|
#endif
|
||||||
#enditerate
|
#enditerate
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.functions.function.TO_OBJECT_FUNCTION;
|
import speiger.src.collections.PACKAGE.functions.function.TO_OBJECT_FUNCTION;
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -147,6 +156,18 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
|
|||||||
iterator().forEachRemaining(input, action);
|
iterator().forEachRemaining(input, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to reduce Lambda usage and allow for more method references, since these are faster/cleaner.
|
||||||
|
* @param action The action to be performed for each element
|
||||||
|
* @param input the object that should be included
|
||||||
|
* @param <E> the generic type of the Object
|
||||||
|
* @throws java.lang.NullPointerException if the specified action is null
|
||||||
|
*/
|
||||||
|
default <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
iterator().forEachRemaining(action, input);
|
||||||
|
}
|
||||||
|
|
||||||
#if SPLIT_ITERATOR_FEATURE
|
#if SPLIT_ITERATOR_FEATURE
|
||||||
/**
|
/**
|
||||||
* A Type Specific Type Splititerator to reduce boxing/unboxing
|
* A Type Specific Type Splititerator to reduce boxing/unboxing
|
||||||
@@ -408,13 +429,13 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
|
|||||||
* @param filter that should be applied
|
* @param filter that should be applied
|
||||||
* @return the found value or the null equivalent variant.
|
* @return the found value or the null equivalent variant.
|
||||||
*/
|
*/
|
||||||
default KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
default OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(ITERATOR KEY_GENERIC_TYPE iter = iterator();iter.hasNext();) {
|
for(ITERATOR KEY_GENERIC_TYPE iter = iterator();iter.hasNext();) {
|
||||||
KEY_TYPE entry = iter.NEXT();
|
KEY_TYPE entry = iter.NEXT();
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return OPTIONAL.GET_OPTIONAL(entry);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -459,7 +480,7 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
|
|||||||
* @param operator the operation that should be applied
|
* @param operator the operation that should be applied
|
||||||
* @return the reduction result, returns null value if nothing was found
|
* @return the reduction result, returns null value if nothing was found
|
||||||
*/
|
*/
|
||||||
default KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
default OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -471,7 +492,7 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, iter.NEXT());
|
state = operator.APPLY_VALUE(state, iter.NEXT());
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+15
@@ -9,6 +9,9 @@ import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Type-Specific {@link Iterator} that reduces (un)boxing
|
* A Type-Specific {@link Iterator} that reduces (un)boxing
|
||||||
@@ -79,6 +82,18 @@ public interface ITERATOR KEY_GENERIC_TYPE extends Iterator<CLASS_TYPE>
|
|||||||
while(hasNext()) { action.accept(input, NEXT()); }
|
while(hasNext()) { action.accept(input, NEXT()); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to reduce Lambda usage and allow for more method references, since these are faster/cleaner.
|
||||||
|
* @param action The action to be performed for each element
|
||||||
|
* @param input the object that should be included
|
||||||
|
* @param <E> the generic type of the Object
|
||||||
|
* @throws java.lang.NullPointerException if the specified action is null
|
||||||
|
*/
|
||||||
|
default <E> void forEachRemaining(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
while(hasNext()) { action.accept(NEXT(), input); }
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Skips the Given amount of elements if possible. A Optimization function to skip elements faster if the implementation allows it.
|
* Skips the Given amount of elements if possible. A Optimization function to skip elements faster if the implementation allows it.
|
||||||
* @param amount the amount of elements that should be skipped
|
* @param amount the amount of elements that should be skipped
|
||||||
|
|||||||
+89
@@ -0,0 +1,89 @@
|
|||||||
|
package speiger.src.collections.PACKAGE.functions;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public final class OPTIONAL KEY_GENERIC_TYPE {
|
||||||
|
private static final OPTIONAL NO_GENERIC_TYPE EMPTY = new OPTIONALBRACES();
|
||||||
|
|
||||||
|
private final boolean isPresent;
|
||||||
|
private final KEY_TYPE value;
|
||||||
|
|
||||||
|
private OPTIONAL() {
|
||||||
|
this.isPresent = false;
|
||||||
|
this.value = EMPTY_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private OPTIONAL(KEY_TYPE value) {
|
||||||
|
this.isPresent = true;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OPTIONAL KEY_GENERIC_TYPE empty() {
|
||||||
|
return EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OPTIONAL KEY_GENERIC_TYPE of(KEY_TYPE value) {
|
||||||
|
return new OPTIONALBRACES(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public KEY_TYPE SUPPLY_GET() {
|
||||||
|
if(!isPresent) throw new NoSuchElementException("No value present");
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPresent() {
|
||||||
|
return isPresent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return !isPresent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ifPresent(CONSUMER KEY_GENERIC_TYPE consumer) {
|
||||||
|
if(isPresent) consumer.accept(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ifPresentOrElse(CONSUMER KEY_GENERIC_TYPE action, Runnable emptyAction) {
|
||||||
|
if (isPresent) action.accept(value);
|
||||||
|
else emptyAction.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public KEY_TYPE orElse(KEY_TYPE other) {
|
||||||
|
return isPresent ? value : other;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KEY_TYPE orElseGet(SUPPLIER KEY_GENERIC_TYPE other) {
|
||||||
|
return isPresent ? value : other.SUPPLY_GET();
|
||||||
|
}
|
||||||
|
|
||||||
|
public KEY_TYPE orElseThrow() {
|
||||||
|
if (!isPresent) throw new NoSuchElementException("No value present");
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <X extends Throwable> KEY_TYPE orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
|
||||||
|
if(isPresent) return value;
|
||||||
|
else throw exceptionSupplier.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if(obj == this) return true;
|
||||||
|
if(obj instanceof OPTIONAL) {
|
||||||
|
OPTIONAL KEY_GENERIC_TYPE other = (OPTIONAL KEY_GENERIC_TYPE)obj;
|
||||||
|
return (isPresent && other.isPresent ? KEY_EQUALS(value, other.value) : isPresent == other.isPresent);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return isPresent ? KEY_TO_HASH(value) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return isPresent ? "OPTIONAL["+value+"]" : "OPTIONAL.empty";
|
||||||
|
}
|
||||||
|
}
|
||||||
+72
-5
@@ -7,6 +7,16 @@ import java.util.Comparator;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
#if IARRAY_FEATURE || TYPE_OBJECT
|
#if IARRAY_FEATURE || TYPE_OBJECT
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -33,11 +43,18 @@ import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
|||||||
import speiger.src.collections.PACKAGE.collections.STACK;
|
import speiger.src.collections.PACKAGE.collections.STACK;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -219,6 +236,42 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a ArrayList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, ObjectArrayList<T>, ObjectArrayList<T>> toList() {
|
||||||
|
return Collector.of(ObjectArrayList::new, ObjectArrayList::add, ObjectArrayList::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> ARRAY_LIST KEY_GENERIC_TYPE toList(Stream<T> stream) {
|
||||||
|
return stream.collect(ObjectArrayList::new, ObjectArrayList::add, ObjectArrayList::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ObjectArrayList<T> merge(ObjectArrayList<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayList
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static ARRAY_LIST toList(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(ARRAY_LIST::new, ARRAY_LIST::add, ARRAY_LIST::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
* Appends the specified element to the end of this list.
|
* Appends the specified element to the end of this list.
|
||||||
@@ -654,6 +707,20 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
action.accept(input, data[i]);
|
action.accept(input, data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;i++)
|
||||||
|
action.accept(data[i], input);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;i++)
|
||||||
|
action.accept(i, data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -682,12 +749,12 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0;i<size;i++) {
|
for(int i = 0;i<size;i++) {
|
||||||
if(filter.test(data[i])) return data[i];
|
if(filter.test(data[i])) return OPTIONAL.GET_OPTIONAL(data[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -714,7 +781,7 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -726,7 +793,7 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, data[i]);
|
state = operator.APPLY_VALUE(state, data[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+72
-5
@@ -8,6 +8,15 @@ import java.util.Collection;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@@ -33,11 +42,18 @@ import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
|||||||
import speiger.src.collections.PACKAGE.collections.STACK;
|
import speiger.src.collections.PACKAGE.collections.STACK;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -166,7 +182,42 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a CopyOnWriteArrayList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, CopyOnWriteObjectArrayList<T>, CopyOnWriteObjectArrayList<T>> toList() {
|
||||||
|
return Collector.of(CopyOnWriteObjectArrayList::new, CopyOnWriteObjectArrayList::add, CopyOnWriteObjectArrayList::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a CopyOnWriteArrayList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> CopyOnWriteObjectArrayList KEY_GENERIC_TYPE toList(Stream<T> stream) {
|
||||||
|
return stream.collect(CopyOnWriteObjectArrayList::new, CopyOnWriteObjectArrayList::add, CopyOnWriteObjectArrayList::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CopyOnWriteObjectArrayList<T> merge(CopyOnWriteObjectArrayList<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a CopyOnWriteArrayList
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static COPY_ON_WRITE_LIST toList(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(COPY_ON_WRITE_LIST::new, COPY_ON_WRITE_LIST::add, COPY_ON_WRITE_LIST::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
private void setArray(KEY_TYPE[] data) {
|
private void setArray(KEY_TYPE[] data) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
@@ -779,6 +830,22 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER
|
|||||||
action.accept(input, data[i]);
|
action.accept(input, data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
KEY_TYPE[] data = this.data;
|
||||||
|
for(int i = 0,m=data.length;i<m;i++)
|
||||||
|
action.accept(data[i], input);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
KEY_TYPE[] data = this.data;
|
||||||
|
for(int i = 0,m=data.length;i<m;i++)
|
||||||
|
action.accept(i, data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -810,13 +877,13 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
KEY_TYPE[] data = this.data;
|
KEY_TYPE[] data = this.data;
|
||||||
for(int i = 0,m=data.length;i<m;i++) {
|
for(int i = 0,m=data.length;i<m;i++) {
|
||||||
if(filter.test(data[i])) return data[i];
|
if(filter.test(data[i])) return OPTIONAL.GET_OPTIONAL(data[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -845,7 +912,7 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE[] data = this.data;
|
KEY_TYPE[] data = this.data;
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
@@ -858,7 +925,7 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, data[i]);
|
state = operator.APPLY_VALUE(state, data[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+79
-9
@@ -3,10 +3,26 @@ package speiger.src.collections.PACKAGE.lists;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
#else if !TYPE_BOOLEAN
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
#endif
|
#endif
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if PRIMITIVES
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
import speiger.src.collections.PACKAGE.utils.COLLECTIONS;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -20,6 +36,7 @@ import java.util.function.PREDICATE;
|
|||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import java.util.function.JAVA_PREDICATE;
|
import java.util.function.JAVA_PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import java.util.function.JAVA_UNARY_OPERATOR;
|
import java.util.function.JAVA_UNARY_OPERATOR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -27,19 +44,22 @@ import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.utils.ARRAYS;
|
import speiger.src.collections.PACKAGE.utils.ARRAYS;
|
||||||
#endif
|
#endif
|
||||||
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
||||||
import speiger.src.collections.objects.utils.ObjectArrays;
|
import speiger.src.collections.objects.utils.ObjectArrays;
|
||||||
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
||||||
#if PRIMITIVES && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
|
||||||
import java.util.stream.JAVA_STREAM;
|
|
||||||
import java.util.stream.StreamSupport;
|
|
||||||
#endif
|
|
||||||
#if SPLIT_ITERATOR_FEATURE
|
#if SPLIT_ITERATOR_FEATURE
|
||||||
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
|
||||||
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
|
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
|
||||||
@@ -120,6 +140,42 @@ public class IMMUTABLE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_T
|
|||||||
data = Arrays.copyOfRange(a, offset, offset+length);
|
data = Arrays.copyOfRange(a, offset, offset+length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a ImmutableList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, COLLECTION<T>, ImmutableObjectList<T>> toList() {
|
||||||
|
return Collector.of(COLLECTIONS::wrapper, COLLECTION::add, ImmutableObjectList::merge, E -> new IMMUTABLE_LIST<>(E.toArray((T[])new Object[E.size()])));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ImmutableList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> ImmutableObjectList KEY_GENERIC_TYPE toList(Stream<T> stream) {
|
||||||
|
return stream.collect(toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> COLLECTION<T> merge(COLLECTION<T> a, COLLECTION<T> b) {
|
||||||
|
a.addAll(b);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ImmutableList
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static IMMUTABLE_LIST toList(JAVA_STREAM stream) {
|
||||||
|
return new IMMUTABLE_LIST(stream.collect((Supplier<COLLECTION>)COLLECTIONS::wrapper, COLLECTION::add, COLLECTION::addAll).TO_ARRAY());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public boolean add(KEY_TYPE e) { throw new UnsupportedOperationException(); }
|
public boolean add(KEY_TYPE e) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
@@ -307,6 +363,20 @@ public class IMMUTABLE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_T
|
|||||||
action.accept(input, data[i]);
|
action.accept(input, data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0,m=data.length;i<m;i++)
|
||||||
|
action.accept(data[i], input);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0,m=data.length;i<m;i++)
|
||||||
|
action.accept(i, data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -335,12 +405,12 @@ public class IMMUTABLE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_T
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0,m=data.length;i<m;i++) {
|
for(int i = 0,m=data.length;i<m;i++) {
|
||||||
if(filter.test(data[i])) return data[i];
|
if(filter.test(data[i])) return OPTIONAL.GET_OPTIONAL(data[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -367,7 +437,7 @@ public class IMMUTABLE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_T
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -379,7 +449,7 @@ public class IMMUTABLE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_T
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, data[i]);
|
state = operator.APPLY_VALUE(state, data[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+63
-6
@@ -4,7 +4,6 @@ package speiger.src.collections.PACKAGE.lists;
|
|||||||
#if DEQUEUE_FEATURE
|
#if DEQUEUE_FEATURE
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
#else if PRIMITIVES
|
#else if PRIMITIVES
|
||||||
import java.nio.JAVA_BUFFER;
|
import java.nio.JAVA_BUFFER;
|
||||||
@@ -12,6 +11,15 @@ import java.nio.JAVA_BUFFER;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
#if SPLIT_ITERATOR_FEATURE
|
#if SPLIT_ITERATOR_FEATURE
|
||||||
import java.util.Spliterator;
|
import java.util.Spliterator;
|
||||||
@@ -34,8 +42,14 @@ import java.util.function.JAVA_PREDICATE;
|
|||||||
#endif
|
#endif
|
||||||
import java.util.function.JAVA_UNARY_OPERATOR;
|
import java.util.function.JAVA_UNARY_OPERATOR;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -155,6 +169,42 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
for(int i = offset,m=offset+length;i<m;add(a[i++]));
|
for(int i = offset,m=offset+length;i<m;add(a[i++]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a LinkedList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, ObjectLinkedList<T>, ObjectLinkedList<T>> toList() {
|
||||||
|
return Collector.of(ObjectLinkedList::new, ObjectLinkedList::add, ObjectLinkedList::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a LinkedList
|
||||||
|
* @Type(T)
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> ObjectLinkedList KEY_GENERIC_TYPE toList(Stream<T> stream) {
|
||||||
|
return stream.collect(ObjectLinkedList::new, ObjectLinkedList::add, ObjectLinkedList::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ObjectLinkedList<T> merge(ObjectLinkedList<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a LinkedList
|
||||||
|
* @return a list with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static LINKED_LIST toList(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(LINKED_LIST::new, LINKED_LIST::add, LINKED_LIST::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public boolean add(KEY_TYPE e) {
|
public boolean add(KEY_TYPE e) {
|
||||||
add(size(), e);
|
add(size(), e);
|
||||||
@@ -465,6 +515,13 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
action.accept(input, entry.value);
|
action.accept(input, entry.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next)
|
||||||
|
action.accept(entry.value, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -493,12 +550,12 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next) {
|
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next) {
|
||||||
if(filter.test(entry.value)) return entry.value;
|
if(filter.test(entry.value)) return OPTIONAL.GET_OPTIONAL(entry.value);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -525,7 +582,7 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -537,7 +594,7 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.value);
|
state = operator.APPLY_VALUE(state, entry.value);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+91
-19
@@ -4,15 +4,18 @@ import java.util.Arrays;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.locks.StampedLock;
|
import java.util.concurrent.locks.StampedLock;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -22,15 +25,20 @@ import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
|||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !VALUE_BOOLEAN || !JDK_TYPE
|
#if !VALUE_BOOLEAN || !JDK_TYPE
|
||||||
@@ -40,9 +48,12 @@ import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
|||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_BOOLEAN && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#if!VALUE_BOOLEAN
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.maps.abstracts.ABSTRACT_MAP;
|
import speiger.src.collections.PACKAGE.maps.abstracts.ABSTRACT_MAP;
|
||||||
import speiger.src.collections.PACKAGE.maps.interfaces.MAP;
|
import speiger.src.collections.PACKAGE.maps.interfaces.MAP;
|
||||||
import speiger.src.collections.PACKAGE.maps.interfaces.CONCURRENT_MAP;
|
import speiger.src.collections.PACKAGE.maps.interfaces.CONCURRENT_MAP;
|
||||||
@@ -76,8 +87,12 @@ import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if VALUE_OBJECT
|
#if VALUE_OBJECT
|
||||||
@@ -751,6 +766,25 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0,m=segments.length;i<m;i++) {
|
||||||
|
Segment KEY_VALUE_GENERIC_TYPE seg = segments[i];
|
||||||
|
long stamp = seg.readLock();
|
||||||
|
try {
|
||||||
|
int index = seg.firstIndex;
|
||||||
|
while(index != -1) {
|
||||||
|
action.accept(new ValueMapEntry(index, i), input);
|
||||||
|
index = (int)seg.links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
seg.unlockRead(stamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -839,7 +873,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -863,11 +897,11 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
seg.unlockRead(stamp);
|
seg.unlockRead(stamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
MapEntry entry = new MapEntry();
|
MapEntry entry = new MapEntry();
|
||||||
for(int i = 0,m=segments.length;i<m;i++) {
|
for(int i = 0,m=segments.length;i<m;i++) {
|
||||||
@@ -877,7 +911,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
try {
|
try {
|
||||||
while(index != -1) {
|
while(index != -1) {
|
||||||
entry.set(index, i);
|
entry.set(index, i);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
index = (int)seg.links[index];
|
index = (int)seg.links[index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -885,7 +919,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
seg.unlockRead(stamp);
|
seg.unlockRead(stamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1080,6 +1114,25 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0,m=segments.length;i<m;i++) {
|
||||||
|
Segment KEY_VALUE_GENERIC_TYPE seg = segments[i];
|
||||||
|
long stamp = seg.readLock();
|
||||||
|
try {
|
||||||
|
int index = seg.firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(seg.keys[index], input);
|
||||||
|
index = (int)seg.links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
seg.unlockRead(stamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1186,7 +1239,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1210,11 +1263,11 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
seg.unlockRead(stamp);
|
seg.unlockRead(stamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0,m=segments.length;i<m;i++) {
|
for(int i = 0,m=segments.length;i<m;i++) {
|
||||||
Segment KEY_VALUE_GENERIC_TYPE seg = segments[i];
|
Segment KEY_VALUE_GENERIC_TYPE seg = segments[i];
|
||||||
@@ -1222,7 +1275,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
try {
|
try {
|
||||||
int index = seg.firstIndex;
|
int index = seg.firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(seg.keys[index])) return seg.keys[index];
|
if(filter.test(seg.keys[index])) return OPTIONAL.GET_OPTIONAL(seg.keys[index]);
|
||||||
index = (int)seg.links[index];
|
index = (int)seg.links[index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1230,7 +1283,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
seg.unlockRead(stamp);
|
seg.unlockRead(stamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1348,6 +1401,25 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0,m=segments.length;i<m;i++) {
|
||||||
|
Segment KEY_VALUE_GENERIC_TYPE seg = segments[i];
|
||||||
|
long stamp = seg.readLock();
|
||||||
|
try {
|
||||||
|
int index = seg.firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(seg.values[index], input);
|
||||||
|
index = (int)seg.links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
seg.unlockRead(stamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1454,7 +1526,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1478,20 +1550,20 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
seg.unlockRead(stamp);
|
seg.unlockRead(stamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return VALUE_OPTIONAL.empty();
|
||||||
for(int i = 0,m=segments.length;i<m;i++) {
|
for(int i = 0,m=segments.length;i<m;i++) {
|
||||||
Segment KEY_VALUE_GENERIC_TYPE seg = segments[i];
|
Segment KEY_VALUE_GENERIC_TYPE seg = segments[i];
|
||||||
long stamp = seg.readLock();
|
long stamp = seg.readLock();
|
||||||
try {
|
try {
|
||||||
int index = seg.firstIndex;
|
int index = seg.firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(seg.values[index])) return seg.values[index];
|
if(filter.test(seg.values[index])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(seg.values[index]);
|
||||||
index = (int)seg.links[index];
|
index = (int)seg.links[index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1499,7 +1571,7 @@ public class CONCURRENT_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY
|
|||||||
seg.unlockRead(stamp);
|
seg.unlockRead(stamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+96
-43
@@ -4,32 +4,41 @@ import java.util.Arrays;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
||||||
@@ -56,9 +65,13 @@ import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -233,13 +246,13 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
VALUE_TYPE lastValue = values[nullIndex];
|
VALUE_TYPE lastValue = values[nullIndex];
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
||||||
@@ -247,7 +260,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
if(strategy.equals(keys[pos], key)) {
|
if(strategy.equals(keys[pos], key)) {
|
||||||
VALUE_TYPE lastValue = values[pos];
|
VALUE_TYPE lastValue = values[pos];
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -255,7 +268,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -267,13 +280,13 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
VALUE_TYPE lastValue = values[nullIndex];
|
VALUE_TYPE lastValue = values[nullIndex];
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
||||||
@@ -281,7 +294,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
if(strategy.equals(keys[pos], key)) {
|
if(strategy.equals(keys[pos], key)) {
|
||||||
VALUE_TYPE lastValue = values[pos];
|
VALUE_TYPE lastValue = values[pos];
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -289,7 +302,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -302,7 +315,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
||||||
@@ -313,7 +326,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -326,7 +339,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
||||||
@@ -337,7 +350,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -348,7 +361,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
if(isEmpty() || strategy.equals(FIRST_ENTRY_KEY(), key)) return false;
|
if(isEmpty() || strategy.equals(FIRST_ENTRY_KEY(), key)) return false;
|
||||||
if(strategy.equals(key, EMPTY_KEY_VALUE)) {
|
if(strategy.equals(key, EMPTY_KEY_VALUE)) {
|
||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -356,7 +369,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
||||||
while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) {
|
while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) {
|
||||||
if(strategy.equals(keys[pos], key)) {
|
if(strategy.equals(keys[pos], key)) {
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -370,7 +383,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
if(isEmpty() || strategy.equals(LAST_ENTRY_KEY(), key)) return false;
|
if(isEmpty() || strategy.equals(LAST_ENTRY_KEY(), key)) return false;
|
||||||
if(strategy.equals(key, EMPTY_KEY_VALUE)) {
|
if(strategy.equals(key, EMPTY_KEY_VALUE)) {
|
||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -378,7 +391,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
int pos = HashUtil.mix(strategy.hashCode(key)) & mask;
|
||||||
while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) {
|
while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) {
|
||||||
if(strategy.equals(keys[pos], key)) {
|
if(strategy.equals(keys[pos], key)) {
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -391,7 +404,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
public VALUE_TYPE getAndMoveToFirst(KEY_TYPE key) {
|
public VALUE_TYPE getAndMoveToFirst(KEY_TYPE key) {
|
||||||
int index = findIndex(key);
|
int index = findIndex(key);
|
||||||
if(index < 0) return getDefaultReturnValue();
|
if(index < 0) return getDefaultReturnValue();
|
||||||
moveToFirstIndex(index);
|
moveToFirstIndex(index, false);
|
||||||
return values[index];
|
return values[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,7 +412,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
public VALUE_TYPE getAndMoveToLast(KEY_TYPE key) {
|
public VALUE_TYPE getAndMoveToLast(KEY_TYPE key) {
|
||||||
int index = findIndex(key);
|
int index = findIndex(key);
|
||||||
if(index < 0) return getDefaultReturnValue();
|
if(index < 0) return getDefaultReturnValue();
|
||||||
moveToLastIndex(index);
|
moveToLastIndex(index, false);
|
||||||
return values[index];
|
return values[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -575,8 +588,8 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
containsNull = false;
|
containsNull = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void moveToFirstIndex(int startPos) {
|
protected void moveToFirstIndex(int startPos, boolean adding) {
|
||||||
if(size == 1 || firstIndex == startPos) return;
|
if(size == (adding ? 0 : 1) || firstIndex == startPos) return;
|
||||||
if(lastIndex == startPos) {
|
if(lastIndex == startPos) {
|
||||||
lastIndex = (int)(links[startPos] >>> 32);
|
lastIndex = (int)(links[startPos] >>> 32);
|
||||||
links[lastIndex] |= 0xFFFFFFFFL;
|
links[lastIndex] |= 0xFFFFFFFFL;
|
||||||
@@ -593,8 +606,8 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
firstIndex = startPos;
|
firstIndex = startPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void moveToLastIndex(int startPos) {
|
protected void moveToLastIndex(int startPos, boolean adding) {
|
||||||
if(size == 1 || lastIndex == startPos) return;
|
if(size == (adding ? 0 : 1) || lastIndex == startPos) return;
|
||||||
if(firstIndex == startPos) {
|
if(firstIndex == startPos) {
|
||||||
firstIndex = (int)links[startPos];
|
firstIndex = (int)links[startPos];
|
||||||
links[lastIndex] |= 0xFFFFFFFF00000000L;
|
links[lastIndex] |= 0xFFFFFFFF00000000L;
|
||||||
@@ -708,6 +721,10 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
||||||
|
@Override
|
||||||
|
public void addFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
@@ -818,6 +835,17 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1) {
|
||||||
|
action.accept(new ValueMapEntry(index), input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -873,7 +901,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -888,21 +916,21 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
state = operator.apply(state, new ValueMapEntry(index));
|
state = operator.apply(state, new ValueMapEntry(index));
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
MapEntry entry = new MapEntry();
|
MapEntry entry = new MapEntry();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1) {
|
while(index != -1) {
|
||||||
entry.set(index);
|
entry.set(index);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1000,9 +1028,12 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
@@ -1096,6 +1127,17 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(keys[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1160,7 +1202,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1175,19 +1217,19 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
state = operator.APPLY_KEY_VALUE(state, keys[index]);
|
state = operator.APPLY_KEY_VALUE(state, keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_KEY_VALUE;
|
if(size() <= 0) return OPTIONAL.empty();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(keys[index])) return keys[index];
|
if(filter.test(keys[index])) return OPTIONAL.GET_OPTIONAL(keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1279,6 +1321,17 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(values[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1343,7 +1396,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1358,19 +1411,19 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
|
|||||||
state = operator.APPLY_VALUE(state, values[index]);
|
state = operator.APPLY_VALUE(state, values[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return VALUE_OPTIONAL.empty();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(values[index])) return values[index];
|
if(filter.test(values[index])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+69
-25
@@ -5,29 +5,37 @@ import java.util.ConcurrentModificationException;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !VALUE_BOOLEAN || !JDK_TYPE
|
#if !VALUE_BOOLEAN || !JDK_TYPE
|
||||||
@@ -37,9 +45,12 @@ import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
|||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_BOOLEAN && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#if !VALUE_BOOLEAN
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.maps.abstracts.ABSTRACT_MAP;
|
import speiger.src.collections.PACKAGE.maps.abstracts.ABSTRACT_MAP;
|
||||||
import speiger.src.collections.PACKAGE.maps.interfaces.MAP;
|
import speiger.src.collections.PACKAGE.maps.interfaces.MAP;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -71,10 +82,13 @@ import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
|||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.objects.collections.ObjectIterator;
|
import speiger.src.collections.objects.collections.ObjectIterator;
|
||||||
@@ -1023,6 +1037,16 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(new ValueMapEntry(nullIndex), input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(new ValueMapEntry(i), input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1090,7 +1114,7 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1107,25 +1131,25 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
}
|
}
|
||||||
state = operator.apply(state, new ValueMapEntry(i));
|
state = operator.apply(state, new ValueMapEntry(i));
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
MapEntry entry = new MapEntry();
|
MapEntry entry = new MapEntry();
|
||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
entry.set(nullIndex);
|
entry.set(nullIndex);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
}
|
}
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) {
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) {
|
||||||
entry.set(i);
|
entry.set(i);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1270,6 +1294,16 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(keys[nullIndex], input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(keys[i], input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1331,7 +1365,7 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1348,18 +1382,18 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_KEY_VALUE(state, keys[i]);
|
state = operator.APPLY_KEY_VALUE(state, keys[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_KEY_VALUE;
|
if(size() <= 0) return OPTIONAL.empty();
|
||||||
if(containsNull && filter.test(keys[nullIndex])) return keys[nullIndex];
|
if(containsNull && filter.test(keys[nullIndex])) return OPTIONAL.GET_OPTIONAL(keys[nullIndex]);
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE) && filter.test(keys[i])) return keys[i];
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE) && filter.test(keys[i])) return OPTIONAL.GET_OPTIONAL(keys[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1436,6 +1470,16 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(values[nullIndex], input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(values[i], input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1497,7 +1541,7 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1514,18 +1558,18 @@ public class CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VAL
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, values[i]);
|
state = operator.APPLY_VALUE(state, values[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return VALUE_OPTIONAL.empty();
|
||||||
if(containsNull && filter.test(values[nullIndex])) return values[nullIndex];
|
if(containsNull && filter.test(values[nullIndex])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[nullIndex]);
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE) && filter.test(values[i])) return values[i];
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE) && filter.test(values[i])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+100
-45
@@ -4,32 +4,41 @@ import java.util.Arrays;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
||||||
@@ -54,10 +63,13 @@ import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
|||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -210,13 +222,13 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
VALUE_TYPE lastValue = values[nullIndex];
|
VALUE_TYPE lastValue = values[nullIndex];
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
||||||
@@ -224,7 +236,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
if(KEY_EQUALS(keys[pos], key)) {
|
if(KEY_EQUALS(keys[pos], key)) {
|
||||||
VALUE_TYPE lastValue = values[pos];
|
VALUE_TYPE lastValue = values[pos];
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -232,7 +244,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -244,13 +256,13 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
VALUE_TYPE lastValue = values[nullIndex];
|
VALUE_TYPE lastValue = values[nullIndex];
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
||||||
@@ -258,7 +270,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
if(KEY_EQUALS(keys[pos], key)) {
|
if(KEY_EQUALS(keys[pos], key)) {
|
||||||
VALUE_TYPE lastValue = values[pos];
|
VALUE_TYPE lastValue = values[pos];
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, false);
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -266,7 +278,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -279,18 +291,18 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
||||||
while(KEY_EQUALS_NULL(key)) {
|
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
||||||
if(KEY_EQUALS(keys[pos], key)) return values[pos];
|
if(KEY_EQUALS(keys[pos], key)) return values[pos];
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
}
|
}
|
||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -303,18 +315,18 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
values[nullIndex] = value;
|
values[nullIndex] = value;
|
||||||
containsNull = true;
|
containsNull = true;
|
||||||
onNodeAdded(nullIndex);
|
onNodeAdded(nullIndex);
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
||||||
while(KEY_EQUALS_NULL(key)) {
|
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
||||||
if(KEY_EQUALS(keys[pos], key)) return values[pos];
|
if(KEY_EQUALS(keys[pos], key)) return values[pos];
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
}
|
}
|
||||||
keys[pos] = key;
|
keys[pos] = key;
|
||||||
values[pos] = value;
|
values[pos] = value;
|
||||||
onNodeAdded(pos);
|
onNodeAdded(pos);
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, true);
|
||||||
}
|
}
|
||||||
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
return getDefaultReturnValue();
|
return getDefaultReturnValue();
|
||||||
@@ -325,7 +337,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
if(isEmpty() || KEY_EQUALS(FIRST_ENTRY_KEY(), key)) return false;
|
if(isEmpty() || KEY_EQUALS(FIRST_ENTRY_KEY(), key)) return false;
|
||||||
if(KEY_EQUALS_NULL(key)) {
|
if(KEY_EQUALS_NULL(key)) {
|
||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
moveToFirstIndex(nullIndex);
|
moveToFirstIndex(nullIndex, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -333,7 +345,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
||||||
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
||||||
if(KEY_EQUALS(keys[pos], key)) {
|
if(KEY_EQUALS(keys[pos], key)) {
|
||||||
moveToFirstIndex(pos);
|
moveToFirstIndex(pos, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -347,7 +359,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
if(isEmpty() || KEY_EQUALS(LAST_ENTRY_KEY(), key)) return false;
|
if(isEmpty() || KEY_EQUALS(LAST_ENTRY_KEY(), key)) return false;
|
||||||
if(KEY_EQUALS_NULL(key)) {
|
if(KEY_EQUALS_NULL(key)) {
|
||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
moveToLastIndex(nullIndex);
|
moveToLastIndex(nullIndex, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -355,7 +367,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask;
|
||||||
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
||||||
if(KEY_EQUALS(keys[pos], key)) {
|
if(KEY_EQUALS(keys[pos], key)) {
|
||||||
moveToLastIndex(pos);
|
moveToLastIndex(pos, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
pos = ++pos & mask;
|
pos = ++pos & mask;
|
||||||
@@ -368,7 +380,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
public VALUE_TYPE getAndMoveToFirst(KEY_TYPE key) {
|
public VALUE_TYPE getAndMoveToFirst(KEY_TYPE key) {
|
||||||
int index = findIndex(key);
|
int index = findIndex(key);
|
||||||
if(index < 0) return getDefaultReturnValue();
|
if(index < 0) return getDefaultReturnValue();
|
||||||
moveToFirstIndex(index);
|
moveToFirstIndex(index, false);
|
||||||
return values[index];
|
return values[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,7 +388,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
public VALUE_TYPE getAndMoveToLast(KEY_TYPE key) {
|
public VALUE_TYPE getAndMoveToLast(KEY_TYPE key) {
|
||||||
int index = findIndex(key);
|
int index = findIndex(key);
|
||||||
if(index < 0) return getDefaultReturnValue();
|
if(index < 0) return getDefaultReturnValue();
|
||||||
moveToLastIndex(index);
|
moveToLastIndex(index, false);
|
||||||
return values[index];
|
return values[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -579,8 +591,8 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
containsNull = false;
|
containsNull = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void moveToFirstIndex(int startPos) {
|
protected void moveToFirstIndex(int startPos, boolean adding) {
|
||||||
if(size == 1 || firstIndex == startPos) return;
|
if(size == (adding ? 0 : 1) || firstIndex == startPos) return;
|
||||||
if(lastIndex == startPos) {
|
if(lastIndex == startPos) {
|
||||||
lastIndex = (int)(links[startPos] >>> 32);
|
lastIndex = (int)(links[startPos] >>> 32);
|
||||||
links[lastIndex] |= 0xFFFFFFFFL;
|
links[lastIndex] |= 0xFFFFFFFFL;
|
||||||
@@ -597,8 +609,8 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
firstIndex = startPos;
|
firstIndex = startPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void moveToLastIndex(int startPos) {
|
protected void moveToLastIndex(int startPos, boolean adding) {
|
||||||
if(size == 1 || lastIndex == startPos) return;
|
if(size == (adding ? 0 : 1) || lastIndex == startPos) return;
|
||||||
if(firstIndex == startPos) {
|
if(firstIndex == startPos) {
|
||||||
firstIndex = (int)links[startPos];
|
firstIndex = (int)links[startPos];
|
||||||
links[lastIndex] |= 0xFFFFFFFF00000000L;
|
links[lastIndex] |= 0xFFFFFFFF00000000L;
|
||||||
@@ -712,6 +724,10 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
||||||
|
@Override
|
||||||
|
public void addFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
@@ -822,6 +838,17 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1) {
|
||||||
|
action.accept(new ValueMapEntry(index), input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -877,7 +904,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -892,21 +919,21 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
state = operator.apply(state, new ValueMapEntry(index));
|
state = operator.apply(state, new ValueMapEntry(index));
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
MapEntry entry = new MapEntry();
|
MapEntry entry = new MapEntry();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1) {
|
while(index != -1) {
|
||||||
entry.set(index);
|
entry.set(index);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -999,6 +1026,12 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
@Override
|
@Override
|
||||||
public boolean add(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean add(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
@@ -1095,6 +1128,17 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(keys[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1159,7 +1203,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1174,19 +1218,19 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
state = operator.APPLY_KEY_VALUE(state, keys[index]);
|
state = operator.APPLY_KEY_VALUE(state, keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_KEY_VALUE;
|
if(size() <= 0) return OPTIONAL.empty();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(keys[index])) return keys[index];
|
if(filter.test(keys[index])) return OPTIONAL.GET_OPTIONAL(keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1280,6 +1324,17 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(values[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1344,7 +1399,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1359,19 +1414,19 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
|
|||||||
state = operator.APPLY_VALUE(state, values[index]);
|
state = operator.APPLY_VALUE(state, values[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return VALUE_OPTIONAL.empty();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(values[index])) return values[index];
|
if(filter.test(values[index])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+69
-25
@@ -5,29 +5,37 @@ import java.util.ConcurrentModificationException;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !VALUE_BOOLEAN || !JDK_TYPE
|
#if !VALUE_BOOLEAN || !JDK_TYPE
|
||||||
@@ -37,9 +45,12 @@ import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
|||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_BOOLEAN && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#if !VALUE_BOOLEAN
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.maps.abstracts.ABSTRACT_MAP;
|
import speiger.src.collections.PACKAGE.maps.abstracts.ABSTRACT_MAP;
|
||||||
import speiger.src.collections.PACKAGE.maps.interfaces.MAP;
|
import speiger.src.collections.PACKAGE.maps.interfaces.MAP;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -70,9 +81,12 @@ import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.objects.collections.ObjectIterator;
|
import speiger.src.collections.objects.collections.ObjectIterator;
|
||||||
@@ -982,6 +996,16 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(new ValueMapEntry(nullIndex), input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(new ValueMapEntry(i), input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1049,7 +1073,7 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1066,25 +1090,25 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
}
|
}
|
||||||
state = operator.apply(state, new ValueMapEntry(i));
|
state = operator.apply(state, new ValueMapEntry(i));
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
MapEntry entry = new MapEntry();
|
MapEntry entry = new MapEntry();
|
||||||
if(containsNull) {
|
if(containsNull) {
|
||||||
entry.set(nullIndex);
|
entry.set(nullIndex);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
}
|
}
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(KEY_EQUALS_NOT_NULL(keys[i])) {
|
if(KEY_EQUALS_NOT_NULL(keys[i])) {
|
||||||
entry.set(i);
|
entry.set(i);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1225,6 +1249,16 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(keys[nullIndex], input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(keys[i], input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1286,7 +1320,7 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1303,18 +1337,18 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_KEY_VALUE(state, keys[i]);
|
state = operator.APPLY_KEY_VALUE(state, keys[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_KEY_VALUE;
|
if(size() <= 0) return OPTIONAL.empty();
|
||||||
if(containsNull && filter.test(keys[nullIndex])) return keys[nullIndex];
|
if(containsNull && filter.test(keys[nullIndex])) return OPTIONAL.GET_OPTIONAL(keys[nullIndex]);
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(KEY_EQUALS_NOT_NULL(keys[i]) && filter.test(keys[i])) return keys[i];
|
if(KEY_EQUALS_NOT_NULL(keys[i]) && filter.test(keys[i])) return OPTIONAL.GET_OPTIONAL(keys[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1391,6 +1425,16 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(values[nullIndex], input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(values[i], input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1452,7 +1496,7 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1469,18 +1513,18 @@ public class HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GENE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, values[i]);
|
state = operator.APPLY_VALUE(state, values[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return VALUE_OPTIONAL.empty();
|
||||||
if(containsNull && filter.test(values[nullIndex])) return values[nullIndex];
|
if(containsNull && filter.test(values[nullIndex])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[nullIndex]);
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(KEY_EQUALS_NOT_NULL(keys[i]) && filter.test(values[i])) return values[i];
|
if(KEY_EQUALS_NOT_NULL(keys[i]) && filter.test(values[i])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+79
-21
@@ -4,32 +4,43 @@ import java.util.Arrays;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_BOOLEAN && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#if !VALUE_BOOLEAN
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !VALUE_BOOLEAN || !JDK_TYPE
|
#if !VALUE_BOOLEAN || !JDK_TYPE
|
||||||
@@ -59,6 +70,7 @@ import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_C
|
|||||||
#endif
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -75,6 +87,9 @@ import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_CONSUMER;
|
|||||||
import speiger.src.collections.VALUE_PACKAGE.lists.VALUE_LIST_ITERATOR;
|
import speiger.src.collections.VALUE_PACKAGE.lists.VALUE_LIST_ITERATOR;
|
||||||
import speiger.src.collections.VALUE_PACKAGE.utils.VALUE_ARRAYS;
|
import speiger.src.collections.VALUE_PACKAGE.utils.VALUE_ARRAYS;
|
||||||
#endif
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.objects.collections.ObjectBidirectionalIterator;
|
import speiger.src.collections.objects.collections.ObjectBidirectionalIterator;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -630,6 +645,10 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
||||||
|
@Override
|
||||||
|
public void addFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
@@ -728,6 +747,17 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1) {
|
||||||
|
action.accept(new BasicEntryKV_BRACES(keys[index], values[index]), input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -783,7 +813,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -798,21 +828,21 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
state = operator.apply(state, new BasicEntryKV_BRACES(keys[index], values[index]));
|
state = operator.apply(state, new BasicEntryKV_BRACES(keys[index], values[index]));
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES();
|
BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1) {
|
while(index != -1) {
|
||||||
entry.set(keys[index], values[index]);
|
entry.set(keys[index], values[index]);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -887,6 +917,12 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
@@ -973,6 +1009,17 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(keys[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1037,7 +1084,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1052,19 +1099,19 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
state = operator.APPLY_KEY_VALUE(state, keys[index]);
|
state = operator.APPLY_KEY_VALUE(state, keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_KEY_VALUE;
|
if(size() <= 0) return OPTIONAL.empty();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(keys[index])) return keys[index];
|
if(filter.test(keys[index])) return OPTIONAL.GET_OPTIONAL(keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1149,6 +1196,17 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1){
|
||||||
|
action.accept(values[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1213,7 +1271,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1228,19 +1286,19 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
|
|||||||
state = operator.APPLY_VALUE(state, values[index]);
|
state = operator.APPLY_VALUE(state, values[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return VALUE_OPTIONAL.empty();
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1){
|
while(index != -1){
|
||||||
if(filter.test(values[index])) return values[index];
|
if(filter.test(values[index])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+68
-20
@@ -4,32 +4,43 @@ import java.util.Arrays;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_BOOLEAN && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#if!VALUE_BOOLEAN
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !VALUE_BOOLEAN || !JDK_TYPE
|
#if !VALUE_BOOLEAN || !JDK_TYPE
|
||||||
@@ -60,12 +71,16 @@ import speiger.src.collections.VALUE_PACKAGE.lists.VALUE_LIST_ITERATOR;
|
|||||||
import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
#if VALUE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if !VALUE_OBJECT
|
#if !VALUE_OBJECT
|
||||||
@@ -861,6 +876,10 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
||||||
|
@Override
|
||||||
|
public void addFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
@@ -961,6 +980,13 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
action.accept(input, new ValueMapEntry(i));
|
action.accept(input, new ValueMapEntry(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;i++) {
|
||||||
|
action.accept(new ValueMapEntry(i), input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
@@ -1009,7 +1035,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1021,19 +1047,19 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
}
|
}
|
||||||
state = operator.apply(state, new ValueMapEntry(i));
|
state = operator.apply(state, new ValueMapEntry(i));
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
MapEntry entry = new MapEntry();
|
MapEntry entry = new MapEntry();
|
||||||
for(int i = 0;i<size;i++) {
|
for(int i = 0;i<size;i++) {
|
||||||
entry.set(i);
|
entry.set(i);
|
||||||
if(filter.test(entry)) return entry;
|
if(filter.test(entry)) return Optional.ofNullable(entry);
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1119,6 +1145,10 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
@Override
|
@Override
|
||||||
public boolean add(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean add(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@@ -1166,6 +1196,12 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
for(int i = 0;i<size;action.accept(input, keys[i++]));
|
for(int i = 0;i<size;action.accept(input, keys[i++]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;action.accept(keys[i++], input));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1218,7 +1254,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1230,16 +1266,16 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_KEY_VALUE(state, keys[i]);
|
state = operator.APPLY_KEY_VALUE(state, keys[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0;i<size;i++) {
|
for(int i = 0;i<size;i++) {
|
||||||
if(filter.test(keys[i])) return keys[i];
|
if(filter.test(keys[i])) return OPTIONAL.GET_OPTIONAL(keys[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1308,6 +1344,18 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
for(int i = 0;i<size;action.accept(i, values[i++]));
|
for(int i = 0;i<size;action.accept(i, values[i++]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(E input, VALUE_BI_FROM_OBJECT_CONSUMER VSV_GENERIC_TYPE<E> action) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;action.accept(input, values[i++]));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;action.accept(values[i++], input));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1359,7 +1407,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1371,16 +1419,16 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, values[i]);
|
state = operator.APPLY_VALUE(state, values[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0;i<size;i++) {
|
for(int i = 0;i<size;i++) {
|
||||||
if(filter.test(values[i])) return values[i];
|
if(filter.test(values[i])) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(values[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+8
-1
@@ -473,6 +473,10 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
private class MapEntrySet extends AbstractObjectSet<MAP.Entry KEY_VALUE_GENERIC_TYPE> implements ORDERED_MAP.FastOrderedSet KEY_VALUE_GENERIC_TYPE {
|
||||||
|
@Override
|
||||||
|
public void addFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
@@ -637,7 +641,10 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
|
|||||||
public boolean add(T o) {
|
public boolean add(T o) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public void addFirst(T o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(T o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(T o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(T o) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
|
|||||||
+1581
File diff suppressed because it is too large
Load Diff
+1572
File diff suppressed because it is too large
Load Diff
+73
-30
@@ -6,15 +6,18 @@ import java.util.Map;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
#endif
|
#endif
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -23,9 +26,14 @@ import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
|||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
@@ -34,12 +42,15 @@ import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUME
|
|||||||
#if !VALUE_BOOLEAN || !JDK_TYPE
|
#if !VALUE_BOOLEAN || !JDK_TYPE
|
||||||
import speiger.src.collections.PACKAGE.functions.function.FUNCTION;
|
import speiger.src.collections.PACKAGE.functions.function.FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_BOOLEAN && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#if!VALUE_BOOLEAN
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
||||||
@@ -70,9 +81,13 @@ import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#if !TYPE_OBJECT && !VALUE_OBJECT
|
||||||
@@ -1277,6 +1292,13 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
action.accept(input, entry.key);
|
action.accept(input, entry.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = start(), end = end();entry != null && (end == null || (end != previous(entry)));entry = next(entry))
|
||||||
|
action.accept(entry.key, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1323,7 +1345,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1335,15 +1357,15 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_KEY_VALUE(state, entry.key);
|
state = operator.APPLY_KEY_VALUE(state, entry.key);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = start(), end = end();entry != null && (end == null || (end != previous(entry)));entry = next(entry))
|
for(Node KEY_VALUE_GENERIC_TYPE entry = start(), end = end();entry != null && (end == null || (end != previous(entry)));entry = next(entry))
|
||||||
if(filter.test(entry.key)) return entry.key;
|
if(filter.test(entry.key)) return OPTIONAL.GET_OPTIONAL(entry.key);
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1979,6 +2001,13 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
||||||
|
action.accept(new BasicEntryKV_BRACES(entry.key, entry.value), input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -2026,7 +2055,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2038,19 +2067,19 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
}
|
}
|
||||||
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry)) {
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry)) {
|
||||||
subEntry.set(entry.key, entry.value);
|
subEntry.set(entry.key, entry.value);
|
||||||
if(filter.test(subEntry)) return subEntry;
|
if(filter.test(subEntry)) return Optional.ofNullable(subEntry);
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2119,6 +2148,13 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
action.accept(input, entry.value);
|
action.accept(input, entry.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
||||||
|
action.accept(entry.value, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -2165,7 +2201,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2177,15 +2213,15 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.value);
|
state = operator.APPLY_VALUE(state, entry.value);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
||||||
if(filter.test(entry.value)) return entry.value;
|
if(filter.test(entry.value)) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(entry.value);
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2521,7 +2557,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2533,15 +2569,15 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.value);
|
state = operator.APPLY_VALUE(state, entry.value);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
||||||
if(filter.test(entry.value)) return entry.value;
|
if(filter.test(entry.value)) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(entry.value);
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2640,6 +2676,13 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
||||||
|
action.accept(new BasicEntryKV_BRACES(entry.key, entry.value), input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -2687,7 +2730,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2699,19 +2742,19 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_
|
|||||||
}
|
}
|
||||||
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
||||||
subEntry.set(entry.key, entry.value);
|
subEntry.set(entry.key, entry.value);
|
||||||
if(filter.test(subEntry)) return subEntry;
|
if(filter.test(subEntry)) return Optional.ofNullable(subEntry);
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+80
-31
@@ -6,15 +6,18 @@ import java.util.Map;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
#endif
|
#endif
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
#if !TYPE_OBJECT && JDK_TYPE
|
#if !TYPE_OBJECT && JDK_TYPE
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
|
import java.util.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
#if !SAME_TYPE && JDK_VALUE && !VALUE_OBJECT
|
||||||
import java.util.function.VALUE_PREDICATE;
|
import java.util.function.VALUE_PREDICATE;
|
||||||
|
import java.util.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
@@ -22,9 +25,14 @@ import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
|||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !VALUE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TYPE_INT || !SAME_TYPE
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#endif
|
||||||
|
#if !TYPE_OBJECT && !VALUE_OBJECT && !TYPE_INT
|
||||||
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
|
||||||
#endif
|
#endif
|
||||||
#if !SAME_TYPE && !TYPE_INT
|
#if !SAME_TYPE && !TYPE_INT
|
||||||
@@ -33,12 +41,15 @@ import speiger.src.collections.ints.functions.consumer.VALUE_BI_FROM_INT_CONSUME
|
|||||||
#if !VALUE_BOOLEAN || !JDK_TYPE
|
#if !VALUE_BOOLEAN || !JDK_TYPE
|
||||||
import speiger.src.collections.PACKAGE.functions.function.FUNCTION;
|
import speiger.src.collections.PACKAGE.functions.function.FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_INT || !SAME_TYPE
|
#if !TYPE_INT || !SAME_TYPE || !VALUE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_BOOLEAN && !JDK_TYPE
|
#if !TYPE_OBJECT && !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#if!VALUE_BOOLEAN
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.SINGLE_UNARY_OPERATOR;
|
||||||
@@ -68,10 +79,13 @@ import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
|
|||||||
#if !SAME_TYPE
|
#if !SAME_TYPE
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.VALUE_BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
|
#if !VALUE_OBJECT && !VALUE_INT
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.consumer.VALUE_BI_TO_OBJECT_CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
#if !JDK_VALUE
|
#if !JDK_VALUE
|
||||||
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE;
|
||||||
|
import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if !TYPE_OBJECT && !VALUE_OBJECT
|
#if !TYPE_OBJECT && !VALUE_OBJECT
|
||||||
@@ -1333,6 +1347,13 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
action.accept(input, entry.key);
|
action.accept(input, entry.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = start(), end = end();entry != null && (end == null || (end != previous(entry)));entry = next(entry))
|
||||||
|
action.accept(entry.key, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1379,7 +1400,7 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(SINGLE_UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_KEY_VALUE;
|
KEY_TYPE state = EMPTY_KEY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1391,15 +1412,15 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_KEY_VALUE(state, entry.key);
|
state = operator.APPLY_KEY_VALUE(state, entry.key);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = start(), end = end();entry != null && (end == null || (end != previous(entry)));entry = next(entry))
|
for(Node KEY_VALUE_GENERIC_TYPE entry = start(), end = end();entry != null && (end == null || (end != previous(entry)));entry = next(entry))
|
||||||
if(filter.test(entry.key)) return entry.key;
|
if(filter.test(entry.key)) return OPTIONAL.GET_OPTIONAL(entry.key);
|
||||||
return EMPTY_KEY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2045,6 +2066,13 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
||||||
|
action.accept(new BasicEntryKV_BRACES(entry.key, entry.value), input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -2092,7 +2120,7 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2104,19 +2132,19 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry)) {
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry)) {
|
||||||
subEntry.set(entry.key, entry.value);
|
subEntry.set(entry.key, entry.value);
|
||||||
if(filter.test(subEntry)) return subEntry;
|
if(filter.test(subEntry)) return Optional.ofNullable(subEntry);
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2185,6 +2213,13 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
action.accept(input, entry.value);
|
action.accept(input, entry.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
||||||
|
action.accept(entry.value, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -2231,7 +2266,7 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2243,15 +2278,15 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.value);
|
state = operator.APPLY_VALUE(state, entry.value);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
for(Node KEY_VALUE_GENERIC_TYPE entry = subLowest(), last = subHighest();entry != null && (last == null || last != previous(entry));entry = next(entry))
|
||||||
if(filter.test(entry.value)) return entry.value;
|
if(filter.test(entry.value)) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(entry.value);
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2541,6 +2576,13 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
action.accept(input, entry.value);
|
action.accept(input, entry.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(VALUE_BI_TO_OBJECT_CONSUMER VVS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
||||||
|
action.accept(entry.value, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public boolean matchesAny(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -2587,7 +2629,7 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE reduce(VALUE_SINGLE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
VALUE_TYPE state = EMPTY_VALUE;
|
VALUE_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2599,15 +2641,15 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.value);
|
state = operator.APPLY_VALUE(state, entry.value);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? VALUE_OPTIONAL.empty() : VALUE_OPTIONAL.GET_OPTIONAL_VALUE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VALUE_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
public VALUE_OPTIONAL VALUE_GENERIC_TYPE findFirst(VALUE_PREDICATE VALUE_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
||||||
if(filter.test(entry.value)) return entry.value;
|
if(filter.test(entry.value)) return VALUE_OPTIONAL.GET_OPTIONAL_VALUE(entry.value);
|
||||||
return EMPTY_VALUE;
|
return VALUE_OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2706,6 +2748,13 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
action.accept(input, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(ObjectObjectConsumer<MAP.Entry KEY_VALUE_GENERIC_TYPE, E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
||||||
|
action.accept(new BasicEntryKV_BRACES(entry.key, entry.value), input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public boolean matchesAny(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -2753,7 +2802,7 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> reduce(ObjectObjectUnaryOperator<MAP.Entry KEY_VALUE_GENERIC_TYPE, MAP.Entry KEY_VALUE_GENERIC_TYPE> operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
MAP.Entry KEY_VALUE_GENERIC_TYPE state = null;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -2765,19 +2814,19 @@ public class RB_TREE_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_G
|
|||||||
}
|
}
|
||||||
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
state = operator.apply(state, new BasicEntryKV_BRACES(entry.key, entry.value));
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? Optional.empty() : Optional.ofNullable(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MAP.Entry KEY_VALUE_GENERIC_TYPE findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
public Optional<MAP.Entry KEY_VALUE_GENERIC_TYPE> findFirst(Predicate<MAP.Entry KEY_VALUE_GENERIC_TYPE> filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return null;
|
if(size() <= 0) return Optional.empty();
|
||||||
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
BasicEntry KEY_VALUE_GENERIC_TYPE subEntry = new BasicEntryKV_BRACES();
|
||||||
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
for(Node KEY_VALUE_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
||||||
subEntry.set(entry.key, entry.value);
|
subEntry.set(entry.key, entry.value);
|
||||||
if(filter.test(subEntry)) return subEntry;
|
if(filter.test(subEntry)) return Optional.ofNullable(subEntry);
|
||||||
}
|
}
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+60
-5
@@ -7,12 +7,26 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
#endif
|
#endif
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
@@ -99,6 +113,47 @@ public class ARRAY_FIFO_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUEUE K
|
|||||||
this(MIN_CAPACITY);
|
this(MIN_CAPACITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a ArrayFIFOQueue
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, ARRAY_FIFO_QUEUE<T>, ARRAY_FIFO_QUEUE<T>> toQueue() {
|
||||||
|
return Collector.of(ARRAY_FIFO_QUEUE::new, ARRAY_FIFO_QUEUE::enqueue, ARRAY_FIFO_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayFIFOQueue
|
||||||
|
* @Type(T)
|
||||||
|
* @return a queue with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> ARRAY_FIFO_QUEUE KEY_GENERIC_TYPE toQueue(Stream<T> stream) {
|
||||||
|
return stream.collect(ARRAY_FIFO_QUEUE::new, ARRAY_FIFO_QUEUE::enqueue, ARRAY_FIFO_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ARRAY_FIFO_QUEUE<T> merge(ARRAY_FIFO_QUEUE<T> a) {
|
||||||
|
enqueueAll(a.toArray((T[])new Object[a.size()]));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayFIFOQueue
|
||||||
|
* @return a queue with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static ARRAY_FIFO_QUEUE toQueue(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(ARRAY_FIFO_QUEUE::new, ARRAY_FIFO_QUEUE::enqueue, ARRAY_FIFO_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ARRAY_FIFO_QUEUE merge(ARRAY_FIFO_QUEUE a) {
|
||||||
|
enqueueAll(a.TO_ARRAY());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public ITERATOR KEY_GENERIC_TYPE iterator() {
|
public ITERATOR KEY_GENERIC_TYPE iterator() {
|
||||||
return new Iter();
|
return new Iter();
|
||||||
@@ -318,17 +373,17 @@ public class ARRAY_FIFO_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUEUE K
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0,m=size();i<m;i++) {
|
for(int i = 0,m=size();i<m;i++) {
|
||||||
int index = (first + i) % array.length;
|
int index = (first + i) % array.length;
|
||||||
if(filter.test(array[index])) {
|
if(filter.test(array[index])) {
|
||||||
KEY_TYPE data = array[index];
|
KEY_TYPE data = array[index];
|
||||||
removeIndex(index);
|
removeIndex(index);
|
||||||
return data;
|
return OPTIONAL.GET_OPTIONAL(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -355,7 +410,7 @@ public class ARRAY_FIFO_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUEUE K
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -367,7 +422,7 @@ public class ARRAY_FIFO_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUEUE K
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, array[(first + i) % array.length]);
|
state = operator.APPLY_VALUE(state, array[(first + i) % array.length]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+59
-5
@@ -8,12 +8,26 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
#endif
|
#endif
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
@@ -190,7 +204,47 @@ public class ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUE
|
|||||||
queue.size = size;
|
queue.size = size;
|
||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a ArrayPriorityQueue
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, ARRAY_PRIORITY_QUEUE<T>, ARRAY_PRIORITY_QUEUE<T>> toQueue() {
|
||||||
|
return Collector.of(ARRAY_PRIORITY_QUEUE::new, ARRAY_PRIORITY_QUEUE::enqueue, ARRAY_PRIORITY_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayPriorityQueue
|
||||||
|
* @Type(T)
|
||||||
|
* @return a queue with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE toQueue(Stream<T> stream) {
|
||||||
|
return stream.collect(ARRAY_PRIORITY_QUEUE::new, ARRAY_PRIORITY_QUEUE::enqueue, ARRAY_PRIORITY_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ARRAY_PRIORITY_QUEUE<T> merge(ARRAY_PRIORITY_QUEUE<T> a) {
|
||||||
|
enqueueAll(a.toArray((T[])new Object[a.size()]));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayPriorityQueue
|
||||||
|
* @return a queue with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static ARRAY_PRIORITY_QUEUE toQueue(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(ARRAY_PRIORITY_QUEUE::new, ARRAY_PRIORITY_QUEUE::enqueue, ARRAY_PRIORITY_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ARRAY_PRIORITY_QUEUE merge(ARRAY_PRIORITY_QUEUE a) {
|
||||||
|
enqueueAll(a.TO_ARRAY());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public void enqueue(KEY_TYPE e) {
|
public void enqueue(KEY_TYPE e) {
|
||||||
if(size == array.length) array = Arrays.copyOf(array, (int)Math.max(Math.min((long)array.length + (long)(array.length >> 1), (long)SanityChecks.MAX_ARRAY_SIZE), size+1));
|
if(size == array.length) array = Arrays.copyOf(array, (int)Math.max(Math.min((long)array.length + (long)(array.length >> 1), (long)SanityChecks.MAX_ARRAY_SIZE), size+1));
|
||||||
@@ -346,7 +400,7 @@ public class ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -358,20 +412,20 @@ public class ARRAY_PRIORITY_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, array[i]);
|
state = operator.APPLY_VALUE(state, array[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0;i<size;i++) {
|
for(int i = 0;i<size;i++) {
|
||||||
if(filter.test(array[i])) {
|
if(filter.test(array[i])) {
|
||||||
KEY_TYPE data = array[i];
|
KEY_TYPE data = array[i];
|
||||||
removeIndex(i);
|
removeIndex(i);
|
||||||
return data;
|
return OPTIONAL.GET_OPTIONAL(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+60
-5
@@ -8,12 +8,26 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
#endif
|
#endif
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
@@ -193,6 +207,47 @@ public class HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUEU
|
|||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a ArrayFIFOQueue
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, HEAP_PRIORITY_QUEUE<T>, HEAP_PRIORITY_QUEUE<T>> toQueue() {
|
||||||
|
return Collector.of(HEAP_PRIORITY_QUEUE::new, HEAP_PRIORITY_QUEUE::enqueue, HEAP_PRIORITY_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayFIFOQueue
|
||||||
|
* @Type(T)
|
||||||
|
* @return a queue with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE toQueue(Stream<T> stream) {
|
||||||
|
return stream.collect(HEAP_PRIORITY_QUEUE::new, HEAP_PRIORITY_QUEUE::enqueue, HEAP_PRIORITY_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private HEAP_PRIORITY_QUEUE<T> merge(HEAP_PRIORITY_QUEUE<T> a) {
|
||||||
|
enqueueAll(a.toArray((T[])new Object[a.size()]));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArrayFIFOQueue
|
||||||
|
* @return a queue with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static HEAP_PRIORITY_QUEUE toQueue(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(HEAP_PRIORITY_QUEUE::new, HEAP_PRIORITY_QUEUE::enqueue, HEAP_PRIORITY_QUEUE::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private HEAP_PRIORITY_QUEUE merge(HEAP_PRIORITY_QUEUE a) {
|
||||||
|
enqueueAll(a.TO_ARRAY());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public int size() {
|
public int size() {
|
||||||
return size;
|
return size;
|
||||||
@@ -326,7 +381,7 @@ public class HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUEU
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -338,20 +393,20 @@ public class HEAP_PRIORITY_QUEUE KEY_GENERIC_TYPE extends ABSTRACT_PRIORITY_QUEU
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, array[i]);
|
state = operator.APPLY_VALUE(state, array[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0;i<size;i++) {
|
for(int i = 0;i<size;i++) {
|
||||||
if(filter.test(array[i])) {
|
if(filter.test(array[i])) {
|
||||||
KEY_TYPE data = array[i];
|
KEY_TYPE data = array[i];
|
||||||
removeIndex(i);
|
removeIndex(i);
|
||||||
return data;
|
return OPTIONAL.GET_OPTIONAL(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+75
-10
@@ -10,6 +10,15 @@ import java.util.function.BiFunction;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -19,8 +28,14 @@ import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
|||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -208,6 +223,42 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
while(iterator.hasNext()) add(iterator.NEXT());
|
while(iterator.hasNext()) add(iterator.NEXT());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a AVLTreeSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, AVL_TREE_SET<T>, AVL_TREE_SET<T>> toSet() {
|
||||||
|
return Collector.of(AVL_TREE_SET::new, AVL_TREE_SET::add, AVL_TREE_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a AVLTreeSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> AVL_TREE_SET KEY_GENERIC_TYPE toSet(Stream<T> stream) {
|
||||||
|
return stream.collect(AVL_TREE_SET::new, AVL_TREE_SET::add, AVL_TREE_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private AVL_TREE_SET<T> merge(AVL_TREE_SET<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a AVLTreeSet
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static AVL_TREE_SET toSet(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(AVL_TREE_SET::new, AVL_TREE_SET::add, AVL_TREE_SET::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@Override
|
@Override
|
||||||
public void setDefaultMaxValue(KEY_TYPE value) { defaultMaxNotFound = value; }
|
public void setDefaultMaxValue(KEY_TYPE value) { defaultMaxNotFound = value; }
|
||||||
@@ -377,6 +428,13 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
action.accept(input, entry.key);
|
action.accept(input, entry.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
||||||
|
action.accept(entry.key, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -405,12 +463,12 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
||||||
if(filter.test(entry.key)) return entry.key;
|
if(filter.test(entry.key)) return OPTIONAL.GET_OPTIONAL(entry.key);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -437,7 +495,7 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -449,7 +507,7 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.key);
|
state = operator.APPLY_VALUE(state, entry.key);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1263,6 +1321,13 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
action.accept(input, entry.key);
|
action.accept(input, entry.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Entry KEY_GENERIC_TYPE entry = start();entry != null && inRange(entry.key);entry = next(entry))
|
||||||
|
action.accept(entry.key, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1314,7 +1379,7 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1326,16 +1391,16 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.key);
|
state = operator.APPLY_VALUE(state, entry.key);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Entry KEY_GENERIC_TYPE entry = start();entry != null && inRange(entry.key);entry = next(entry)) {
|
for(Entry KEY_GENERIC_TYPE entry = start();entry != null && inRange(entry.key);entry = next(entry)) {
|
||||||
if(filter.test(entry.key)) return entry.key;
|
if(filter.test(entry.key)) return OPTIONAL.GET_OPTIONAL(entry.key);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -74,6 +74,16 @@ public abstract class ABSTRACT_SET KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION
|
|||||||
return set.iterator();
|
return set.iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) {
|
||||||
|
set.addLast(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) {
|
||||||
|
set.addFirst(o);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
public boolean remove(KEY_TYPE o) {
|
public boolean remove(KEY_TYPE o) {
|
||||||
|
|||||||
@@ -8,6 +8,15 @@ import java.util.function.BiFunction;
|
|||||||
#endif
|
#endif
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
@@ -18,9 +27,14 @@ import java.util.function.JAVA_PREDICATE;
|
|||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -69,7 +83,7 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
* @param array the array that should be used for set.
|
* @param array the array that should be used for set.
|
||||||
*/
|
*/
|
||||||
public ARRAY_SET(KEY_TYPE[] array) {
|
public ARRAY_SET(KEY_TYPE[] array) {
|
||||||
this(array, array.length);
|
this(array, 0, array.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,6 +97,18 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
addAll(array, length);
|
addAll(array, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructur using initial Array
|
||||||
|
* @param array the array that should be used for set.
|
||||||
|
* @param offset the starting offset of where the array should be copied from
|
||||||
|
* @param length the amount of elements present within the array
|
||||||
|
* @throws NegativeArraySizeException if the length is negative
|
||||||
|
*/
|
||||||
|
public ARRAY_SET(KEY_TYPE[] array, int offset, int length) {
|
||||||
|
this(length);
|
||||||
|
addAll(array, offset, length);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Helper constructor that allows to create a Set with exactly the same values as the provided collection.
|
* A Helper constructor that allows to create a Set with exactly the same values as the provided collection.
|
||||||
* @param c the elements that should be added to the set.
|
* @param c the elements that should be added to the set.
|
||||||
@@ -126,6 +152,42 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
for(ITERATOR KEY_GENERIC_TYPE iter = s.iterator();iter.hasNext();data[size++] = iter.NEXT());
|
for(ITERATOR KEY_GENERIC_TYPE iter = s.iterator();iter.hasNext();data[size++] = iter.NEXT());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a ArraySet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, ARRAY_SET<T>, ARRAY_SET<T>> toList() {
|
||||||
|
return Collector.of(ARRAY_SET::new, ARRAY_SET::add, ARRAY_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArraySet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> ARRAY_SET KEY_GENERIC_TYPE toList(Stream<T> stream) {
|
||||||
|
return stream.collect(ARRAY_SET::new, ARRAY_SET::add, ARRAY_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ARRAY_SET<T> merge(ARRAY_SET<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a ArraySet
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static ARRAY_SET toList(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(ARRAY_SET::new, ARRAY_SET::add, ARRAY_SET::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public boolean add(KEY_TYPE o) {
|
public boolean add(KEY_TYPE o) {
|
||||||
int index = findIndex(o);
|
int index = findIndex(o);
|
||||||
@@ -148,6 +210,25 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) {
|
||||||
|
int index = findIndex(o);
|
||||||
|
if(index == -1) {
|
||||||
|
if(data.length == size) data = Arrays.copyOf(data, size == 0 ? 2 : size * 2);
|
||||||
|
System.arraycopy(data, 0, data, 1, size++);
|
||||||
|
data[0] = o;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) {
|
||||||
|
int index = findIndex(o);
|
||||||
|
if(index == -1) {
|
||||||
|
if(data.length == size) data = Arrays.copyOf(data, size == 0 ? 2 : size * 2);
|
||||||
|
data[size++] = o;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) {
|
public boolean addAndMoveToFirst(KEY_TYPE o) {
|
||||||
int index = findIndex(o);
|
int index = findIndex(o);
|
||||||
@@ -410,6 +491,13 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
action.accept(input, data[i]);
|
action.accept(input, data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;i++)
|
||||||
|
action.accept(data[i], input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -438,12 +526,12 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(int i = 0;i<size;i++) {
|
for(int i = 0;i<size;i++) {
|
||||||
if(filter.test(data[i])) return data[i];
|
if(filter.test(data[i])) return OPTIONAL.GET_OPTIONAL(data[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@@ -470,7 +558,7 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -482,7 +570,7 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, data[i]);
|
state = operator.APPLY_VALUE(state, data[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+28
-5
@@ -9,6 +9,9 @@ import java.util.Collection;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -19,8 +22,14 @@ import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -258,6 +267,10 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
|
|||||||
@Override
|
@Override
|
||||||
public boolean addAll(COLLECTION KEY_GENERIC_TYPE c) { throw new UnsupportedOperationException(); }
|
public boolean addAll(COLLECTION KEY_GENERIC_TYPE c) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@@ -353,6 +366,16 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1) {
|
||||||
|
action.accept(keys[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -414,7 +437,7 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -427,18 +450,18 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
|
|||||||
else state = operator.APPLY_VALUE(state, keys[index]);
|
else state = operator.APPLY_VALUE(state, keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1) {
|
while(index != -1) {
|
||||||
if(filter.test(keys[index])) return keys[index];
|
if(filter.test(keys[index])) return OPTIONAL.GET_OPTIONAL(keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+106
-5
@@ -9,6 +9,15 @@ import java.util.Objects;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -18,6 +27,9 @@ import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
|||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.lists.LIST_ITERATOR;
|
import speiger.src.collections.PACKAGE.lists.LIST_ITERATOR;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
||||||
@@ -25,6 +37,9 @@ import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
|||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -235,6 +250,82 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a LinkedCustomHashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, LINKED_CUSTOM_HASH_SET<T>, LINKED_CUSTOM_HASH_SET<T>> toLinkedSet(STRATEGY KEY_SUPER_GENERIC_TYPE strategy) {
|
||||||
|
return Collector.of(() -> new LINKED_CUSTOM_HASH_SET<>(strategy), LINKED_CUSTOM_HASH_SET::add, LINKED_CUSTOM_HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a LinkedCustomHashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE toLinkedSet(Stream<T> stream, STRATEGY KEY_SUPER_GENERIC_TYPE strategy) {
|
||||||
|
return stream.collect(() -> new LINKED_CUSTOM_HASH_SET<>(strategy), LINKED_CUSTOM_HASH_SET::add, LINKED_CUSTOM_HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LINKED_CUSTOM_HASH_SET<T> merge(LINKED_CUSTOM_HASH_SET<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a LinkedCustomHashSet
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static LINKED_CUSTOM_HASH_SET toList(JAVA_STREAM stream, STRATEGY KEY_SUPER_GENERIC_TYPE strategy) {
|
||||||
|
return stream.collect(() -> new LINKED_CUSTOM_HASH_SET(strategy), LINKED_CUSTOM_HASH_SET::add, LINKED_CUSTOM_HASH_SET::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) {
|
||||||
|
if(strategy.equals(o, EMPTY_KEY_VALUE)) {
|
||||||
|
if(containsNull) return;
|
||||||
|
containsNull = true;
|
||||||
|
onNodeAdded(nullIndex);
|
||||||
|
moveToFirstIndex(nullIndex);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int pos = HashUtil.mix(strategy.hashCode(o)) & mask;
|
||||||
|
while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) {
|
||||||
|
if(strategy.equals(keys[pos], o)) return;
|
||||||
|
pos = ++pos & mask;
|
||||||
|
}
|
||||||
|
keys[pos] = o;
|
||||||
|
onNodeAdded(pos);
|
||||||
|
moveToFirstIndex(pos);
|
||||||
|
}
|
||||||
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) {
|
||||||
|
if(strategy.equals(o, EMPTY_KEY_VALUE)) {
|
||||||
|
if(containsNull) return;
|
||||||
|
containsNull = true;
|
||||||
|
onNodeAdded(nullIndex);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int pos = HashUtil.mix(strategy.hashCode(o)) & mask;
|
||||||
|
while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) {
|
||||||
|
if(strategy.equals(keys[pos], o)) return;
|
||||||
|
pos = ++pos & mask;
|
||||||
|
}
|
||||||
|
keys[pos] = o;
|
||||||
|
onNodeAdded(pos);
|
||||||
|
}
|
||||||
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) {
|
public boolean addAndMoveToFirst(KEY_TYPE o) {
|
||||||
if(strategy.equals(o, EMPTY_KEY_VALUE)) {
|
if(strategy.equals(o, EMPTY_KEY_VALUE)) {
|
||||||
@@ -595,6 +686,16 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1) {
|
||||||
|
action.accept(keys[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -656,7 +757,7 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -669,18 +770,18 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
|
|||||||
else state = operator.APPLY_VALUE(state, keys[index]);
|
else state = operator.APPLY_VALUE(state, keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1) {
|
while(index != -1) {
|
||||||
if(filter.test(keys[index])) return keys[index];
|
if(filter.test(keys[index])) return OPTIONAL.GET_OPTIONAL(keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+106
-5
@@ -5,6 +5,15 @@ import java.util.Collection;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
@@ -21,8 +30,14 @@ import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -206,6 +221,82 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a LinkedHashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, LINKED_HASH_SET<T>, LINKED_HASH_SET<T>> toLinkedSet() {
|
||||||
|
return Collector.of(LINKED_HASH_SET::new, LINKED_HASH_SET::add, LINKED_HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a LinkedHashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> LINKED_HASH_SET KEY_GENERIC_TYPE toLinkedSet(Stream<T> stream) {
|
||||||
|
return stream.collect(LINKED_HASH_SET::new, LINKED_HASH_SET::add, LINKED_HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LINKED_HASH_SET<T> merge(LINKED_HASH_SET<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a LinkedHashSet
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static LINKED_HASH_SET toLinkedSet(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(LINKED_HASH_SET::new, LINKED_HASH_SET::add, LINKED_HASH_SET::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) {
|
||||||
|
if(KEY_EQUALS_NULL(o)) {
|
||||||
|
if(containsNull) return;
|
||||||
|
containsNull = true;
|
||||||
|
onNodeAdded(nullIndex);
|
||||||
|
moveToFirstIndex(nullIndex);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int pos = HashUtil.mix(KEY_TO_HASH(o)) & mask;
|
||||||
|
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
||||||
|
if(KEY_EQUALS(keys[pos], o)) return;
|
||||||
|
pos = ++pos & mask;
|
||||||
|
}
|
||||||
|
keys[pos] = o;
|
||||||
|
onNodeAdded(pos);
|
||||||
|
moveToFirstIndex(pos);
|
||||||
|
}
|
||||||
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) {
|
||||||
|
if(KEY_EQUALS_NULL(o)) {
|
||||||
|
if(containsNull) return;
|
||||||
|
containsNull = true;
|
||||||
|
onNodeAdded(nullIndex);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int pos = HashUtil.mix(KEY_TO_HASH(o)) & mask;
|
||||||
|
while(KEY_EQUALS_NOT_NULL(keys[pos])) {
|
||||||
|
if(KEY_EQUALS(keys[pos], o)) return;
|
||||||
|
pos = ++pos & mask;
|
||||||
|
}
|
||||||
|
keys[pos] = o;
|
||||||
|
onNodeAdded(pos);
|
||||||
|
}
|
||||||
|
if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) {
|
public boolean addAndMoveToFirst(KEY_TYPE o) {
|
||||||
if(KEY_EQUALS_NULL(o)) {
|
if(KEY_EQUALS_NULL(o)) {
|
||||||
@@ -450,6 +541,16 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
int index = firstIndex;
|
||||||
|
while(index != -1) {
|
||||||
|
action.accept(keys[index], input);
|
||||||
|
index = (int)links[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -511,7 +612,7 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -524,18 +625,18 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
|
|||||||
else state = operator.APPLY_VALUE(state, keys[index]);
|
else state = operator.APPLY_VALUE(state, keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
int index = firstIndex;
|
int index = firstIndex;
|
||||||
while(index != -1) {
|
while(index != -1) {
|
||||||
if(filter.test(keys[index])) return keys[index];
|
if(filter.test(keys[index])) return OPTIONAL.GET_OPTIONAL(keys[index]);
|
||||||
index = (int)links[index];
|
index = (int)links[index];
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+68
-7
@@ -6,6 +6,15 @@ import java.util.ConcurrentModificationException;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
@@ -16,12 +25,18 @@ import java.util.function.PREDICATE;
|
|||||||
|
|
||||||
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -251,6 +266,42 @@ public class CUSTOM_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_T
|
|||||||
while(iterator.hasNext()) add(iterator.NEXT());
|
while(iterator.hasNext()) add(iterator.NEXT());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a CustomHashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, CUSTOM_HASH_SET<T>, CUSTOM_HASH_SET<T>> toSet(STRATEGY KEY_SUPER_GENERIC_TYPE strategy) {
|
||||||
|
return Collector.of(() -> new CUSTOM_HASH_SET<>(strategy), CUSTOM_HASH_SET::add, CUSTOM_HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a CustomHashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> CUSTOM_HASH_SET KEY_GENERIC_TYPE toSet(Stream<T> stream, STRATEGY KEY_SUPER_GENERIC_TYPE strategy) {
|
||||||
|
return stream.collect(() -> new CUSTOM_HASH_SET<>(strategy), CUSTOM_HASH_SET::add, CUSTOM_HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CUSTOM_HASH_SET<T> merge(CUSTOM_HASH_SET<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a CustomHashSet
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static CUSTOM_HASH_SET toSet(JAVA_STREAM stream, STRATEGY KEY_SUPER_GENERIC_TYPE strategy) {
|
||||||
|
return stream.collect(() -> new CUSTOM_HASH_SET(strategy), CUSTOM_HASH_SET::add, CUSTOM_HASH_SET::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
* Helper getter function to get the current strategy
|
* Helper getter function to get the current strategy
|
||||||
@@ -574,6 +625,16 @@ public class CUSTOM_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_T
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(keys[nullIndex], input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE)) action.accept(keys[i], input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -635,7 +696,7 @@ public class CUSTOM_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_T
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -652,18 +713,18 @@ public class CUSTOM_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_T
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, keys[i]);
|
state = operator.APPLY_VALUE(state, keys[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return OPTIONAL.empty();
|
||||||
if(containsNull && filter.test(keys[nullIndex])) return keys[nullIndex];
|
if(containsNull && filter.test(keys[nullIndex])) return OPTIONAL.GET_OPTIONAL(keys[nullIndex]);
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE) && filter.test(keys[i])) return keys[i];
|
if(!strategy.equals(keys[i], EMPTY_KEY_VALUE) && filter.test(keys[i])) return OPTIONAL.GET_OPTIONAL(keys[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+68
-7
@@ -6,6 +6,15 @@ import java.util.ConcurrentModificationException;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
@@ -20,8 +29,14 @@ import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
|||||||
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
import speiger.src.collections.PACKAGE.utils.ITERATORS;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -218,6 +233,42 @@ public class HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE imp
|
|||||||
while(iterator.hasNext()) add(iterator.NEXT());
|
while(iterator.hasNext()) add(iterator.NEXT());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a HashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, HASH_SET<T>, HASH_SET<T>> toSet() {
|
||||||
|
return Collector.of(HASH_SET::new, HASH_SET::add, HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a HashSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> HASH_SET KEY_GENERIC_TYPE toSet(Stream<T> stream) {
|
||||||
|
return stream.collect(HASH_SET::new, HASH_SET::add, HASH_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private HASH_SET<T> merge(HASH_SET<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a HashSet
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static HASH_SET toSet(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(HASH_SET::new, HASH_SET::add, HASH_SET::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public boolean add(KEY_TYPE o) {
|
public boolean add(KEY_TYPE o) {
|
||||||
@@ -437,6 +488,16 @@ public class HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE imp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
if(size() <= 0) return;
|
||||||
|
if(containsNull) action.accept(keys[nullIndex], input);
|
||||||
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
|
if(KEY_EQUALS_NOT_NULL(keys[i])) action.accept(keys[i], input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -498,7 +559,7 @@ public class HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE imp
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -515,18 +576,18 @@ public class HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE imp
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, keys[i]);
|
state = operator.APPLY_VALUE(state, keys[i]);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
if(size() <= 0) return EMPTY_VALUE;
|
if(size() <= 0) return OPTIONAL.empty();
|
||||||
if(containsNull && filter.test(keys[nullIndex])) return keys[nullIndex];
|
if(containsNull && filter.test(keys[nullIndex])) return OPTIONAL.GET_OPTIONAL(keys[nullIndex]);
|
||||||
for(int i = nullIndex-1;i>=0;i--) {
|
for(int i = nullIndex-1;i>=0;i--) {
|
||||||
if(KEY_EQUALS_NOT_NULL(keys[i]) && filter.test(keys[i])) return keys[i];
|
if(KEY_EQUALS_NOT_NULL(keys[i]) && filter.test(keys[i])) return OPTIONAL.GET_OPTIONAL(keys[i]);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import java.util.SequencedSet;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
||||||
|
import speiger.src.collections.PACKAGE.collections.ORDERED_COLLECTION;
|
||||||
#if SPLIT_ITERATOR_FEATURE
|
#if SPLIT_ITERATOR_FEATURE
|
||||||
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
|
||||||
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
|
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
|
||||||
@@ -23,9 +24,9 @@ import speiger.src.collections.PACKAGE.utils.SETS;
|
|||||||
* @Type(T)
|
* @Type(T)
|
||||||
*/
|
*/
|
||||||
#if JAVA_VERSION>=21
|
#if JAVA_VERSION>=21
|
||||||
public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE, SequencedSet<CLASS_TYPE>
|
public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE, ORDERED_COLLECTION KEY_GENERIC_TYPE, SequencedSet<CLASS_TYPE>
|
||||||
#else
|
#else
|
||||||
public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE
|
public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE, ORDERED_COLLECTION KEY_GENERIC_TYPE
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|||||||
+75
-10
@@ -2,6 +2,15 @@ package speiger.src.collections.PACKAGE.sets;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import java.util.stream.JAVA_STREAM;
|
||||||
|
#else
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -19,8 +28,14 @@ import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
|
|||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
@@ -208,6 +223,42 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
while(iterator.hasNext()) add(iterator.NEXT());
|
while(iterator.hasNext()) add(iterator.NEXT());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if JDK_TYPE && SPLIT_ITERATOR_FEATURE && STREAM_FEATURE
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
/**
|
||||||
|
* Creates a Collector for a RBTreeSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a collector
|
||||||
|
*/
|
||||||
|
public static <T> Collector<T, RB_TREE_SET<T>, RB_TREE_SET<T>> toSet() {
|
||||||
|
return Collector.of(RB_TREE_SET::new, RB_TREE_SET::add, RB_TREE_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a RBTreeSet
|
||||||
|
* @Type(T)
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static <T> RB_TREE_SET KEY_GENERIC_TYPE toSet(Stream<T> stream) {
|
||||||
|
return stream.collect(RB_TREE_SET::new, RB_TREE_SET::add, RB_TREE_SET::merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
private RB_TREE_SET<T> merge(RB_TREE_SET<T> a) {
|
||||||
|
addAll(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* Collects a Stream to a RBTreeSet
|
||||||
|
* @return a set with the contents of the Stream
|
||||||
|
*/
|
||||||
|
public static RB_TREE_SET toSet(JAVA_STREAM stream) {
|
||||||
|
return stream.collect(RB_TREE_SET::new, RB_TREE_SET::add, RB_TREE_SET::addAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@Override
|
@Override
|
||||||
public void setDefaultMaxValue(KEY_TYPE value) { defaultMaxNotFound = value; }
|
public void setDefaultMaxValue(KEY_TYPE value) { defaultMaxNotFound = value; }
|
||||||
@@ -376,6 +427,13 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
action.accept(input, entry.key);
|
action.accept(input, entry.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next())
|
||||||
|
action.accept(entry.key, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -427,7 +485,7 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -439,16 +497,16 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.key);
|
state = operator.APPLY_VALUE(state, entry.key);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
for(Entry KEY_GENERIC_TYPE entry = first;entry != null;entry = entry.next()) {
|
||||||
if(filter.test(entry.key)) return entry.key;
|
if(filter.test(entry.key)) return OPTIONAL.GET_OPTIONAL(entry.key);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1323,6 +1381,13 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
action.accept(input, entry.key);
|
action.accept(input, entry.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(Entry KEY_GENERIC_TYPE entry = start();entry != null && inRange(entry.key);entry = next(entry))
|
||||||
|
action.accept(entry.key, input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
@@ -1374,7 +1439,7 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
Objects.requireNonNull(operator);
|
Objects.requireNonNull(operator);
|
||||||
KEY_TYPE state = EMPTY_VALUE;
|
KEY_TYPE state = EMPTY_VALUE;
|
||||||
boolean empty = true;
|
boolean empty = true;
|
||||||
@@ -1386,16 +1451,16 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
state = operator.APPLY_VALUE(state, entry.key);
|
state = operator.APPLY_VALUE(state, entry.key);
|
||||||
}
|
}
|
||||||
return state;
|
return empty ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
Objects.requireNonNull(filter);
|
Objects.requireNonNull(filter);
|
||||||
for(Entry KEY_GENERIC_TYPE entry = start();entry != null && inRange(entry.key);entry = next(entry)) {
|
for(Entry KEY_GENERIC_TYPE entry = start();entry != null && inRange(entry.key);entry = next(entry)) {
|
||||||
if(filter.test(entry.key)) return entry.key;
|
if(filter.test(entry.key)) return OPTIONAL.GET_OPTIONAL(entry.key);
|
||||||
}
|
}
|
||||||
return EMPTY_VALUE;
|
return OPTIONAL.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import java.util.function.IntFunction;
|
|||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
import speiger.src.collections.utils.SanityChecks;
|
import speiger.src.collections.utils.SanityChecks;
|
||||||
|
import speiger.src.collections.utils.Swapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Helper class for Arrays
|
* A Helper class for Arrays
|
||||||
@@ -337,6 +338,69 @@ public class ARRAYS
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple Shuffle method for Arrays.
|
||||||
|
* With a Callback for indirect shuffling
|
||||||
|
* @param array the elements that should be shuffled
|
||||||
|
* @param swapper the callback on the swaps
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @note This uses the SanityChecks#getRandom
|
||||||
|
* @return the provided sorted array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectShuffle(KEY_TYPE[] array, Swapper swapper) {
|
||||||
|
return indirectShuffle(array, SanityChecks.getRandom(), swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple Shuffle method for Arrays.
|
||||||
|
* With a Callback for indirect shuffling
|
||||||
|
* @param array the elements that should be shuffled
|
||||||
|
* @param random the Random Number Generator that should be used for the shuffling
|
||||||
|
* @param swapper the callback on the swaps
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @return the provided sorted array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectShuffle(KEY_TYPE[] array, RANDOM random, Swapper swapper) {
|
||||||
|
return indirectShuffle(array, 0, array.length, random, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple Shuffle method for Arrays.
|
||||||
|
* With a Callback for indirect shuffling
|
||||||
|
* @param array the elements that should be shuffled
|
||||||
|
* @param length the length of the array
|
||||||
|
* @param random the Random Number Generator that should be used for the shuffling
|
||||||
|
* @param swapper the callback on the swaps
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @return the provided sorted array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectShuffle(KEY_TYPE[] array, int length, RANDOM random, Swapper swapper) {
|
||||||
|
return indirectShuffle(array, 0, length, random, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple Shuffle method for Arrays.
|
||||||
|
* With a Callback for indirect shuffling
|
||||||
|
* @param array the elements that should be shuffled
|
||||||
|
* @param offset the start array
|
||||||
|
* @param length the length of the array
|
||||||
|
* @param random the Random Number Generator that should be used for the shuffling
|
||||||
|
* @param swapper the callback on the swaps
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @return the provided sorted array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectShuffle(KEY_TYPE[] array, int offset, int length, RANDOM random, Swapper swapper) {
|
||||||
|
for(int i = length-1; i>=0;i--) {
|
||||||
|
int j = offset + i;
|
||||||
|
int p = offset + random.nextInt(i + 1);
|
||||||
|
swapper.swap(j, p);
|
||||||
|
KEY_TYPE t = array[j];
|
||||||
|
array[j] = array[p];
|
||||||
|
array[p] = t;
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple Array Reversal method
|
* Simple Array Reversal method
|
||||||
* @param array the Array that should flip
|
* @param array the Array that should flip
|
||||||
@@ -575,6 +639,55 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Insertion Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @return input array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectInsertionSort(KEY_TYPE[] array, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectInsertionSort(array, 0, array.length, comp, swapper);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Insertion Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param length the maxmium size of the array to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectInsertionSort(KEY_TYPE[] array, int length, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectInsertionSort(array, 0, length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Insertion Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param from where the array should be sorted from
|
||||||
|
* @param to where the array should be sorted to
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectInsertionSort(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
for (int i = from+1;i<to; i++) {
|
||||||
|
KEY_TYPE current = array[i];
|
||||||
|
int j = i - 1;
|
||||||
|
while(j >= from && comp.compare(current, array[j]) < 0) {
|
||||||
|
swapper.swap(j+1, j);
|
||||||
|
array[j+1] = array[j--];
|
||||||
|
}
|
||||||
|
array[j+1] = current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts an array according to the natural ascending order using InsertionSort,
|
* Sorts an array according to the natural ascending order using InsertionSort,
|
||||||
* @param array the array that needs to be sorted
|
* @param array the array that needs to be sorted
|
||||||
@@ -661,6 +774,60 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Selection Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @return input array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectSelectionSort(KEY_TYPE[] array, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectSelectionSort(array, 0, array.length, comp, swapper);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Selection Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param length the maxmium size of the array to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectSelectionSort(KEY_TYPE[] array, int length, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectSelectionSort(array, 0, length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Selection Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param from where the array should be sorted from
|
||||||
|
* @param to where the array should be sorted to
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectSelectionSort(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
for (int i = from; i < to; i++) {
|
||||||
|
KEY_TYPE min = array[i];
|
||||||
|
int minId = i;
|
||||||
|
for(int j = i+1; j < to; j++) {
|
||||||
|
if(comp.compare(array[j], min) < 0) {
|
||||||
|
min = array[j];
|
||||||
|
minId = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
swapper.swap(i, minId);
|
||||||
|
KEY_TYPE temp = array[i];
|
||||||
|
array[i] = min;
|
||||||
|
array[minId] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts an array according to the natural ascending order using Selection Sort,
|
* Sorts an array according to the natural ascending order using Selection Sort,
|
||||||
* @param array the array that needs to be sorted
|
* @param array the array that needs to be sorted
|
||||||
@@ -760,6 +927,72 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Merge Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @return input array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectMergeSort(KEY_TYPE[] array, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectMergeSort(array, null, 0, array.length, comp, swapper);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Merge Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param length the maxmium size of the array to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectMergeSort(KEY_TYPE[] array, int length, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectMergeSort(array, null, 0, length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Merge Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param supp the auxillary array that is used to simplify the sorting
|
||||||
|
* @param from where the array should be sorted from
|
||||||
|
* @param to where the array should be sorted to
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectMergeSort(KEY_TYPE[] array, KEY_TYPE[] supp, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
if(to - from < BASE_THRESHOLD) {
|
||||||
|
indirectInsertionSort(array, from, to, comp, swapper);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(supp == null) supp = Arrays.copyOf(array, to);
|
||||||
|
int mid = (from + to) >>> 1;
|
||||||
|
indirectMergeSort(supp, array, from, mid, comp, swapper);
|
||||||
|
indirectMergeSort(supp, array, mid, to, comp, swapper);
|
||||||
|
if(comp.compare(supp[mid - 1], supp[mid]) <= 0)
|
||||||
|
{
|
||||||
|
System.arraycopy(supp, from, array, from, to - from);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(int p = from, q = mid;from < to;from++) {
|
||||||
|
if(q >= to || p < mid && comp.compare(supp[p], supp[q]) < 0) {
|
||||||
|
swapper.swap(from, p);
|
||||||
|
array[from] = supp[p++];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
swapper.swap(from, q);
|
||||||
|
array[from] = supp[q++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts an array according to the natural ascending order using Merge Sort,
|
* Sorts an array according to the natural ascending order using Merge Sort,
|
||||||
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
@@ -856,6 +1089,56 @@ public class ARRAYS
|
|||||||
mergeSort(array, supp, from, to, comp);
|
mergeSort(array, supp, from, to, comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using a Parallel Merge Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @note This parallelization is invoked through {@link SanityChecks#invokeTask} which the threadpool can be changed as needed
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectParallelMergeSort(KEY_TYPE[] array, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectParallelMergeSort(array, null, 0, array.length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Parallel Merge Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param length the maxmium size of the array to be sorted
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @note This parallelization is invoked through {@link SanityChecks#invokeTask} which the threadpool can be changed as needed
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectParallelMergeSort(KEY_TYPE[] array, int length, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectParallelMergeSort(array, null, 0, length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Parallel Merge Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param supp the auxillary array that is used to simplify the sorting
|
||||||
|
* @param from where the array should be sorted from
|
||||||
|
* @param to where the array should be sorted to
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @note This parallelization is invoked through {@link SanityChecks#invokeTask} which the threadpool can be changed as needed
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectParallelMergeSort(KEY_TYPE[] array, KEY_TYPE[] supp, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
if(SanityChecks.canParallelTask() && to - from >= PARALLEL_THRESHOLD) {
|
||||||
|
SanityChecks.invokeTask(new MergeSortActionCompSwapBRACES(array, supp, from, to, comp, swapper));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
indirectMergeSort(array, supp, from, to, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts an array according to the natural ascending order using Parallel Merge Sort,
|
* Sorts an array according to the natural ascending order using Parallel Merge Sort,
|
||||||
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
* This implementation was copied from <a href="https://github.com/vigna/fastutil">FastUtil</a> with a couple custom optimizations
|
||||||
@@ -1209,6 +1492,73 @@ public class ARRAYS
|
|||||||
if((length = d - c) > 1) quickSort(array, to - length, to, comp);
|
if((length = d - c) > 1) quickSort(array, to - length, to, comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Quick Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
|
* and that sorting Algorithm is based on the tuned quicksort adapted from Jon L. Bentley and M. DouglasMcIlroy, "Engineering a Sort Function", Software: Practice and Experience, 23(11), pages1249−1265, 1993.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @return input array
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES KEY_TYPE[] indirectQuickSort(KEY_TYPE[] array, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectQuickSort(array, 0, array.length, comp, swapper);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Quick Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
|
* and that sorting Algorithm is based on the tuned quicksort adapted from Jon L. Bentley and M. DouglasMcIlroy, "Engineering a Sort Function", Software: Practice and Experience, 23(11), pages1249−1265, 1993.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param length the maxmium size of the array to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectQuickSort(KEY_TYPE[] array, int length, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectQuickSort(array, 0, length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Quick Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
|
* and that sorting Algorithm is based on the tuned quicksort adapted from Jon L. Bentley and M. DouglasMcIlroy, "Engineering a Sort Function", Software: Practice and Experience, 23(11), pages1249−1265, 1993.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param from where the array should be sorted from
|
||||||
|
* @param to where the array should be sorted to
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectQuickSort(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
int length = to - from;
|
||||||
|
if(length <= 0) return;
|
||||||
|
if(length < BASE_THRESHOLD) {
|
||||||
|
indirectSelectionSort(array, from, to, comp, swapper);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
KEY_TYPE pivot = array[length > 128 ? subMedium(array, from, from + (length / 2), to - 1, length / 8, comp) : medium(array, from, from + (length / 2), to - 1, comp)];
|
||||||
|
int a = from, b = a, c = to - 1, d = c;
|
||||||
|
for(int compare;;swap(array, b++, c--, swapper)) {
|
||||||
|
for(;b<=c && (compare = comp.compare(array[b], pivot)) <= 0;b++) {
|
||||||
|
if(compare == 0) swap(array, a++, b, swapper);
|
||||||
|
}
|
||||||
|
for(;c>=b && (compare = comp.compare(array[c], pivot)) >= 0;c--) {
|
||||||
|
if(compare == 0) swap(array, c, d--, swapper);
|
||||||
|
}
|
||||||
|
if(b>c) break;
|
||||||
|
}
|
||||||
|
swap(array, from, b, Math.min(a - from, b - a), swapper);
|
||||||
|
swap(array, b, to, Math.min(d - c, to - d - 1), swapper);
|
||||||
|
if((length = b - a) > 1) indirectQuickSort(array, from, from + length, comp, swapper);
|
||||||
|
if((length = d - c) > 1) indirectQuickSort(array, to - length, to, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts an array according to the natural ascending order using Quick Sort,
|
* Sorts an array according to the natural ascending order using Quick Sort,
|
||||||
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
@@ -1313,6 +1663,58 @@ public class ARRAYS
|
|||||||
quickSort(array, from, to, comp);
|
quickSort(array, from, to, comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Parallel Quick Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
|
* and that sorting Algorithm is based on the tuned quicksort adapted from Jon L. Bentley and M. DouglasMcIlroy, "Engineering a Sort Function", Software: Practice and Experience, 23(11), pages1249−1265, 1993.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @note This parallelization is invoked through {@link SanityChecks#invokeTask} which the threadpool can be changed as needed
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectParallelQuickSort(KEY_TYPE[] array, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectParallelQuickSort(array, 0, array.length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Parallel Quick Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
|
* and that sorting Algorithm is based on the tuned quicksort adapted from Jon L. Bentley and M. DouglasMcIlroy, "Engineering a Sort Function", Software: Practice and Experience, 23(11), pages1249−1265, 1993.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param length the maxmium size of the array to be sorted
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @note This parallelization is invoked through {@link SanityChecks#invokeTask} which the threadpool can be changed as needed
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectParallelQuickSort(KEY_TYPE[] array, int length, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
indirectParallelQuickSort(array, 0, length, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified range of elements according to the order induced by the specified comparator using Parallel Quick Sort,
|
||||||
|
* On top of that allows to sort other things along with it.
|
||||||
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
|
* and that sorting Algorithm is based on the tuned quicksort adapted from Jon L. Bentley and M. DouglasMcIlroy, "Engineering a Sort Function", Software: Practice and Experience, 23(11), pages1249−1265, 1993.
|
||||||
|
* @param array the array that needs to be sorted
|
||||||
|
* @param from where the array should be sorted from
|
||||||
|
* @param to where the array should be sorted to
|
||||||
|
* @param comp the Comparator that decides the sorting order
|
||||||
|
* @param swapper the callback which elements were swapped
|
||||||
|
* @ArrayType(T)
|
||||||
|
* @note This parallelization is invoked through {@link SanityChecks#invokeTask} which the threadpool can be changed as needed
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES void indirectParallelQuickSort(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
if(SanityChecks.canParallelTask() && to - from >= PARALLEL_THRESHOLD) {
|
||||||
|
SanityChecks.invokeTask(new QuickSortActionCompSwapBRACES(array, from, to, comp, swapper));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
indirectQuickSort(array, from, to, comp, swapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sorts an array according to the natural ascending order using Parallel Quick Sort,
|
* Sorts an array according to the natural ascending order using Parallel Quick Sort,
|
||||||
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
* This implementation is a custom of <a href="https://github.com/vigna/fastutil">FastUtil</a> quicksort but with a different code structure,
|
||||||
@@ -1367,6 +1769,18 @@ public class ARRAYS
|
|||||||
for(int i = 0;i<length;i++,swap(a, from++, to++));
|
for(int i = 0;i<length;i++,swap(a, from++, to++));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GENERIC_KEY_BRACES void swap(KEY_TYPE[] a, int from, int to, Swapper swapper) {
|
||||||
|
swapper.swap(from, to);
|
||||||
|
KEY_TYPE t = a[from];
|
||||||
|
a[from] = a[to];
|
||||||
|
a[to] = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GENERIC_KEY_BRACES void swap(KEY_TYPE[] a, int from, int to, int length, Swapper swapper) {
|
||||||
|
to -= length;
|
||||||
|
for(int i = 0;i<length;i++,swap(a, from++, to++, swapper));
|
||||||
|
}
|
||||||
|
|
||||||
static GENERIC_KEY_BRACES int subMedium(KEY_TYPE[] data, int a, int b, int c, int length, COMPARATOR KEY_GENERIC_TYPE comp) {
|
static GENERIC_KEY_BRACES int subMedium(KEY_TYPE[] data, int a, int b, int c, int length, COMPARATOR KEY_GENERIC_TYPE comp) {
|
||||||
return medium(data, medium(data, a, a + length, a + (length * 2), comp), medium(data, b - length, b, b + length, comp), medium(data, c - (length * 2), c - length, c, comp), comp);
|
return medium(data, medium(data, a, a + length, a + (length * 2), comp), medium(data, b - length, b, b + length, comp), medium(data, c - (length * 2), c - length, c, comp), comp);
|
||||||
}
|
}
|
||||||
@@ -1389,16 +1803,14 @@ public class ARRAYS
|
|||||||
int from;
|
int from;
|
||||||
int to;
|
int to;
|
||||||
|
|
||||||
QuickSortAction(KEY_TYPE[] array, int from, int to)
|
QuickSortAction(KEY_TYPE[] array, int from, int to) {
|
||||||
{
|
|
||||||
this.array = array;
|
this.array = array;
|
||||||
this.from = from;
|
this.from = from;
|
||||||
this.to = to;
|
this.to = to;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void compute()
|
protected void compute() {
|
||||||
{
|
|
||||||
int length = to - from;
|
int length = to - from;
|
||||||
if(length <= 0) return;
|
if(length <= 0) return;
|
||||||
if(length < BASE_THRESHOLD) {
|
if(length < BASE_THRESHOLD) {
|
||||||
@@ -1431,8 +1843,7 @@ public class ARRAYS
|
|||||||
int to;
|
int to;
|
||||||
COMPARATOR KEY_GENERIC_TYPE comp;
|
COMPARATOR KEY_GENERIC_TYPE comp;
|
||||||
|
|
||||||
QuickSortActionComp(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp)
|
QuickSortActionComp(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp) {
|
||||||
{
|
|
||||||
this.array = array;
|
this.array = array;
|
||||||
this.from = from;
|
this.from = from;
|
||||||
this.to = to;
|
this.to = to;
|
||||||
@@ -1440,8 +1851,7 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void compute()
|
protected void compute() {
|
||||||
{
|
|
||||||
int length = to - from;
|
int length = to - from;
|
||||||
if(length <= 0) return;
|
if(length <= 0) return;
|
||||||
if(length < BASE_THRESHOLD) {
|
if(length < BASE_THRESHOLD) {
|
||||||
@@ -1467,6 +1877,49 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class QuickSortActionCompSwap KEY_GENERIC_TYPE extends RecursiveAction {
|
||||||
|
private static final long serialVersionUID = 0L;
|
||||||
|
KEY_TYPE[] array;
|
||||||
|
int from;
|
||||||
|
int to;
|
||||||
|
COMPARATOR KEY_GENERIC_TYPE comp;
|
||||||
|
Swapper swapper;
|
||||||
|
|
||||||
|
QuickSortActionCompSwap(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
this.array = array;
|
||||||
|
this.from = from;
|
||||||
|
this.to = to;
|
||||||
|
this.comp = comp;
|
||||||
|
this.swapper = swapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void compute() {
|
||||||
|
int length = to - from;
|
||||||
|
if(length <= 0) return;
|
||||||
|
if(length < BASE_THRESHOLD) {
|
||||||
|
indirectSelectionSort(array, from, to, comp, swapper);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
KEY_TYPE pivot = array[length > 128 ? subMedium(array, from, from + (length / 2), to - 1, length / 8, comp) : medium(array, from, from + (length / 2), to - 1, comp)];
|
||||||
|
int a = from, b = a, c = to - 1, d = c;
|
||||||
|
for(int compare;;swap(array, b++, c--, swapper)) {
|
||||||
|
for(;b<=c && (compare = comp.compare(array[b], pivot)) <= 0;b++) {
|
||||||
|
if(compare == 0) swap(array, a++, b, swapper);
|
||||||
|
}
|
||||||
|
for(;c>=b && (compare = comp.compare(array[c], pivot)) >= 0;c--) {
|
||||||
|
if(compare == 0) swap(array, c, d--, swapper);
|
||||||
|
}
|
||||||
|
if(b>c) break;
|
||||||
|
}
|
||||||
|
swap(array, from, b, Math.min(a - from, b - a), swapper);
|
||||||
|
swap(array, b, to, Math.min(d - c, to - d - 1), swapper);
|
||||||
|
if(b - a > 1 && d - c > 1) invokeAll(new QuickSortActionCompSwapBRACES(array, from, from + (b - a), comp, swapper), new QuickSortActionCompSwapBRACES(array, to - (d - c), to, comp, swapper));
|
||||||
|
else if(b - a > 1) new QuickSortActionCompSwapBRACES(array, from, from + (b - a), comp, swapper).invoke();
|
||||||
|
else if(d - c > 1) new QuickSortActionCompSwapBRACES(array, to - (d - c), to, comp, swapper).invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static class MergeSortAction KEY_GENERIC_TYPE extends RecursiveAction {
|
static class MergeSortAction KEY_GENERIC_TYPE extends RecursiveAction {
|
||||||
private static final long serialVersionUID = 0L;
|
private static final long serialVersionUID = 0L;
|
||||||
KEY_TYPE[] array;
|
KEY_TYPE[] array;
|
||||||
@@ -1474,8 +1927,7 @@ public class ARRAYS
|
|||||||
int from;
|
int from;
|
||||||
int to;
|
int to;
|
||||||
|
|
||||||
MergeSortAction(KEY_TYPE[] array, KEY_TYPE[] supp, int from, int to)
|
MergeSortAction(KEY_TYPE[] array, KEY_TYPE[] supp, int from, int to) {
|
||||||
{
|
|
||||||
this.array = array;
|
this.array = array;
|
||||||
this.supp = supp;
|
this.supp = supp;
|
||||||
this.from = from;
|
this.from = from;
|
||||||
@@ -1483,8 +1935,7 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void compute()
|
protected void compute() {
|
||||||
{
|
|
||||||
if(to - from < BASE_THRESHOLD) {
|
if(to - from < BASE_THRESHOLD) {
|
||||||
insertionSort(array, from, to);
|
insertionSort(array, from, to);
|
||||||
return;
|
return;
|
||||||
@@ -1512,8 +1963,7 @@ public class ARRAYS
|
|||||||
int to;
|
int to;
|
||||||
COMPARATOR KEY_GENERIC_TYPE comp;
|
COMPARATOR KEY_GENERIC_TYPE comp;
|
||||||
|
|
||||||
MergeSortActionComp(KEY_TYPE[] array, KEY_TYPE[] supp, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp)
|
MergeSortActionComp(KEY_TYPE[] array, KEY_TYPE[] supp, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp) {
|
||||||
{
|
|
||||||
this.array = array;
|
this.array = array;
|
||||||
this.supp = supp;
|
this.supp = supp;
|
||||||
this.from = from;
|
this.from = from;
|
||||||
@@ -1522,8 +1972,7 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void compute()
|
protected void compute() {
|
||||||
{
|
|
||||||
if(to - from < BASE_THRESHOLD) {
|
if(to - from < BASE_THRESHOLD) {
|
||||||
insertionSort(array, from, to, comp);
|
insertionSort(array, from, to, comp);
|
||||||
return;
|
return;
|
||||||
@@ -1543,22 +1992,64 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class MergeSortActionCompSwap KEY_GENERIC_TYPE extends RecursiveAction {
|
||||||
|
private static final long serialVersionUID = 0L;
|
||||||
|
KEY_TYPE[] array;
|
||||||
|
KEY_TYPE[] supp;
|
||||||
|
int from;
|
||||||
|
int to;
|
||||||
|
COMPARATOR KEY_GENERIC_TYPE comp;
|
||||||
|
Swapper swapper;
|
||||||
|
|
||||||
|
MergeSortActionCompSwap(KEY_TYPE[] array, KEY_TYPE[] supp, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp, Swapper swapper) {
|
||||||
|
this.array = array;
|
||||||
|
this.supp = supp;
|
||||||
|
this.from = from;
|
||||||
|
this.to = to;
|
||||||
|
this.comp = comp;
|
||||||
|
this.swapper = swapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void compute() {
|
||||||
|
if(to - from < BASE_THRESHOLD) {
|
||||||
|
indirectInsertionSort(array, from, to, comp, swapper);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(supp == null) supp = Arrays.copyOf(array, to);
|
||||||
|
int mid = (from + to) >>> 1;
|
||||||
|
invokeAll(new MergeSortActionCompSwapBRACES(supp, array, from, mid, comp, swapper), new MergeSortActionCompSwapBRACES(supp, array, mid, to, comp, swapper));
|
||||||
|
if(comp.compare(supp[mid - 1], supp[mid]) <= 0)
|
||||||
|
{
|
||||||
|
System.arraycopy(supp, from, array, from, to - from);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(int p = from, q = mid;from < to;from++) {
|
||||||
|
if(q >= to || p < mid && comp.compare(supp[p], supp[q]) < 0) {
|
||||||
|
swapper.swap(from, p);
|
||||||
|
array[from] = supp[p++];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
swapper.swap(from, q);
|
||||||
|
array[from] = supp[q++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static class MemFreeMergeSortAction KEY_GENERIC_TYPE extends RecursiveAction {
|
static class MemFreeMergeSortAction KEY_GENERIC_TYPE extends RecursiveAction {
|
||||||
private static final long serialVersionUID = 0L;
|
private static final long serialVersionUID = 0L;
|
||||||
KEY_TYPE[] array;
|
KEY_TYPE[] array;
|
||||||
int from;
|
int from;
|
||||||
int to;
|
int to;
|
||||||
|
|
||||||
MemFreeMergeSortAction(KEY_TYPE[] array, int from, int to)
|
MemFreeMergeSortAction(KEY_TYPE[] array, int from, int to) {
|
||||||
{
|
|
||||||
this.array = array;
|
this.array = array;
|
||||||
this.from = from;
|
this.from = from;
|
||||||
this.to = to;
|
this.to = to;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void compute()
|
protected void compute() {
|
||||||
{
|
|
||||||
if(to - from < BASE_THRESHOLD) {
|
if(to - from < BASE_THRESHOLD) {
|
||||||
insertionSort(array, from, to);
|
insertionSort(array, from, to);
|
||||||
return;
|
return;
|
||||||
@@ -1604,8 +2095,7 @@ public class ARRAYS
|
|||||||
int to;
|
int to;
|
||||||
COMPARATOR KEY_GENERIC_TYPE comp;
|
COMPARATOR KEY_GENERIC_TYPE comp;
|
||||||
|
|
||||||
MemFreeMergeSortActionComp(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp)
|
MemFreeMergeSortActionComp(KEY_TYPE[] array, int from, int to, COMPARATOR KEY_GENERIC_TYPE comp) {
|
||||||
{
|
|
||||||
this.array = array;
|
this.array = array;
|
||||||
this.from = from;
|
this.from = from;
|
||||||
this.to = to;
|
this.to = to;
|
||||||
@@ -1613,8 +2103,7 @@ public class ARRAYS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void compute()
|
protected void compute() {
|
||||||
{
|
|
||||||
if(to - from < BASE_THRESHOLD) {
|
if(to - from < BASE_THRESHOLD) {
|
||||||
insertionSort(array, from, to, comp);
|
insertionSort(array, from, to, comp);
|
||||||
return;
|
return;
|
||||||
|
|||||||
+41
-10
@@ -1,12 +1,18 @@
|
|||||||
package speiger.src.collections.PACKAGE.utils;
|
package speiger.src.collections.PACKAGE.utils;
|
||||||
|
|
||||||
import java.util.concurrent.CancellationException;
|
import java.util.concurrent.CancellationException;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.concurrent.locks.LockSupport;
|
import java.util.concurrent.locks.LockSupport;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#else
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
@@ -299,9 +305,8 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
* @param operator that reduces the elements.
|
* @param operator that reduces the elements.
|
||||||
* @return self with the reduce action applied
|
* @return self with the reduce action applied
|
||||||
*/
|
*/
|
||||||
public ASYNC_BUILDER KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public ObjectAsyncBuilder<OPTIONAL KEY_GENERIC_TYPE> reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
task = new SimpleReduceTaskBRACES(iterable.iterator(), operator);
|
return new ObjectAsyncBuilder<>(new SimpleReduceTaskBRACES(iterable.iterator(), operator));
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
@@ -435,9 +440,8 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
* @param filter that decides the desired elements
|
* @param filter that decides the desired elements
|
||||||
* @return self with the findFirst function applied
|
* @return self with the findFirst function applied
|
||||||
*/
|
*/
|
||||||
public ASYNC_BUILDER KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
public ObjectAsyncBuilder<OPTIONAL KEY_GENERIC_TYPE> findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
task = new FindFirstTaskBRACES(iterable.iterator(), filter);
|
return new ObjectAsyncBuilder<>(new FindFirstTaskBRACES(iterable.iterator(), filter));
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if INT_ASYNC_MODULE
|
#if INT_ASYNC_MODULE
|
||||||
@@ -517,6 +521,16 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
return toRun.GET_KEY(timeout, unit);
|
return toRun.GET_KEY(timeout, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the execution of the task and returns a future so it can be used with a future.
|
||||||
|
* @return the task as a future
|
||||||
|
*/
|
||||||
|
public CompletableFuture<CLASS_TYPE> toFuture() {
|
||||||
|
BASE_TASK KEY_GENERIC_TYPE toRun = task;
|
||||||
|
task = null;
|
||||||
|
return toRun.toFuture();
|
||||||
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
private static class ReduceTask extends BASE_TASK
|
private static class ReduceTask extends BASE_TASK
|
||||||
{
|
{
|
||||||
@@ -590,7 +604,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
private static class SimpleReduceTask KEY_GENERIC_TYPE extends BASE_TASK KEY_GENERIC_TYPE
|
private static class SimpleReduceTask KEY_GENERIC_TYPE extends BaseObjectTask<OPTIONAL KEY_GENERIC_TYPE>
|
||||||
{
|
{
|
||||||
ITERATOR KEY_GENERIC_TYPE iter;
|
ITERATOR KEY_GENERIC_TYPE iter;
|
||||||
UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator;
|
UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator;
|
||||||
@@ -600,6 +614,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
public SimpleReduceTask(ITERATOR KEY_GENERIC_TYPE iter, UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
public SimpleReduceTask(ITERATOR KEY_GENERIC_TYPE iter, UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) {
|
||||||
this.iter = iter;
|
this.iter = iter;
|
||||||
this.operator = operator;
|
this.operator = operator;
|
||||||
|
this.setResult(OPTIONAL.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -614,7 +629,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!iter.hasNext()) {
|
if(!iter.hasNext()) {
|
||||||
setResult(value);
|
setResult(OPTIONAL.GET_OPTIONAL(value));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -689,7 +704,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
private static class FindFirstTask KEY_GENERIC_TYPE extends BASE_TASK KEY_GENERIC_TYPE
|
private static class FindFirstTask KEY_GENERIC_TYPE extends BaseObjectTask<OPTIONAL KEY_GENERIC_TYPE>
|
||||||
{
|
{
|
||||||
ITERATOR KEY_GENERIC_TYPE iter;
|
ITERATOR KEY_GENERIC_TYPE iter;
|
||||||
PREDICATE KEY_GENERIC_TYPE filter;
|
PREDICATE KEY_GENERIC_TYPE filter;
|
||||||
@@ -697,6 +712,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
public FindFirstTask(ITERATOR KEY_GENERIC_TYPE iter, PREDICATE KEY_GENERIC_TYPE filter) {
|
public FindFirstTask(ITERATOR KEY_GENERIC_TYPE iter, PREDICATE KEY_GENERIC_TYPE filter) {
|
||||||
this.iter = iter;
|
this.iter = iter;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
|
this.setResult(OPTIONAL.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -704,7 +720,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
while(shouldRun() && iter.hasNext()) {
|
while(shouldRun() && iter.hasNext()) {
|
||||||
KEY_TYPE entry = iter.NEXT();
|
KEY_TYPE entry = iter.NEXT();
|
||||||
if(filter.test(iter.NEXT())) {
|
if(filter.test(iter.NEXT())) {
|
||||||
setResult(entry);
|
setResult(OPTIONAL.GET_OPTIONAL(entry));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -876,6 +892,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
private static final int CANCELLED = 7;
|
private static final int CANCELLED = 7;
|
||||||
private volatile WaitNode waiter;
|
private volatile WaitNode waiter;
|
||||||
private volatile int state = CREATED;
|
private volatile int state = CREATED;
|
||||||
|
private volatile boolean locked = false;
|
||||||
Consumer<TASK KEY_GENERIC_TYPE> callback;
|
Consumer<TASK KEY_GENERIC_TYPE> callback;
|
||||||
Executor executor = SanityChecks::invokeAsyncTask;
|
Executor executor = SanityChecks::invokeAsyncTask;
|
||||||
KEY_TYPE result;
|
KEY_TYPE result;
|
||||||
@@ -945,6 +962,17 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
onCompletion();
|
onCompletion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompletableFuture<CLASS_TYPE> toFuture() {
|
||||||
|
locked = true;
|
||||||
|
Executor exe = this.executor;
|
||||||
|
this.executor = Runnable::run;
|
||||||
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
|
begin();
|
||||||
|
try { return GET_KEY(); }
|
||||||
|
catch(Exception e) { throw new RuntimeException(e); }
|
||||||
|
}, exe);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean cancel(boolean cancelIfRunnning) {
|
public boolean cancel(boolean cancelIfRunnning) {
|
||||||
if(state == RUNNING && !cancelIfRunnning) return false;
|
if(state == RUNNING && !cancelIfRunnning) return false;
|
||||||
@@ -1039,12 +1067,14 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pause() {
|
public void pause() {
|
||||||
|
if(locked) throw new IllegalStateException("Completable Future Wrap doesn't support pause");
|
||||||
if(state == PAUSED || state == PAUSING || state >= FINISHING) return;
|
if(state == PAUSED || state == PAUSING || state >= FINISHING) return;
|
||||||
state = PAUSING;
|
state = PAUSING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void awaitPausing() {
|
public void awaitPausing() {
|
||||||
|
if(locked) throw new IllegalStateException("Completable Future Wrap doesn't support pause");
|
||||||
if(state == PAUSED) return;
|
if(state == PAUSED) return;
|
||||||
pause();
|
pause();
|
||||||
if(state == PAUSING) {
|
if(state == PAUSING) {
|
||||||
@@ -1056,6 +1086,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resume() {
|
public void resume() {
|
||||||
|
if(locked) throw new IllegalStateException("Completable Future Wrap doesn't support pause");
|
||||||
if(state != PAUSED && state != PAUSING) return;
|
if(state != PAUSED && state != PAUSING) return;
|
||||||
if(state == PAUSING) {
|
if(state == PAUSING) {
|
||||||
while(state == PAUSING) {
|
while(state == PAUSING) {
|
||||||
|
|||||||
+39
-9
@@ -8,6 +8,9 @@ import java.util.ConcurrentModificationException;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
@@ -30,6 +33,9 @@ import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
|||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.objects.utils.ObjectArrays;
|
import speiger.src.collections.objects.utils.ObjectArrays;
|
||||||
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
||||||
@@ -40,6 +46,9 @@ import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
|||||||
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
||||||
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
#if !TYPE_OBJECT
|
||||||
|
import speiger.src.collections.PACKAGE.functions.consumer.BI_TO_OBJECT_CONSUMER;
|
||||||
|
#endif
|
||||||
#if !TYPE_BOOLEAN
|
#if !TYPE_BOOLEAN
|
||||||
import speiger.src.collections.utils.HashUtil;
|
import speiger.src.collections.utils.HashUtil;
|
||||||
#endif
|
#endif
|
||||||
@@ -141,7 +150,10 @@ public class COLLECTIONS
|
|||||||
return new SingletonCollectionBRACES(element);
|
return new SingletonCollectionBRACES(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static GENERIC_KEY_BRACES CollectionWrapper KEY_GENERIC_TYPE wrapper() {
|
/**
|
||||||
|
* Internal Use mainly. Its a collection wrapper with 0 dependencies for those actions where a collector is needed.
|
||||||
|
*/
|
||||||
|
public static GENERIC_KEY_BRACES CollectionWrapper KEY_GENERIC_TYPE wrapper() {
|
||||||
return new CollectionWrapperBRACES();
|
return new CollectionWrapperBRACES();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,6 +297,13 @@ public class COLLECTIONS
|
|||||||
action.accept(elements[i]);
|
action.accept(elements[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;i++)
|
||||||
|
action.accept(i, elements[i]);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <E> void forEach(E input, BI_FROM_OBJECT_CONSUMER KSK_GENERIC_TYPE<E> action) {
|
public <E> void forEach(E input, BI_FROM_OBJECT_CONSUMER KSK_GENERIC_TYPE<E> action) {
|
||||||
Objects.requireNonNull(action);
|
Objects.requireNonNull(action);
|
||||||
@@ -292,6 +311,13 @@ public class COLLECTIONS
|
|||||||
action.accept(input, elements[i]);
|
action.accept(input, elements[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) {
|
||||||
|
Objects.requireNonNull(action);
|
||||||
|
for(int i = 0;i<size;i++)
|
||||||
|
action.accept(elements[i], input);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean trim(int size) {
|
public boolean trim(int size) {
|
||||||
if(size > size() || size() == elements.length) return false;
|
if(size > size() || size() == elements.length) return false;
|
||||||
@@ -846,6 +872,10 @@ public class COLLECTIONS
|
|||||||
@Override
|
@Override
|
||||||
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) { synchronized(mutex) { c.forEachIndexed(action); } }
|
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) { synchronized(mutex) { c.forEachIndexed(action); } }
|
||||||
@Override
|
@Override
|
||||||
|
public <E> void forEach(E input, BI_FROM_OBJECT_CONSUMER KSK_GENERIC_TYPE<E> action) { synchronized(mutex) { c.forEach(input, action); } }
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) { synchronized(mutex) { c.forEach(action, input); } }
|
||||||
|
@Override
|
||||||
public int hashCode() { synchronized(mutex) { return c.hashCode(); } }
|
public int hashCode() { synchronized(mutex) { return c.hashCode(); } }
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
@@ -855,8 +885,6 @@ public class COLLECTIONS
|
|||||||
@Override
|
@Override
|
||||||
public String toString() { synchronized(mutex) { return c.toString(); } }
|
public String toString() { synchronized(mutex) { return c.toString(); } }
|
||||||
@Override
|
@Override
|
||||||
public <E> void forEach(E input, BI_FROM_OBJECT_CONSUMER KSK_GENERIC_TYPE<E> action) { synchronized(mutex) { c.forEach(input, action); } }
|
|
||||||
@Override
|
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.matchesAny(filter); } }
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.matchesAny(filter); } }
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesNone(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.matchesNone(filter); } }
|
public boolean matchesNone(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.matchesNone(filter); } }
|
||||||
@@ -869,9 +897,9 @@ public class COLLECTIONS
|
|||||||
public KEY_TYPE reduce(KEY_TYPE identity, UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { synchronized(mutex) { return c.reduce(identity, operator); } }
|
public KEY_TYPE reduce(KEY_TYPE identity, UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { synchronized(mutex) { return c.reduce(identity, operator); } }
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { synchronized(mutex) { return c.reduce(operator); } }
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { synchronized(mutex) { return c.reduce(operator); } }
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.findFirst(filter); } }
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.findFirst(filter); } }
|
||||||
@Override
|
@Override
|
||||||
public int count(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.count(filter); } }
|
public int count(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.count(filter); } }
|
||||||
}
|
}
|
||||||
@@ -1001,14 +1029,16 @@ public class COLLECTIONS
|
|||||||
@Override
|
@Override
|
||||||
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) { c.forEachIndexed(action); }
|
public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) { c.forEachIndexed(action); }
|
||||||
@Override
|
@Override
|
||||||
|
public <E> void forEach(E input, BI_FROM_OBJECT_CONSUMER KSK_GENERIC_TYPE<E> action) { c.forEach(input, action); }
|
||||||
|
@Override
|
||||||
|
public <E> void forEach(BI_TO_OBJECT_CONSUMER KKS_GENERIC_TYPE<E> action, E input) { c.forEach(action, input); }
|
||||||
|
@Override
|
||||||
public int hashCode() { return c.hashCode(); }
|
public int hashCode() { return c.hashCode(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) { return obj == this || c.equals(obj); }
|
public boolean equals(Object obj) { return obj == this || c.equals(obj); }
|
||||||
@Override
|
@Override
|
||||||
public String toString() { return c.toString(); }
|
public String toString() { return c.toString(); }
|
||||||
@Override
|
@Override
|
||||||
public <E> void forEach(E input, BI_FROM_OBJECT_CONSUMER KSK_GENERIC_TYPE<E> action) { c.forEach(input, action); }
|
|
||||||
@Override
|
|
||||||
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) { return c.matchesAny(filter); }
|
public boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) { return c.matchesAny(filter); }
|
||||||
@Override
|
@Override
|
||||||
public boolean matchesNone(PREDICATE KEY_GENERIC_TYPE filter) { return c.matchesNone(filter); }
|
public boolean matchesNone(PREDICATE KEY_GENERIC_TYPE filter) { return c.matchesNone(filter); }
|
||||||
@@ -1021,9 +1051,9 @@ public class COLLECTIONS
|
|||||||
public KEY_TYPE reduce(KEY_TYPE identity, UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { return c.reduce(identity, operator); }
|
public KEY_TYPE reduce(KEY_TYPE identity, UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { return c.reduce(identity, operator); }
|
||||||
#endif
|
#endif
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { return c.reduce(operator); }
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { return c.reduce(operator); }
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) { return c.findFirst(filter); }
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) { return c.findFirst(filter); }
|
||||||
@Override
|
@Override
|
||||||
public int count(PREDICATE KEY_GENERIC_TYPE filter) { return c.count(filter); }
|
public int count(PREDICATE KEY_GENERIC_TYPE filter) { return c.count(filter); }
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-2
@@ -4,16 +4,22 @@ package speiger.src.collections.PACKAGE.utils;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
#endif
|
#endif
|
||||||
#if JDK_FUNCTION
|
#if JDK_FUNCTION
|
||||||
import java.util.function.PREDICATE;
|
import java.util.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
import speiger.src.collections.PACKAGE.collections.ITERATOR;
|
||||||
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
import speiger.src.collections.PACKAGE.collections.COLLECTION;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
|
||||||
#endif
|
#endif
|
||||||
|
#if !JDK_TYPE
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
#if DEQUEUE_FEATURE
|
#if DEQUEUE_FEATURE
|
||||||
import speiger.src.collections.PACKAGE.queues.PRIORITY_DEQUEUE;
|
import speiger.src.collections.PACKAGE.queues.PRIORITY_DEQUEUE;
|
||||||
#endif
|
#endif
|
||||||
@@ -24,6 +30,7 @@ import speiger.src.collections.PACKAGE.functions.CONSUMER;
|
|||||||
#if !JDK_FUNCTION
|
#if !JDK_FUNCTION
|
||||||
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
|
||||||
#endif
|
#endif
|
||||||
|
import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR;
|
||||||
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -140,7 +147,15 @@ public class PRIORITY_QUEUES
|
|||||||
@Override
|
@Override
|
||||||
public boolean matchesAll(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return queue.matchesAll(filter); } }
|
public boolean matchesAll(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return queue.matchesAll(filter); } }
|
||||||
@Override
|
@Override
|
||||||
public KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return queue.findFirst(filter); } }
|
public OPTIONAL KEY_GENERIC_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return queue.findFirst(filter); } }
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
public <KEY_SPECIAL_TYPE> KEY_SPECIAL_TYPE reduce(KEY_SPECIAL_TYPE identity, BiFunction<KEY_SPECIAL_TYPE, KEY_TYPE, KEY_SPECIAL_TYPE> operator) { synchronized(mutex) { return queue.reduce(identity, operator); } }
|
||||||
|
#else
|
||||||
|
@Override
|
||||||
|
public KEY_TYPE reduce(KEY_TYPE identity, UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { synchronized(mutex) { return queue.reduce(identity, operator); } }
|
||||||
|
#endif
|
||||||
|
@Override
|
||||||
|
public OPTIONAL KEY_GENERIC_TYPE reduce(UNARY_OPERATOR KEY_KEY_GENERIC_TYPE operator) { synchronized(mutex) { return queue.reduce(operator); } }
|
||||||
@Override
|
@Override
|
||||||
public int count(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return queue.count(filter); } }
|
public int count(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return queue.count(filter); } }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -360,6 +360,10 @@ public class SETS
|
|||||||
s = c;
|
s = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
@@ -651,6 +655,10 @@ public class SETS
|
|||||||
s = c;
|
s = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addFirst(KEY_TYPE o) { synchronized(mutex) { s.addFirst(o); } }
|
||||||
|
@Override
|
||||||
|
public void addLast(KEY_TYPE o) { synchronized(mutex) { s.addLast(o); } }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(KEY_TYPE o) { synchronized(mutex) { return s.addAndMoveToFirst(o); } }
|
public boolean addAndMoveToFirst(KEY_TYPE o) { synchronized(mutex) { return s.addAndMoveToFirst(o); } }
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -755,6 +755,10 @@ public class MAPS
|
|||||||
set = c;
|
set = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override
|
||||||
|
public void addLast(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
public boolean addAndMoveToFirst(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); }
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+3
-1
@@ -20,6 +20,7 @@ import speiger.src.testers.PACKAGE.generators.maps.TEST_ORDERED_MAP_GENERATOR;
|
|||||||
import speiger.src.testers.PACKAGE.impl.maps.DERIVED_MAP_GENERATORS;
|
import speiger.src.testers.PACKAGE.impl.maps.DERIVED_MAP_GENERATORS;
|
||||||
import speiger.src.testers.PACKAGE.tests.maps.FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapMoveTester;
|
import speiger.src.testers.PACKAGE.tests.maps.FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapMoveTester;
|
||||||
import speiger.src.testers.PACKAGE.tests.maps.FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapNavigationTester;
|
import speiger.src.testers.PACKAGE.tests.maps.FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapNavigationTester;
|
||||||
|
import speiger.src.testers.PACKAGE.tests.maps.FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapPutTester;
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
import speiger.src.testers.objects.builder.ObjectSetTestSuiteBuilder;
|
import speiger.src.testers.objects.builder.ObjectSetTestSuiteBuilder;
|
||||||
import speiger.src.testers.objects.generators.TestObjectSetGenerator;
|
import speiger.src.testers.objects.generators.TestObjectSetGenerator;
|
||||||
@@ -41,6 +42,7 @@ public class ORDERED_MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MAP_TEST_BU
|
|||||||
List<Class<? extends AbstractTester>> testers = super.getTesters();
|
List<Class<? extends AbstractTester>> testers = super.getTesters();
|
||||||
testers.add(FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapMoveTester.class);
|
testers.add(FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapMoveTester.class);
|
||||||
testers.add(FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapNavigationTester.class);
|
testers.add(FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapNavigationTester.class);
|
||||||
|
testers.add(FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapPutTester.class);
|
||||||
return testers;
|
return testers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +79,7 @@ public class ORDERED_MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MAP_TEST_BU
|
|||||||
features.addAll(parentBuilder.getFeatures());
|
features.addAll(parentBuilder.getFeatures());
|
||||||
features.remove(SpecialFeature.COPYING);
|
features.remove(SpecialFeature.COPYING);
|
||||||
features.remove(SpecialFeature.CHILDREN_COPY);
|
features.remove(SpecialFeature.CHILDREN_COPY);
|
||||||
return ORDERED_MAP_TEST_BUILDER.using(new DERIVED_MAP_GENERATORS.ReverseTestOrderedMapGenerator(delegate))
|
return ORDERED_MAP_TEST_BUILDER.using(new DERIVED_MAP_GENERATORS.ReverseTestOrderedMapGeneratorKV_BRACES(delegate))
|
||||||
.named(parentBuilder.getName() + " reversed").withFeatures(features)
|
.named(parentBuilder.getName() + " reversed").withFeatures(features)
|
||||||
.suppressing(parentBuilder.getSuppressedTests()).createTestSuite();
|
.suppressing(parentBuilder.getSuppressedTests()).createTestSuite();
|
||||||
}
|
}
|
||||||
|
|||||||
+93
@@ -27,6 +27,8 @@ import speiger.src.collections.PACKAGE.maps.impl.concurrent.CONCURRENT_HASH_MAP;
|
|||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.maps.impl.misc.ENUM_MAP;
|
import speiger.src.collections.PACKAGE.maps.impl.misc.ENUM_MAP;
|
||||||
import speiger.src.collections.PACKAGE.maps.impl.misc.LINKED_ENUM_MAP;
|
import speiger.src.collections.PACKAGE.maps.impl.misc.LINKED_ENUM_MAP;
|
||||||
|
import speiger.src.collections.PACKAGE.maps.impl.reference.REF_MAP;
|
||||||
|
import speiger.src.collections.PACKAGE.maps.impl.reference.LINKED_REF_MAP;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
import speiger.src.collections.PACKAGE.maps.impl.tree.RB_TREE_MAP;
|
import speiger.src.collections.PACKAGE.maps.impl.tree.RB_TREE_MAP;
|
||||||
@@ -134,6 +136,97 @@ public class MAP_CONSTRUCTOR_TESTS
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
|
public static class RefMap extends FILE_KEY_TYPE2FILE_VALUE_TYPEMapConstructorTester KEY_VALUE_STRING_GENERIC_TYPE
|
||||||
|
{
|
||||||
|
public RefMap() {
|
||||||
|
setSimpleConstructor(REF_MAP::new);
|
||||||
|
setSizeConstructor(REF_MAP::new);
|
||||||
|
setPArrayConstructor(REF_MAP::new);
|
||||||
|
#if !TYPE_OBJECT || !VALUE_OBJECT
|
||||||
|
setArrayConstructor(REF_MAP::new);
|
||||||
|
#endif
|
||||||
|
setPMapConstructor(REF_MAP::new);
|
||||||
|
setMapConstructor(REF_MAP::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWrongLoadFactorSize() {
|
||||||
|
setSizeConstructor(T -> new REF_MAP KEY_VALUE_STRING_GENERIC_TYPE(T, 0F));
|
||||||
|
try {
|
||||||
|
testSizeConstructor_smallSize();
|
||||||
|
fail("A Constructor using a 0 LoadFactor should error");
|
||||||
|
} catch(IllegalStateException e) {}
|
||||||
|
|
||||||
|
setSizeConstructor(T -> new REF_MAP KEY_VALUE_STRING_GENERIC_TYPE(T, 1F));
|
||||||
|
try {
|
||||||
|
testSizeConstructor_smallSize();
|
||||||
|
fail("A Constructor using a 1 LoadFactor should error");
|
||||||
|
} catch(IllegalStateException e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
@Override
|
||||||
|
protected String[] createKeyElements() {
|
||||||
|
return Arrays.copyOfRange(StringSortTest.NAMES, 0, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if VALUE_OBJECT
|
||||||
|
@Override
|
||||||
|
protected String[] createValueElements() {
|
||||||
|
return Arrays.copyOfRange(StringSortTest.NAMES, 100, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class LinkedRefMap extends FILE_KEY_TYPE2FILE_VALUE_TYPEMapConstructorTester KEY_VALUE_STRING_GENERIC_TYPE
|
||||||
|
{
|
||||||
|
public LinkedRefMap() {
|
||||||
|
setSimpleConstructor(LINKED_REF_MAP::new);
|
||||||
|
setSizeConstructor(LINKED_REF_MAP::new);
|
||||||
|
setPArrayConstructor(LINKED_REF_MAP::new);
|
||||||
|
#if !TYPE_OBJECT || !VALUE_OBJECT
|
||||||
|
setArrayConstructor(LINKED_REF_MAP::new);
|
||||||
|
#endif
|
||||||
|
setPMapConstructor(LINKED_REF_MAP::new);
|
||||||
|
setMapConstructor(LINKED_REF_MAP::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWrongLoadFactorSize() {
|
||||||
|
setSizeConstructor(T -> new LINKED_REF_MAP KEY_VALUE_STRING_GENERIC_TYPE(T, 0F));
|
||||||
|
try {
|
||||||
|
testSizeConstructor_smallSize();
|
||||||
|
fail("A Constructor using a 0 LoadFactor should error");
|
||||||
|
} catch(IllegalStateException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
setSizeConstructor(T -> new LINKED_REF_MAP KEY_VALUE_STRING_GENERIC_TYPE(T, 1F));
|
||||||
|
try {
|
||||||
|
testSizeConstructor_smallSize();
|
||||||
|
fail("A Constructor using a 1 LoadFactor should error");
|
||||||
|
} catch(IllegalStateException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if TYPE_OBJECT
|
||||||
|
@Override
|
||||||
|
protected String[] createKeyElements() {
|
||||||
|
return Arrays.copyOfRange(StringSortTest.NAMES, 0, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if VALUE_OBJECT
|
||||||
|
@Override
|
||||||
|
protected String[] createValueElements() {
|
||||||
|
return Arrays.copyOfRange(StringSortTest.NAMES, 100, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if VALUE_OBJECT
|
#if VALUE_OBJECT
|
||||||
public static class EnumMap extends FILE_KEY_TYPE2FILE_VALUE_TYPEMapConstructorTester<AnEnum, String>
|
public static class EnumMap extends FILE_KEY_TYPE2FILE_VALUE_TYPEMapConstructorTester<AnEnum, String>
|
||||||
#else
|
#else
|
||||||
|
|||||||
+36
@@ -26,6 +26,15 @@ public class FILE_KEY_TYPECollectionForEachTester KEY_GENERIC_TYPE extends ABSTR
|
|||||||
HELPERS.assertContentsAnyOrder(elements, createSamplesArray());
|
HELPERS.assertContentsAnyOrder(elements, createSamplesArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@CollectionFeature.Require(absent = KNOWN_ORDER)
|
||||||
|
public void testIndexedForEachUnknownOrder() {
|
||||||
|
#endignore
|
||||||
|
LIST KEY_GENERIC_TYPE elements = new ARRAY_LISTBRACES();
|
||||||
|
collection.forEachIndexed((K, V) -> elements.add(V));
|
||||||
|
HELPERS.assertContentsAnyOrder(elements, createSamplesArray());
|
||||||
|
}
|
||||||
|
|
||||||
#ignore
|
#ignore
|
||||||
@CollectionFeature.Require(absent = KNOWN_ORDER)
|
@CollectionFeature.Require(absent = KNOWN_ORDER)
|
||||||
public void testForEachExtraUnknownOrder() {
|
public void testForEachExtraUnknownOrder() {
|
||||||
@@ -35,6 +44,15 @@ public class FILE_KEY_TYPECollectionForEachTester KEY_GENERIC_TYPE extends ABSTR
|
|||||||
HELPERS.assertContentsAnyOrder(elements, createSamplesArray());
|
HELPERS.assertContentsAnyOrder(elements, createSamplesArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@CollectionFeature.Require(absent = KNOWN_ORDER)
|
||||||
|
public void testForEachExtraUnknownOrderReverse() {
|
||||||
|
#endignore
|
||||||
|
LIST KEY_GENERIC_TYPE elements = new ARRAY_LISTBRACES();
|
||||||
|
collection.forEach((K, V) -> V.add(K), elements);
|
||||||
|
HELPERS.assertContentsAnyOrder(elements, createSamplesArray());
|
||||||
|
}
|
||||||
|
|
||||||
#ignore
|
#ignore
|
||||||
@CollectionFeature.Require(KNOWN_ORDER)
|
@CollectionFeature.Require(KNOWN_ORDER)
|
||||||
public void testForEachKnownOrder() {
|
public void testForEachKnownOrder() {
|
||||||
@@ -44,6 +62,15 @@ public class FILE_KEY_TYPECollectionForEachTester KEY_GENERIC_TYPE extends ABSTR
|
|||||||
assertEquals("Different ordered iteration", HELPERS.copyToList(getOrderedElements()), elements);
|
assertEquals("Different ordered iteration", HELPERS.copyToList(getOrderedElements()), elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@CollectionFeature.Require(KNOWN_ORDER)
|
||||||
|
public void testIndexedForEachKnownOrder() {
|
||||||
|
#endignore
|
||||||
|
LIST KEY_GENERIC_TYPE elements = new ARRAY_LISTBRACES();
|
||||||
|
collection.forEachIndexed((K, V) -> elements.add(V));
|
||||||
|
assertEquals("Different ordered iteration", HELPERS.copyToList(getOrderedElements()), elements);
|
||||||
|
}
|
||||||
|
|
||||||
#ignore
|
#ignore
|
||||||
@CollectionFeature.Require(KNOWN_ORDER)
|
@CollectionFeature.Require(KNOWN_ORDER)
|
||||||
public void testForEachExtraKnownOrder() {
|
public void testForEachExtraKnownOrder() {
|
||||||
@@ -52,4 +79,13 @@ public class FILE_KEY_TYPECollectionForEachTester KEY_GENERIC_TYPE extends ABSTR
|
|||||||
collection.forEach(elements, LIST::add);
|
collection.forEach(elements, LIST::add);
|
||||||
assertEquals("Different ordered iteration", HELPERS.copyToList(getOrderedElements()), elements);
|
assertEquals("Different ordered iteration", HELPERS.copyToList(getOrderedElements()), elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@CollectionFeature.Require(KNOWN_ORDER)
|
||||||
|
public void testForEachExtraKnownOrderReverse() {
|
||||||
|
#endignore
|
||||||
|
LIST KEY_GENERIC_TYPE elements = new ARRAY_LISTBRACES();
|
||||||
|
collection.forEach((K, V) -> V.add(K), elements);
|
||||||
|
assertEquals("Different ordered iteration", HELPERS.copyToList(getOrderedElements()), elements);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-3
@@ -4,6 +4,12 @@ package speiger.src.testers.PACKAGE.tests.iterable;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#else
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
#endif
|
||||||
|
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
|
|
||||||
import com.google.common.collect.testing.features.CollectionSize;
|
import com.google.common.collect.testing.features.CollectionSize;
|
||||||
@@ -27,17 +33,17 @@ public class FILE_KEY_TYPEIterableFindFirstTester KEY_GENERIC_TYPE extends ABSTR
|
|||||||
@CollectionSize.Require(absent = CollectionSize.ZERO)
|
@CollectionSize.Require(absent = CollectionSize.ZERO)
|
||||||
#endignore
|
#endignore
|
||||||
public void testIterableFindFirst_FindFirstElements() {
|
public void testIterableFindFirst_FindFirstElements() {
|
||||||
assertEquals("First Element should be found", e0(), container.findFirst(T -> KEY_EQUALS(T, e0())));
|
assertEquals("First Element should be found", e0(), container.findFirst(T -> KEY_EQUALS(T, e0())).SUPPLY_GET());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testIterableFindFirst_FindNothing() {
|
public void testIterableFindFirst_FindNothing() {
|
||||||
assertEquals("No element should be found", EMPTY_KEY_VALUE, container.findFirst(T -> KEY_EQUALS(T, e4())));
|
assertEquals("No element should be found", OPTIONAL.empty(), container.findFirst(T -> KEY_EQUALS(T, e4())));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ignore
|
#ignore
|
||||||
@CollectionSize.Require(CollectionSize.SEVERAL)
|
@CollectionSize.Require(CollectionSize.SEVERAL)
|
||||||
#endignore
|
#endignore
|
||||||
public void testIterableFindFirst_FindLastElement() {
|
public void testIterableFindFirst_FindLastElement() {
|
||||||
assertEquals("Last Element should be found", e2(), container.findFirst(T -> KEY_EQUALS(T, e2())));
|
assertEquals("Last Element should be found", e2(), container.findFirst(T -> KEY_EQUALS(T, e2())).SUPPLY_GET());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -3,9 +3,16 @@ package speiger.src.testers.PACKAGE.tests.iterable;
|
|||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#else
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
|
|
||||||
|
import com.google.common.collect.testing.features.CollectionSize;
|
||||||
|
|
||||||
import speiger.src.testers.PACKAGE.tests.base.ABSTRACT_COLLECTION_TESTER;
|
import speiger.src.testers.PACKAGE.tests.base.ABSTRACT_COLLECTION_TESTER;
|
||||||
|
|
||||||
@Ignore
|
@Ignore
|
||||||
@@ -29,7 +36,7 @@ public class FILE_KEY_TYPEIterableReduceTester KEY_GENERIC_TYPE extends ABSTRACT
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testIterableReduce() {
|
public void testIterableReduce() {
|
||||||
assertEquals("The sum of the collection should match", getSum(), collection.reduce(this::sum));
|
assertEquals("The sum of the collection should match", size == CollectionSize.ZERO ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(getSum()), collection.reduce(this::sum));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testIterableExtraReduce() {
|
public void testIterableExtraReduce() {
|
||||||
|
|||||||
+2
@@ -27,6 +27,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapContainsTester KEY_VALUE_GENERIC_TY
|
|||||||
|
|
||||||
#ignore
|
#ignore
|
||||||
@CollectionSize.Require(absent = ZERO)
|
@CollectionSize.Require(absent = ZERO)
|
||||||
|
@SuppressWarnings("unlikely-arg-type")
|
||||||
#endignore
|
#endignore
|
||||||
public void testContainsObject_yes() {
|
public void testContainsObject_yes() {
|
||||||
assertTrue("contains(present) should return true", getMap().ENTRY_SET().contains(new AbstractMap.SimpleEntry<>(e0())));
|
assertTrue("contains(present) should return true", getMap().ENTRY_SET().contains(new AbstractMap.SimpleEntry<>(e0())));
|
||||||
@@ -36,6 +37,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapContainsTester KEY_VALUE_GENERIC_TY
|
|||||||
assertFalse("contains(notPresent) should return false", getMap().ENTRY_SET().contains(e3()));
|
assertFalse("contains(notPresent) should return false", getMap().ENTRY_SET().contains(e3()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unlikely-arg-type")
|
||||||
public void testContainsObject_no() {
|
public void testContainsObject_no() {
|
||||||
assertFalse("contains(notPresent) should return false", getMap().ENTRY_SET().contains(new AbstractMap.SimpleEntry<>(e3())));
|
assertFalse("contains(notPresent) should return false", getMap().ENTRY_SET().contains(new AbstractMap.SimpleEntry<>(e3())));
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -136,6 +136,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapRemoveEntryTester KEY_VALUE_GENERIC
|
|||||||
#ignore
|
#ignore
|
||||||
@CollectionSize.Require(ONE)
|
@CollectionSize.Require(ONE)
|
||||||
@MapFeature.Require(SUPPORTS_REMOVE)
|
@MapFeature.Require(SUPPORTS_REMOVE)
|
||||||
|
@SuppressWarnings("unlikely-arg-type")
|
||||||
#endignore
|
#endignore
|
||||||
public void testRemove_supportedObjectEntryPresent() {
|
public void testRemove_supportedObjectEntryPresent() {
|
||||||
assertTrue(getMap().ENTRY_SET().remove(new AbstractMap.SimpleEntry<>(e0())));
|
assertTrue(getMap().ENTRY_SET().remove(new AbstractMap.SimpleEntry<>(e0())));
|
||||||
@@ -154,6 +155,7 @@ public class FILE_KEY_TYPE2FILE_VALUE_TYPEMapRemoveEntryTester KEY_VALUE_GENERIC
|
|||||||
#ignore
|
#ignore
|
||||||
@CollectionSize.Require(ONE)
|
@CollectionSize.Require(ONE)
|
||||||
@MapFeature.Require(SUPPORTS_REMOVE)
|
@MapFeature.Require(SUPPORTS_REMOVE)
|
||||||
|
@SuppressWarnings("unlikely-arg-type")
|
||||||
#endignore
|
#endignore
|
||||||
public void testRemove_supportedObjectEntryMissing() {
|
public void testRemove_supportedObjectEntryMissing() {
|
||||||
assertFalse(getMap().ENTRY_SET().remove(new AbstractMap.SimpleEntry<>(e3())));
|
assertFalse(getMap().ENTRY_SET().remove(new AbstractMap.SimpleEntry<>(e3())));
|
||||||
|
|||||||
+118
@@ -0,0 +1,118 @@
|
|||||||
|
package speiger.src.testers.PACKAGE.tests.maps;
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
import static com.google.common.collect.testing.features.CollectionSize.ZERO;
|
||||||
|
import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_PUT;
|
||||||
|
import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
|
||||||
|
import static org.junit.Assert.assertNotEquals;
|
||||||
|
#endignore
|
||||||
|
|
||||||
|
import com.google.common.collect.testing.features.CollectionSize;
|
||||||
|
import com.google.common.collect.testing.features.MapFeature;
|
||||||
|
|
||||||
|
import speiger.src.collections.PACKAGE.maps.interfaces.MAP;
|
||||||
|
import speiger.src.collections.PACKAGE.maps.interfaces.ORDERED_MAP;
|
||||||
|
import speiger.src.collections.objects.lists.ObjectList;
|
||||||
|
import speiger.src.testers.PACKAGE.tests.base.maps.ABSTRACT_MAP_TESTER;
|
||||||
|
import speiger.src.testers.objects.utils.ObjectHelpers;
|
||||||
|
|
||||||
|
@SuppressWarnings("javadoc")
|
||||||
|
public class FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapPutTester KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP_TESTER KEY_VALUE_GENERIC_TYPE
|
||||||
|
{
|
||||||
|
private ORDERED_MAP KEY_VALUE_GENERIC_TYPE orderedMap;
|
||||||
|
private ObjectList<MAP.Entry KEY_VALUE_GENERIC_TYPE> values;
|
||||||
|
private KEY_TYPE a;
|
||||||
|
private VALUE_TYPE aValue;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
orderedMap = (ORDERED_MAP KEY_VALUE_GENERIC_TYPE)getMap();
|
||||||
|
values = ObjectHelpers.copyToList(getSampleElements(getSubjectGenerator().getCollectionSize().getNumElements()));
|
||||||
|
if (values.size() >= 1) {
|
||||||
|
a = values.get(0).ENTRY_KEY();
|
||||||
|
aValue = values.get(0).ENTRY_VALUE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(SUPPORTS_PUT)
|
||||||
|
@CollectionSize.Require(absent = ZERO)
|
||||||
|
#endignore
|
||||||
|
public void testPutFirst() {
|
||||||
|
assertEquals(aValue, orderedMap.putFirst(a, v3()));
|
||||||
|
assertNotEquals(v3(), orderedMap.FIRST_ENTRY_VALUE());
|
||||||
|
assertEquals(orderedMap.getDefaultReturnValue(), orderedMap.putFirst(k4(), v4()));
|
||||||
|
assertEquals(v4(), orderedMap.FIRST_ENTRY_VALUE());
|
||||||
|
assertEquals(e4(), orderedMap.firstEntry());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(SUPPORTS_PUT)
|
||||||
|
@CollectionSize.Require(absent = ZERO)
|
||||||
|
#endignore
|
||||||
|
public void testPutLast() {
|
||||||
|
assertEquals(aValue, orderedMap.putLast(a, v3()));
|
||||||
|
assertNotEquals(v3(), orderedMap.LAST_ENTRY_VALUE());
|
||||||
|
assertEquals(orderedMap.getDefaultReturnValue(), orderedMap.putLast(k4(), v4()));
|
||||||
|
assertEquals(v4(), orderedMap.LAST_ENTRY_VALUE());
|
||||||
|
assertEquals(e4(), orderedMap.lastEntry());
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(SUPPORTS_REMOVE)
|
||||||
|
@CollectionSize.Require(CollectionSize.ONE)
|
||||||
|
#endignore
|
||||||
|
public void testPollFirst() {
|
||||||
|
assertFalse(orderedMap.isEmpty());
|
||||||
|
assertEquals(e0(), orderedMap.pollFirstEntry());
|
||||||
|
assertTrue(orderedMap.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(SUPPORTS_REMOVE)
|
||||||
|
@CollectionSize.Require(CollectionSize.ONE)
|
||||||
|
#endignore
|
||||||
|
public void testPollLast() {
|
||||||
|
assertFalse(orderedMap.isEmpty());
|
||||||
|
assertEquals(e0(), orderedMap.pollLastEntry());
|
||||||
|
assertTrue(orderedMap.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(absent = SUPPORTS_PUT)
|
||||||
|
#endignore
|
||||||
|
public void testUnsupportedPutFirst() {
|
||||||
|
try { orderedMap.putFirst(a, aValue); }
|
||||||
|
catch (UnsupportedOperationException tolerated) {}
|
||||||
|
expectUnchanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(absent = SUPPORTS_PUT)
|
||||||
|
#endignore
|
||||||
|
public void testUnsupportedPutLast() {
|
||||||
|
try { orderedMap.putLast(a, aValue); }
|
||||||
|
catch (UnsupportedOperationException tolerated) {}
|
||||||
|
expectUnchanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(absent = SUPPORTS_REMOVE)
|
||||||
|
#endignore
|
||||||
|
public void testUnsupportedPollFirst() {
|
||||||
|
try { orderedMap.pollFirstEntry(); }
|
||||||
|
catch (UnsupportedOperationException tolerated) {}
|
||||||
|
expectUnchanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignore
|
||||||
|
@MapFeature.Require(absent = SUPPORTS_REMOVE)
|
||||||
|
#endignore
|
||||||
|
public void testUnsupportedPollLast() {
|
||||||
|
try { orderedMap.pollFirstEntry(); }
|
||||||
|
catch (UnsupportedOperationException tolerated) {}
|
||||||
|
expectUnchanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-3
@@ -2,6 +2,11 @@ package speiger.src.testers.PACKAGE.tests.queue.iterators;
|
|||||||
|
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
#endif
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#else
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
@@ -27,17 +32,17 @@ public class FILE_KEY_TYPEQueueFindFirstTester KEY_GENERIC_TYPE extends ABSTRACT
|
|||||||
@CollectionSize.Require(absent = CollectionSize.ZERO)
|
@CollectionSize.Require(absent = CollectionSize.ZERO)
|
||||||
#endignore
|
#endignore
|
||||||
public void testQueueFindFirst_FindFirstElements() {
|
public void testQueueFindFirst_FindFirstElements() {
|
||||||
assertEquals("First Element should be found", e0(), queue.findFirst(T -> KEY_EQUALS(T, e0())));
|
assertEquals("First Element should be found", e0(), queue.findFirst(T -> KEY_EQUALS(T, e0())).SUPPLY_GET());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testQueueFindFirst_FindNothing() {
|
public void testQueueFindFirst_FindNothing() {
|
||||||
assertEquals("No element should be found", EMPTY_KEY_VALUE, queue.findFirst(T -> KEY_EQUALS(T, e4())));
|
assertEquals("No element should be found", OPTIONAL.empty(), queue.findFirst(T -> KEY_EQUALS(T, e4())));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ignore
|
#ignore
|
||||||
@CollectionSize.Require(CollectionSize.SEVERAL)
|
@CollectionSize.Require(CollectionSize.SEVERAL)
|
||||||
#endignore
|
#endignore
|
||||||
public void testQueueFindFirst_FindLastElement() {
|
public void testQueueFindFirst_FindLastElement() {
|
||||||
assertEquals("Last Element should be found", e2(), queue.findFirst(T -> KEY_EQUALS(T, e2())));
|
assertEquals("Last Element should be found", e2(), queue.findFirst(T -> KEY_EQUALS(T, e2())).SUPPLY_GET());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -3,10 +3,16 @@ package speiger.src.testers.PACKAGE.tests.queue.iterators;
|
|||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if JDK_TYPE
|
||||||
|
import java.util.OPTIONAL;
|
||||||
|
#else
|
||||||
|
import speiger.src.collections.PACKAGE.functions.OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
|
|
||||||
import speiger.src.testers.PACKAGE.tests.base.ABSTRACT_QUEUE_TESTER;
|
import speiger.src.testers.PACKAGE.tests.base.ABSTRACT_QUEUE_TESTER;
|
||||||
|
import com.google.common.collect.testing.features.CollectionSize;
|
||||||
|
|
||||||
@Ignore
|
@Ignore
|
||||||
@SuppressWarnings("javadoc")
|
@SuppressWarnings("javadoc")
|
||||||
@@ -29,7 +35,7 @@ public class FILE_KEY_TYPEQueueReduceTester KEY_GENERIC_TYPE extends ABSTRACT_QU
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testQueueReduce() {
|
public void testQueueReduce() {
|
||||||
assertEquals("The sum of the queue should match", getSum(), queue.reduce(this::sum));
|
assertEquals("The sum of the queue should match", size == CollectionSize.ZERO ? OPTIONAL.empty() : OPTIONAL.GET_OPTIONAL(getSum()), queue.reduce(this::sum));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testQueueExtraReduce() {
|
public void testQueueExtraReduce() {
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ import com.google.common.collect.testing.features.CollectionSize;
|
|||||||
import com.google.common.collect.testing.features.SetFeature;
|
import com.google.common.collect.testing.features.SetFeature;
|
||||||
import com.google.common.collect.testing.features.Feature;
|
import com.google.common.collect.testing.features.Feature;
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
|
import com.google.common.collect.testing.testers.CollectionAddTester;
|
||||||
|
import com.google.common.collect.testing.testers.CollectionAddAllTester;
|
||||||
|
import com.google.common.collect.testing.testers.CollectionCreationTester;
|
||||||
import com.google.common.collect.testing.features.CollectionFeature;
|
import com.google.common.collect.testing.features.CollectionFeature;
|
||||||
#endif
|
#endif
|
||||||
import junit.framework.Test;
|
import junit.framework.Test;
|
||||||
@@ -122,6 +125,9 @@ public class SET_TESTS extends TestCase
|
|||||||
#ignore
|
#ignore
|
||||||
.withFeatures(getSizes(size)).withFeatures(features);
|
.withFeatures(getSizes(size)).withFeatures(features);
|
||||||
if(nullValues) builder.withFeatures(CollectionFeature.ALLOWS_NULL_VALUES);
|
if(nullValues) builder.withFeatures(CollectionFeature.ALLOWS_NULL_VALUES);
|
||||||
|
builder.suppressing(CollectionAddTester.getAddNullUnsupportedMethod(), CollectionAddTester.getAddNullSupportedMethod());
|
||||||
|
builder.suppressing(CollectionAddAllTester.getAddAllNullUnsupportedMethod());
|
||||||
|
builder.suppressing(CollectionCreationTester.getCreateWithNullUnsupportedMethod());
|
||||||
#endignore
|
#endignore
|
||||||
return builder.createTestSuite();
|
return builder.createTestSuite();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ import speiger.src.collections.PACKAGE.maps.impl.misc.ARRAY_MAP;
|
|||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
import speiger.src.collections.PACKAGE.maps.impl.misc.ENUM_MAP;
|
import speiger.src.collections.PACKAGE.maps.impl.misc.ENUM_MAP;
|
||||||
import speiger.src.collections.PACKAGE.maps.impl.misc.LINKED_ENUM_MAP;
|
import speiger.src.collections.PACKAGE.maps.impl.misc.LINKED_ENUM_MAP;
|
||||||
|
import speiger.src.collections.PACKAGE.maps.impl.reference.REF_MAP;
|
||||||
|
import speiger.src.collections.PACKAGE.maps.impl.reference.LINKED_REF_MAP;
|
||||||
#endif
|
#endif
|
||||||
import speiger.src.collections.PACKAGE.maps.impl.tree.AVL_TREE_MAP;
|
import speiger.src.collections.PACKAGE.maps.impl.tree.AVL_TREE_MAP;
|
||||||
import speiger.src.collections.PACKAGE.maps.impl.tree.RB_TREE_MAP;
|
import speiger.src.collections.PACKAGE.maps.impl.tree.RB_TREE_MAP;
|
||||||
@@ -104,6 +106,7 @@ public class MAP_TESTS extends TestCase
|
|||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.EnumMap.class));
|
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.EnumMap.class));
|
||||||
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.LinkedEnumMap.class));
|
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.LinkedEnumMap.class));
|
||||||
|
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.RefMap.class));
|
||||||
#endif
|
#endif
|
||||||
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.CustomHashMap.class));
|
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.CustomHashMap.class));
|
||||||
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.LinkedCustomHashMap.class));
|
constructors.addTest(new TestSuite(MAP_CONSTRUCTOR_TESTS.LinkedCustomHashMap.class));
|
||||||
@@ -130,27 +133,29 @@ public class MAP_TESTS extends TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void suite(TestSuite suite) {
|
public static void suite(TestSuite suite) {
|
||||||
suite.addTest(mapSuite("HASH_MAP", HASH_MAP::new, getFeatures(), -1, true));
|
suite.addTest(mapSuite("HASH_MAP", HASH_MAP::new, getFeatures(), -1, true, true));
|
||||||
suite.addTest(orderedMapSuite("LINKED_HASH_MAP", LINKED_HASH_MAP::new, getFeatures(), -1));
|
suite.addTest(orderedMapSuite("LINKED_HASH_MAP", LINKED_HASH_MAP::new, getFeatures(), -1, true));
|
||||||
suite.addTest(orderedMapSuite("IMMUTABLE_HASH_MAP", IMMUTABLE_HASH_MAP::new, getImmutableFeatures(), -1));
|
suite.addTest(orderedMapSuite("IMMUTABLE_HASH_MAP", IMMUTABLE_HASH_MAP::new, getImmutableFeatures(), -1, true));
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
suite.addTest(enumMapSuite("ENUM_MAP", ENUM_MAP::new, getFeatures(), 5));
|
suite.addTest(enumMapSuite("ENUM_MAP", ENUM_MAP::new, getFeatures(), 5));
|
||||||
suite.addTest(enumOrderedMapSuite("LINKED_ENUM_MAP", (K, V) -> K.length <= 0 ? new LINKED_ENUM_MAP<>(AnEnum.class) : new LINKED_ENUM_MAP<>(K, V), getFeatures(), 5));
|
suite.addTest(enumOrderedMapSuite("LINKED_ENUM_MAP", (K, V) -> K.length <= 0 ? new LINKED_ENUM_MAP<>(AnEnum.class) : new LINKED_ENUM_MAP<>(K, V), getFeatures(), 5));
|
||||||
|
suite.addTest(mapSuite("REF_MAP", REF_MAP::new, getFeatures(), - 1, true, false));
|
||||||
|
suite.addTest(orderedMapSuite("LINKED_REF_MAP", LINKED_REF_MAP::new, getFeatures(), - 1, false));
|
||||||
#endif
|
#endif
|
||||||
suite.addTest(mapSuite("CUSTOM_HASH_MAP", (K, V) -> new CUSTOM_HASH_MAPKV_BRACES(K, V, HashStrategy.INSTANCE), getFeatures(), -1, true));
|
suite.addTest(mapSuite("CUSTOM_HASH_MAP", (K, V) -> new CUSTOM_HASH_MAPKV_BRACES(K, V, HashStrategy.INSTANCE), getFeatures(), -1, true, true));
|
||||||
suite.addTest(orderedMapSuite("LINKED_CUSTOM_HASH_MAP", (K, V) -> new LINKED_CUSTOM_HASH_MAPKV_BRACES(K, V, HashStrategy.INSTANCE), getFeatures(), -1));
|
suite.addTest(orderedMapSuite("LINKED_CUSTOM_HASH_MAP", (K, V) -> new LINKED_CUSTOM_HASH_MAPKV_BRACES(K, V, HashStrategy.INSTANCE), getFeatures(), -1, true));
|
||||||
suite.addTest(orderedMapSuite("ARRAY_MAP", ARRAY_MAP::new, getFeatures(), -1));
|
suite.addTest(orderedMapSuite("ARRAY_MAP", ARRAY_MAP::new, getFeatures(), -1, true));
|
||||||
suite.addTest(concurrentMapSuite("CONCURRENT_HASH_MAP", CONCURRENT_HASH_MAP::new, getFeatures(), 2));
|
suite.addTest(concurrentMapSuite("CONCURRENT_HASH_MAP", CONCURRENT_HASH_MAP::new, getFeatures(), 2));
|
||||||
suite.addTest(concurrentMapSuite("CONCURRENT_HASH_MAP", CONCURRENT_HASH_MAP::new, getFeatures(), 3));
|
suite.addTest(concurrentMapSuite("CONCURRENT_HASH_MAP", CONCURRENT_HASH_MAP::new, getFeatures(), 3));
|
||||||
suite.addTest(navigableMapSuite("RB_TREE_MAP", RB_TREE_MAP::new, getFeatures(), -1));
|
suite.addTest(navigableMapSuite("RB_TREE_MAP", RB_TREE_MAP::new, getFeatures(), -1));
|
||||||
suite.addTest(navigableMapSuite("AVL_TREE_MAP", AVL_TREE_MAP::new, getFeatures(), -1));
|
suite.addTest(navigableMapSuite("AVL_TREE_MAP", AVL_TREE_MAP::new, getFeatures(), -1));
|
||||||
suite.addTest(navigableMapSuite("SynchronizedRB_TREE_MAP", (K, V) -> new RB_TREE_MAPKV_BRACES(K, V).synchronize(), getLimitedFeatures(), -1));
|
suite.addTest(navigableMapSuite("SynchronizedRB_TREE_MAP", (K, V) -> new RB_TREE_MAPKV_BRACES(K, V).synchronize(), getLimitedFeatures(), -1));
|
||||||
suite.addTest(navigableMapSuite("UnmodifiableRB_TREE_MAP", (K, V) -> new RB_TREE_MAPKV_BRACES(K, V).unmodifiable(), getLimitedImmutableFeatures(), -1));
|
suite.addTest(navigableMapSuite("UnmodifiableRB_TREE_MAP", (K, V) -> new RB_TREE_MAPKV_BRACES(K, V).unmodifiable(), getLimitedImmutableFeatures(), -1));
|
||||||
suite.addTest(orderedMapSuite("SynchronizedORDERED_MAP", (K, V) -> new LINKED_HASH_MAPKV_BRACES(K, V).synchronize(), getFeatures(), -1));
|
suite.addTest(orderedMapSuite("SynchronizedORDERED_MAP", (K, V) -> new LINKED_HASH_MAPKV_BRACES(K, V).synchronize(), getFeatures(), -1, true));
|
||||||
suite.addTest(orderedMapSuite("UnmodifiableORDERED_MAP", (K, V) -> new LINKED_HASH_MAPKV_BRACES(K, V).unmodifiable(), getImmutableFeatures(), -1));
|
suite.addTest(orderedMapSuite("UnmodifiableORDERED_MAP", (K, V) -> new LINKED_HASH_MAPKV_BRACES(K, V).unmodifiable(), getImmutableFeatures(), -1, true));
|
||||||
suite.addTest(mapSuite("EmptyMAP", (K, V) -> MAPS.empty(), getEmptyFeatures(), 0, false));
|
suite.addTest(mapSuite("EmptyMAP", (K, V) -> MAPS.empty(), getEmptyFeatures(), 0, false, true));
|
||||||
suite.addTest(mapSuite("SingletonMAP", (K, V) -> MAPS.singleton(K[0], V[0]), getEmptyFeatures(), 1, false));
|
suite.addTest(mapSuite("SingletonMAP", (K, V) -> MAPS.singleton(K[0], V[0]), getEmptyFeatures(), 1, false, true));
|
||||||
suite.addTest(mapSuite("AbstractMap", SIMPLE_TEST_MAP::new, getTestFeatures(), -1, false));
|
suite.addTest(mapSuite("AbstractMap", SIMPLE_TEST_MAP::new, getTestFeatures(), -1, false, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
@@ -209,14 +214,14 @@ public class MAP_TESTS extends TestCase
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private static Test mapSuite(String name, BiFunction<KEY_STRING_TYPE[], VALUE_STRING_TYPE[], MAP KEY_VALUE_STRING_GENERIC_TYPE> factory, Collection<Feature<?>> features, int size, boolean sorted) {
|
private static Test mapSuite(String name, BiFunction<KEY_STRING_TYPE[], VALUE_STRING_TYPE[], MAP KEY_VALUE_STRING_GENERIC_TYPE> factory, Collection<Feature<?>> features, int size, boolean sorted, boolean allowNullKeys) {
|
||||||
SIMPLE_MAP_TEST_GENERATOR.Maps KEY_VALUE_STRING_GENERIC_TYPE generator = new SIMPLE_MAP_TEST_GENERATOR.Maps KEY_VALUE_STRING_GENERIC_TYPE(factory);
|
SIMPLE_MAP_TEST_GENERATOR.Maps KEY_VALUE_STRING_GENERIC_TYPE generator = new SIMPLE_MAP_TEST_GENERATOR.Maps KEY_VALUE_STRING_GENERIC_TYPE(factory);
|
||||||
MAP_TEST_BUILDER KEY_VALUE_STRING_GENERIC_TYPE builder = MAP_TEST_BUILDER.using(generator);
|
MAP_TEST_BUILDER KEY_VALUE_STRING_GENERIC_TYPE builder = MAP_TEST_BUILDER.using(generator);
|
||||||
builder.shouldBlockKeys(sorted);
|
builder.shouldBlockKeys(sorted);
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
generator.setKeys(createKeys());
|
generator.setKeys(createKeys());
|
||||||
#ignore
|
#ignore
|
||||||
builder.withFeatures(MapFeature.ALLOWS_NULL_KEYS);
|
if(allowNullKeys) builder.withFeatures(MapFeature.ALLOWS_NULL_KEYS);
|
||||||
#endignore
|
#endignore
|
||||||
#endif
|
#endif
|
||||||
#if VALUE_OBJECT
|
#if VALUE_OBJECT
|
||||||
@@ -265,13 +270,13 @@ public class MAP_TESTS extends TestCase
|
|||||||
return builder.named(name).createTestSuite();
|
return builder.named(name).createTestSuite();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Test orderedMapSuite(String name, BiFunction<KEY_STRING_TYPE[], VALUE_STRING_TYPE[], ORDERED_MAP KEY_VALUE_STRING_GENERIC_TYPE> factory, Collection<Feature<?>> features, int size) {
|
private static Test orderedMapSuite(String name, BiFunction<KEY_STRING_TYPE[], VALUE_STRING_TYPE[], ORDERED_MAP KEY_VALUE_STRING_GENERIC_TYPE> factory, Collection<Feature<?>> features, int size, boolean allowNullKeys) {
|
||||||
SIMPLE_MAP_TEST_GENERATOR.OrderedMaps KEY_VALUE_STRING_GENERIC_TYPE generator = new SIMPLE_MAP_TEST_GENERATOR.OrderedMaps KEY_VALUE_STRING_GENERIC_TYPE(factory);
|
SIMPLE_MAP_TEST_GENERATOR.OrderedMaps KEY_VALUE_STRING_GENERIC_TYPE generator = new SIMPLE_MAP_TEST_GENERATOR.OrderedMaps KEY_VALUE_STRING_GENERIC_TYPE(factory);
|
||||||
ORDERED_MAP_TEST_BUILDER KEY_VALUE_STRING_GENERIC_TYPE builder = ORDERED_MAP_TEST_BUILDER.using(generator);
|
ORDERED_MAP_TEST_BUILDER KEY_VALUE_STRING_GENERIC_TYPE builder = ORDERED_MAP_TEST_BUILDER.using(generator);
|
||||||
#if TYPE_OBJECT
|
#if TYPE_OBJECT
|
||||||
generator.setKeys(createKeys());
|
generator.setKeys(createKeys());
|
||||||
#ignore
|
#ignore
|
||||||
builder.withFeatures(MapFeature.ALLOWS_NULL_KEYS);
|
if(allowNullKeys) builder.withFeatures(MapFeature.ALLOWS_NULL_KEYS);
|
||||||
#endignore
|
#endignore
|
||||||
#endif
|
#endif
|
||||||
#if VALUE_OBJECT
|
#if VALUE_OBJECT
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package speiger.src.collections.utils;
|
||||||
|
|
||||||
|
public interface Swapper {
|
||||||
|
public void swap(int fromIndex, int toIndex);
|
||||||
|
}
|
||||||
@@ -29,7 +29,7 @@ public abstract class BaseInt2IntMapTest
|
|||||||
if(!getValidMapTests().contains(MapTests.PUT)) return;
|
if(!getValidMapTests().contains(MapTests.PUT)) return;
|
||||||
Int2IntMap putMap = createMap(PUT_ARRAY, PUT_VALUE_ARRAY);
|
Int2IntMap putMap = createMap(PUT_ARRAY, PUT_VALUE_ARRAY);
|
||||||
Assert.assertEquals(PUT_ARRAY.length, putMap.size());
|
Assert.assertEquals(PUT_ARRAY.length, putMap.size());
|
||||||
Assert.assertEquals(0, putMap.put(0, 512));
|
Assert.assertEquals(putMap.getDefaultReturnValue(), putMap.put(0, 512));
|
||||||
Assert.assertEquals(1, putMap.put(513, 2));
|
Assert.assertEquals(1, putMap.put(513, 2));
|
||||||
Assert.assertEquals(PUT_ARRAY.length + 1, putMap.size());
|
Assert.assertEquals(PUT_ARRAY.length + 1, putMap.size());
|
||||||
Assert.assertEquals(512, putMap.addTo(0, 1));
|
Assert.assertEquals(512, putMap.addTo(0, 1));
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ import speiger.src.collections.ints.maps.interfaces.Int2IntNavigableMap;
|
|||||||
import speiger.src.collections.tests.NavigableSetTest;
|
import speiger.src.collections.tests.NavigableSetTest;
|
||||||
|
|
||||||
@SuppressWarnings("javadoc")
|
@SuppressWarnings("javadoc")
|
||||||
public abstract class BaseInt2IntNavigableMapTest extends BaseInt2IntSortedMapTest
|
public abstract class BaseInt2IntNavigableMapTest extends BaseInt2IntSortedMapTest {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public abstract Int2IntNavigableMap createMap(int[] keys, int[] values);
|
public abstract Int2IntNavigableMap createMap(int[] keys, int[] values);
|
||||||
@Override
|
@Override
|
||||||
@@ -29,30 +28,22 @@ public abstract class BaseInt2IntNavigableMapTest extends BaseInt2IntSortedMapTe
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void lowerTest() {
|
public void lowerTest() {
|
||||||
if(getValidNavigableMapTests().contains(NavigableSetTest.LOWER)) {
|
if(getValidNavigableMapTests().contains(NavigableSetTest.LOWER)) { Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).lowerKey(50) < 50); }
|
||||||
Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).lowerKey(50) < 50);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void higherTest() {
|
public void higherTest() {
|
||||||
if(getValidNavigableMapTests().contains(NavigableSetTest.HIGHER)) {
|
if(getValidNavigableMapTests().contains(NavigableSetTest.HIGHER)) { Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).higherKey(50) > 50); }
|
||||||
Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).higherKey(50) > 50);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ceilTest() {
|
public void ceilTest() {
|
||||||
if(getValidNavigableMapTests().contains(NavigableSetTest.CEILING)) {
|
if(getValidNavigableMapTests().contains(NavigableSetTest.CEILING)) { Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).ceilingKey(50) >= 50); }
|
||||||
Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).ceilingKey(50) >= 50);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void floorTest() {
|
public void floorTest() {
|
||||||
if(getValidNavigableMapTests().contains(NavigableSetTest.FLOOR)) {
|
if(getValidNavigableMapTests().contains(NavigableSetTest.FLOOR)) { Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).floorKey(50) <= 50); }
|
||||||
Assert.assertTrue(createMap(TEST_ARRAY, TEST_ARRAY).floorKey(50) <= 50);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ public abstract class BaseInt2IntOrderedMapTest extends BaseInt2IntMapTest
|
|||||||
{
|
{
|
||||||
if(!getValidOrderedMapTests().contains(OrderedMapTests.PUT_MOVE)) return;
|
if(!getValidOrderedMapTests().contains(OrderedMapTests.PUT_MOVE)) return;
|
||||||
Int2IntOrderedMap map = createMap(TEST_ARRAY, TEST_ARRAY);
|
Int2IntOrderedMap map = createMap(TEST_ARRAY, TEST_ARRAY);
|
||||||
Assert.assertEquals(0, map.putAndMoveToFirst(120, -1));
|
Assert.assertEquals(-1, map.putAndMoveToFirst(120, -1));
|
||||||
Assert.assertEquals(120, map.firstIntKey());
|
Assert.assertEquals(120, map.firstIntKey());
|
||||||
Assert.assertEquals(-1, map.firstIntValue());
|
Assert.assertEquals(-1, map.firstIntValue());
|
||||||
Assert.assertEquals(0, map.putAndMoveToLast(121, -2));
|
Assert.assertEquals(-1, map.putAndMoveToLast(121, -2));
|
||||||
Assert.assertEquals(121, map.lastIntKey());
|
Assert.assertEquals(121, map.lastIntKey());
|
||||||
Assert.assertEquals(-2, map.lastIntValue());
|
Assert.assertEquals(-2, map.lastIntValue());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public abstract class BaseIntIterableTest
|
|||||||
public void testStreamFindFirst() {
|
public void testStreamFindFirst() {
|
||||||
if(getValidIterableTests().contains(IterableTest.STREAM_FIND_FIRST)) {
|
if(getValidIterableTests().contains(IterableTest.STREAM_FIND_FIRST)) {
|
||||||
int expected = IntStream.of(TEST_ARRAY).filter(T -> T / 50 > 0).findFirst().getAsInt();
|
int expected = IntStream.of(TEST_ARRAY).filter(T -> T / 50 > 0).findFirst().getAsInt();
|
||||||
int actual = create(TEST_ARRAY).findFirst(T -> T / 50 > 0);
|
int actual = create(TEST_ARRAY).findFirst(T -> T / 50 > 0).getAsInt();
|
||||||
Assert.assertEquals(expected, actual);
|
Assert.assertEquals(expected, actual);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user