diff --git a/.classpath b/.classpath index a9b51ac..6eb9ad0 100644 --- a/.classpath +++ b/.classpath @@ -6,12 +6,6 @@ - - - - - - @@ -38,7 +32,7 @@ - + diff --git a/.project b/.project index e14b2fd..4da9f9b 100644 --- a/.project +++ b/.project @@ -2,21 +2,22 @@ Primitive-Collections - + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + org.eclipse.jdt.core.javanature org.eclipse.buildship.core.gradleprojectnature - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - diff --git a/build.gradle b/build.gradle index ada156b..c1f0242 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ plugins { id 'java-library' id "jacoco" -// id "com.vanniktech.maven.publish" version "0.28.0" } tasks.withType(JavaCompile) { @@ -36,6 +35,7 @@ javadoc { options.tags = [ "implSpec", "note" ] } + eclipse { classpath { downloadJavadoc = true @@ -47,6 +47,7 @@ sourceSets { builder } + configurations { builderCompile.extendsFrom compile } diff --git a/gradle.properties b/gradle.properties index 9428f25..6903c4c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx3G -maxMemory = 1024m +maxMemory = 2048m testThreads = 4 RELEASE_VERSION = 0.9.0 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 47491b5..c3bae2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/builder/java/speiger/src/builder/modules/CollectionModule.java b/src/builder/java/speiger/src/builder/modules/CollectionModule.java index e1d1990..f331a4a 100644 --- a/src/builder/java/speiger/src/builder/modules/CollectionModule.java +++ b/src/builder/java/speiger/src/builder/modules/CollectionModule.java @@ -41,7 +41,7 @@ public class CollectionModule extends BaseModule protected void loadBlockades() { if(!MODULE.isEnabled()) { addBlockedFiles("Iterable", "Iterables", "Iterator", "Iterators", "BidirectionalIterator", "ListIterator"); - addBlockedFiles("Arrays", "Collection", "AbstractCollection", "Collections", "Stack"); + addBlockedFiles("Arrays", "Collection", "OrderedCollection", "AbstractCollection", "Collections", "Stack"); } if(!SPLIT_ITERATORS.isEnabled()) addBlockedFiles("Splititerator", "Splititerators"); if(!IARRAY.isEnabled()) addBlockedFiles("IArray"); @@ -91,6 +91,7 @@ public class CollectionModule extends BaseModule { //Abstract Classes addAbstractMapper("ABSTRACT_COLLECTION", "Abstract%sCollection"); + addAbstractMapper("REVERSED_ORDERED_COLLECTION", "Reverse%sOrderedCollection"); //Helper Classes addClassMapper("ARRAYS", "Arrays"); @@ -101,6 +102,7 @@ public class CollectionModule extends BaseModule //Interfaces addClassMapper("COLLECTION", "Collection"); + addClassMapper("ORDERED_COLLECTION", "OrderedCollection"); addClassMapper("ITERABLE", "Iterable"); addClassMapper("SPLIT_ITERATOR", "Splititerator"); addClassMapper("LIST_ITERATOR", "ListIterator"); diff --git a/src/builder/java/speiger/src/builder/modules/JavaModule.java b/src/builder/java/speiger/src/builder/modules/JavaModule.java index e843c95..da22499 100644 --- a/src/builder/java/speiger/src/builder/modules/JavaModule.java +++ b/src/builder/java/speiger/src/builder/modules/JavaModule.java @@ -196,6 +196,7 @@ public class JavaModule extends BaseModule addComment("@Type", "@param <%s> the keyType of elements maintained by this Collection"); addValueComment("@ValueArrayType", "@param <%s> the keyType of array that the operation should be applied"); addValueComment("@ValueType", "@param <%s> the keyType of elements maintained by this Collection"); + addSimpleMapper("@Java21", getVersion() >= 21 ? "@Override" : ""); addAnnontion("@PrimitiveOverride", "@Override"); addSimpleMapper("@PrimitiveDoc", ""); addAnnontion("@Primitive", "@Deprecated"); diff --git a/src/builder/java/speiger/src/builder/modules/MapModule.java b/src/builder/java/speiger/src/builder/modules/MapModule.java index 5dfc47c..41dba85 100644 --- a/src/builder/java/speiger/src/builder/modules/MapModule.java +++ b/src/builder/java/speiger/src/builder/modules/MapModule.java @@ -253,6 +253,7 @@ public class MapModule extends BaseModule //Abstract Classes addAbstractBiMapper("ABSTRACT_MAP", "Abstract%sMap", "2"); + addAbstractBiMapper("REVERSED_ORDERED_MAP", "Reversed%sOrderedMap", "2"); //Helper Classes addBiClassMapper("MAPS", "Maps", "2"); diff --git a/src/builder/java/speiger/src/builder/modules/SetModule.java b/src/builder/java/speiger/src/builder/modules/SetModule.java index 098a63c..68d5c3d 100644 --- a/src/builder/java/speiger/src/builder/modules/SetModule.java +++ b/src/builder/java/speiger/src/builder/modules/SetModule.java @@ -148,6 +148,7 @@ public class SetModule extends BaseModule //Abstract Classes addAbstractMapper("ABSTRACT_SET", "Abstract%sSet"); + addAbstractMapper("REVERSED_ORDERED_SET", "Reversed%sOrderedSet"); //Helper Classes addClassMapper("SETS", "Sets"); diff --git a/src/builder/resources/speiger/assets/collections/templates/collections/AbstractCollection.template b/src/builder/resources/speiger/assets/collections/templates/collections/AbstractCollection.template index 78680e1..00775a0 100644 --- a/src/builder/resources/speiger/assets/collections/templates/collections/AbstractCollection.template +++ b/src/builder/resources/speiger/assets/collections/templates/collections/AbstractCollection.template @@ -1,12 +1,18 @@ package speiger.src.collections.PACKAGE.collections; import java.util.Collection; +#if ORDERED_MAP_FEATURE +import java.util.function.Supplier; +#endif import java.util.Objects; import java.util.AbstractCollection; #if TYPE_OBJECT import java.util.function.Consumer; #endif +#if ORDERED_MAP_FEATURE +import speiger.src.collections.PACKAGE.lists.LIST_ITERATOR; +#endif #if !TYPE_OBJECT import speiger.src.collections.PACKAGE.functions.CONSUMER; import speiger.src.collections.PACKAGE.utils.ITERATORS; @@ -262,5 +268,79 @@ public abstract class ABSTRACT_COLLECTION KEY_GENERIC_TYPE extends AbstractColle if (a.length > size()) a[size()] = EMPTY_KEY_VALUE; return a; } + +#endif +#if ORDERED_MAP_FEATURE + public static class REVERSED_ORDERED_COLLECTION KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION KEY_GENERIC_TYPE implements ORDERED_COLLECTION KEY_GENERIC_TYPE { + ORDERED_COLLECTION KEY_GENERIC_TYPE collection; + Supplier reverseIterator; + + public REVERSED_ORDERED_COLLECTION(ORDERED_COLLECTION KEY_GENERIC_TYPE collection, Supplier reverseIterator) { + this.collection = collection; + this.reverseIterator = reverseIterator; + } + + @Override + public boolean add(KEY_TYPE o) { return collection.add(o); } + @Override + public ORDERED_COLLECTION KEY_GENERIC_TYPE reversed() { return collection; } + @Override + public void addFirst(KEY_TYPE e) { collection.addLast(e); } + @Override + public void addLast(KEY_TYPE e) { collection.addFirst(e); } + @Override +#if !TYPE_OBJECT + public boolean contains(KEY_TYPE e) { return collection.contains(e); } +#else + public boolean contains(Object e) { return collection.contains(e); } +#endif + @Override +#if !TYPE_OBJECT + public boolean REMOVE_KEY(KEY_TYPE e) { return collection.REMOVE_KEY(e); } +#else + public boolean remove(Object e) { return collection.remove(e); } +#endif + @Override + public void clear() { collection.clear(); } + @Override + public KEY_TYPE GET_FIRST_KEY() { return collection.GET_LAST_KEY(); } + @Override + public KEY_TYPE REMOVE_FIRST_KEY() { return collection.REMOVE_LAST_KEY(); } + @Override + public KEY_TYPE GET_LAST_KEY() { return collection.GET_FIRST_KEY(); } + @Override + public KEY_TYPE REMOVE_LAST_KEY() { return collection.REMOVE_FIRST_KEY(); } + @Override + public ITERATOR KEY_GENERIC_TYPE iterator() { return reverseIterator.get(); } + @Override + public int size() { return collection.size(); } + } + + public static class ReverseBiIterator KEY_GENERIC_TYPE implements LIST_ITERATOR KEY_GENERIC_TYPE { + LIST_ITERATOR KEY_GENERIC_TYPE it; + + public ReverseBiIterator(LIST_ITERATOR KEY_GENERIC_TYPE it) { + this.it = it; + } + + @Override + public KEY_TYPE NEXT() { return it.PREVIOUS(); } + @Override + public boolean hasNext() { return it.hasPrevious(); } + @Override + public boolean hasPrevious() { return it.hasNext(); } + @Override + public KEY_TYPE PREVIOUS() { return it.NEXT(); } + @Override + public void remove() { it.remove(); } + @Override + public int nextIndex() { return it.previousIndex(); } + @Override + public int previousIndex() { return it.nextIndex(); } + @Override + public void set(KEY_TYPE e) { it.set(e); } + @Override + public void add(KEY_TYPE e) { it.add(e); } + } #endif } \ No newline at end of file diff --git a/src/builder/resources/speiger/assets/collections/templates/collections/OrderedCollection.template b/src/builder/resources/speiger/assets/collections/templates/collections/OrderedCollection.template new file mode 100644 index 0000000..0cb1845 --- /dev/null +++ b/src/builder/resources/speiger/assets/collections/templates/collections/OrderedCollection.template @@ -0,0 +1,83 @@ +package speiger.src.collections.PACKAGE.collections; + +#if JAVA_VERSION>=21 +import java.util.SequencedCollection; + +public interface ORDERED_COLLECTION KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, SequencedCollection { +#else +public interface ORDERED_COLLECTION KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE { +#endif + @Java21 + ORDERED_COLLECTION KEY_GENERIC_TYPE reversed(); + + /** + * A method to add an element to the start of a collection + * @param e that should be added at the start. + */ + public void addFirst(KEY_TYPE e); + + /** + * A method to add an element to the end of a collection + * @param e that should be added at the end. + */ + public void addLast(KEY_TYPE e); + + /** + * A method to get the first element in the collection + * @return first element in the collection + */ + public KEY_TYPE GET_FIRST_KEY(); + /** + * A method to get and remove the first element in the collection + * @return first element in the collection + */ + public KEY_TYPE REMOVE_FIRST_KEY(); + /** + * A method to get the last element in the collection + * @return last element in the collection + */ + public KEY_TYPE GET_LAST_KEY(); + /** + * A method to get and remove the last element in the collection + * @return last element in the collection + */ + public KEY_TYPE REMOVE_LAST_KEY(); + +#if JAVA_VERSION>=21 && !TYPE_OBJECT + @Override + @Deprecated + default void addFirst(CLASS_TYPE e) { + addFirst(OBJ_TO_KEY(e)); + } + + @Override + @Deprecated + default void addLast(CLASS_TYPE e) { + addLast(OBJ_TO_KEY(e)); + } + + @Override + @Deprecated + default CLASS_TYPE getFirst() { + return KEY_TO_OBJ(GET_FIRST_KEY()); + } + + @Override + @Deprecated + default CLASS_TYPE getLast() { + return KEY_TO_OBJ(GET_LAST_KEY()); + } + + @Override + @Deprecated + default CLASS_TYPE removeFirst() { + return KEY_TO_OBJ(REMOVE_FIRST_KEY()); + } + + @Override + @Deprecated + default CLASS_TYPE removeLast() { + return KEY_TO_OBJ(REMOVE_LAST_KEY()); + } +#endif +} \ No newline at end of file diff --git a/src/builder/resources/speiger/assets/collections/templates/lists/CopyOnWriteList.template b/src/builder/resources/speiger/assets/collections/templates/lists/CopyOnWriteList.template index c469a52..d37e82a 100644 --- a/src/builder/resources/speiger/assets/collections/templates/lists/CopyOnWriteList.template +++ b/src/builder/resources/speiger/assets/collections/templates/lists/CopyOnWriteList.template @@ -535,7 +535,7 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER * @return if the element was found. */ @Override - @Deprecated + @Primitive public boolean contains(Object o) { return indexOf(o) != -1; } @@ -546,7 +546,7 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER * @return the index of the element if found. (if not found then -1) */ @Override - @Deprecated + @Primitive public int indexOf(Object o) { KEY_TYPE[] data = this.data; #if TYPE_OBJECT @@ -570,7 +570,7 @@ public class COPY_ON_WRITE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENER * @return the last index of the element if found. (if not found then -1) */ @Override - @Deprecated + @Primitive public int lastIndexOf(Object o) { KEY_TYPE[] data = this.data; #if TYPE_OBJECT diff --git a/src/builder/resources/speiger/assets/collections/templates/lists/List.template b/src/builder/resources/speiger/assets/collections/templates/lists/List.template index 46c5416..4aa195e 100644 --- a/src/builder/resources/speiger/assets/collections/templates/lists/List.template +++ b/src/builder/resources/speiger/assets/collections/templates/lists/List.template @@ -15,6 +15,7 @@ import java.util.function.UnaryOperator; #endif import speiger.src.collections.PACKAGE.collections.COLLECTION; +import speiger.src.collections.PACKAGE.collections.ORDERED_COLLECTION; #if SPLIT_ITERATOR_FEATURE import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR; #endif @@ -40,7 +41,7 @@ import speiger.src.collections.utils.SanityChecks; * A Type Specific List interface that reduces boxing/unboxing and adds a couple extra quality of life features * @Type(T) */ -public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List +public interface LIST KEY_GENERIC_TYPE extends ORDERED_COLLECTION KEY_GENERIC_TYPE, List { #if !TYPE_OBJECT /** @@ -105,6 +106,24 @@ public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List */ public boolean addAll(int index, LIST KEY_GENERIC_TYPE c); + /** + * A method to add an element to the start of a list + * @param e that should be added at the start. + */ + @Override + public default void addFirst(KEY_TYPE e) { + add(0, e); + } + + /** + * A method to add an element to the end of a list + * @param e that should be added at the end. + */ + @Override + public default void addLast(KEY_TYPE e) { + add(e); + } + /** * Helper method that returns the first element of a List. * This function was introduced due to how annoying it is to get/remove the last element of a list. @@ -508,9 +527,56 @@ public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List @Override @Deprecated public default boolean add(CLASS_TYPE e) { - return COLLECTION.super.add(e); + return ORDERED_COLLECTION.super.add(e); + } + +#if JAVA_VERSION>=21 +#if !TYPE_OBJECT + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default void addFirst(CLASS_TYPE e) { + addFirst(OBJ_TO_KEY(e)); + } + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default void addLast(CLASS_TYPE e) { + addLast(OBJ_TO_KEY(e)); } +#endif + @Override + @Deprecated + default CLASS_TYPE getFirst() { + return KEY_TO_OBJ(GET_FIRST_KEY()); + } + + @Override + @Deprecated + default CLASS_TYPE getLast() { + return KEY_TO_OBJ(GET_LAST_KEY()); + } + + @Override + @Deprecated + default CLASS_TYPE removeFirst() { + return KEY_TO_OBJ(REMOVE_FIRST_KEY()); + } + + @Override + @Deprecated + default CLASS_TYPE removeLast() { + return KEY_TO_OBJ(REMOVE_LAST_KEY()); + } + +#endif /** {@inheritDoc} *

This default implementation delegates to the corresponding type-specific function. * @deprecated Please use the corresponding type-specific function instead. @@ -558,7 +624,7 @@ public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List @Override @Deprecated public default boolean contains(Object o) { - return COLLECTION.super.contains(o); + return ORDERED_COLLECTION.super.contains(o); } /** {@inheritDoc} @@ -568,7 +634,7 @@ public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List @Override @Deprecated public default boolean remove(Object o) { - return COLLECTION.super.remove(o); + return ORDERED_COLLECTION.super.remove(o); } /** {@inheritDoc} diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/abstracts/AbstractMap.template b/src/builder/resources/speiger/assets/collections/templates/maps/abstracts/AbstractMap.template index 29e0b4d..32aab8d 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/abstracts/AbstractMap.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/abstracts/AbstractMap.template @@ -14,6 +14,15 @@ import speiger.src.collections.PACKAGE.functions.function.FUNCTION; #endif import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR; import speiger.src.collections.PACKAGE.maps.interfaces.MAP; +#if ORDERED_MAP_FEATURE +import speiger.src.collections.PACKAGE.maps.interfaces.ORDERED_MAP; +import speiger.src.collections.PACKAGE.sets.ORDERED_SET; +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; +#if !TYPE_OBJECT +import speiger.src.collections.objects.sets.AbstractObjectSet; +import speiger.src.collections.objects.sets.ObjectOrderedSet; +#endif +#endif import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET; import speiger.src.collections.PACKAGE.sets.SET; #if MAPS_FEATURE @@ -119,7 +128,7 @@ public abstract class ABSTRACT_MAP KEY_VALUE_GENERIC_TYPE extends AbstractMap ENTRY_SET() { return new AbstractObjectSet.ReversedObjectOrderedSet<>(map.ENTRY_SET()); } + @Override + public ORDERED_SET KEY_GENERIC_TYPE keySet() { return new ABSTRACT_SET.REVERSED_ORDERED_SETBRACES(map.keySet()); } + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { return map.values().reversed(); } + @Override + public ORDERED_MAP KEY_VALUE_GENERIC_TYPE reversed() { return map; } + } + + /** * A Simple Type Specific Entry class to reduce boxing/unboxing * @Type(T) diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/impl/customHash/LinkedOpenCustomHashMap.template b/src/builder/resources/speiger/assets/collections/templates/maps/impl/customHash/LinkedOpenCustomHashMap.template index 1003644..6682ecf 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/impl/customHash/LinkedOpenCustomHashMap.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/impl/customHash/LinkedOpenCustomHashMap.template @@ -40,7 +40,7 @@ import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET; import speiger.src.collections.PACKAGE.sets.ORDERED_SET; import speiger.src.collections.PACKAGE.utils.STRATEGY; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ABSTRACT_COLLECTION; -import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_COLLECTION; +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ITERATOR; #if !SAME_TYPE import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_UNARY_OPERATOR; @@ -295,6 +295,54 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M return getDefaultReturnValue(); } + @Override + public VALUE_TYPE putFirst(KEY_TYPE key, VALUE_TYPE value) { + if(strategy.equals(key, EMPTY_KEY_VALUE)) { + if(containsNull) return values[nullIndex]; + values[nullIndex] = value; + containsNull = true; + onNodeAdded(nullIndex); + moveToFirstIndex(nullIndex); + } + else { + int pos = HashUtil.mix(strategy.hashCode(key)) & mask; + while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) { + if(strategy.equals(keys[pos], key)) return values[pos]; + pos = ++pos & mask; + } + keys[pos] = key; + values[pos] = value; + onNodeAdded(pos); + moveToFirstIndex(pos); + } + if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor)); + return getDefaultReturnValue(); + } + + @Override + public VALUE_TYPE putLast(KEY_TYPE key, VALUE_TYPE value) { + if(strategy.equals(key, EMPTY_KEY_VALUE)) { + if(containsNull) return values[nullIndex]; + values[nullIndex] = value; + containsNull = true; + onNodeAdded(nullIndex); + moveToLastIndex(nullIndex); + } + else { + int pos = HashUtil.mix(strategy.hashCode(key)) & mask; + while(!strategy.equals(keys[pos], EMPTY_KEY_VALUE)) { + if(strategy.equals(keys[pos], key)) return values[pos]; + pos = ++pos & mask; + } + keys[pos] = key; + values[pos] = value; + onNodeAdded(pos); + moveToLastIndex(pos); + } + if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor)); + return getDefaultReturnValue(); + } + @Override public boolean moveToFirst(KEY_TYPE key) { if(isEmpty() || strategy.equals(FIRST_ENTRY_KEY(), key)) return false; @@ -430,6 +478,52 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M return values[lastIndex]; } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[firstIndex], values[firstIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[lastIndex], values[lastIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry() { + if(size == 0) throw new NoSuchElementException(); + int pos = firstIndex; + onNodeRemoved(pos); + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[pos], values[pos]); + size--; + if(strategy.equals(result.ENTRY_KEY(), EMPTY_KEY_VALUE)) { + containsNull = false; + keys[nullIndex] = EMPTY_KEY_VALUE; + values[nullIndex] = EMPTY_VALUE; + } + else shiftKeys(pos); + if(nullIndex > minCapacity && size < maxFill / 4 && nullIndex > HashUtil.DEFAULT_MIN_CAPACITY) rehash(nullIndex / 2); + return result; + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry() { + if(size == 0) throw new NoSuchElementException(); + int pos = lastIndex; + onNodeRemoved(pos); + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[pos], values[pos]); + size--; + if(strategy.equals(result.ENTRY_KEY(), EMPTY_KEY_VALUE)) { + containsNull = false; + keys[nullIndex] = EMPTY_KEY_VALUE; + values[nullIndex] = EMPTY_VALUE; + } + else shiftKeys(pos); + if(nullIndex > minCapacity && size < maxFill / 4 && nullIndex > HashUtil.DEFAULT_MIN_CAPACITY) rehash(nullIndex / 2); + return result; + } + @Override public ObjectOrderedSet ENTRY_SET() { if(entrySet == null) entrySet = new MapEntrySet(); @@ -443,9 +537,9 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M } @Override - public VALUE_COLLECTION VALUE_GENERIC_TYPE values() { + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { if(valuesC == null) valuesC = new Values(); - return valuesC; + return (VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE)valuesC; } @Override @@ -630,24 +724,24 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE first() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getFirst() { return new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE last() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getLast() { return new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirst() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeFirst() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); POLL_FIRST_ENTRY_KEY(); return entry; } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLast() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeLast() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); POLL_LAST_ENTRY_KEY(); return entry; @@ -655,7 +749,12 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M @Override public ObjectBidirectionalIterator iterator() { - return new EntryIterator(); + return new EntryIterator(true); + } + + @Override + public ObjectBidirectionalIterator reverseIterator() { + return new ReverseBiIterator<>(new EntryIterator(false)); } @Override @@ -665,7 +764,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M @Override public ObjectBidirectionalIterator fastIterator() { - return new FastEntryIterator(); + return new FastEntryIterator(true); } @Override @@ -919,7 +1018,12 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M @Override public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { - return new KeyIterator(); + return new KeyIterator(true); + } + + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new KeyIterator(false)); } @Override @@ -941,22 +1045,22 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M } @Override - public KEY_TYPE FIRST_KEY() { + public KEY_TYPE GET_FIRST_KEY() { return FIRST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_FIRST_KEY() { + public KEY_TYPE REMOVE_FIRST_KEY() { return POLL_FIRST_ENTRY_KEY(); } @Override - public KEY_TYPE LAST_KEY() { + public KEY_TYPE GET_LAST_KEY() { return LAST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_LAST_KEY() { + public KEY_TYPE REMOVE_LAST_KEY() { return POLL_LAST_ENTRY_KEY(); } @@ -1100,39 +1204,47 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M } } - private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE { + private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE implements VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE { #if VALUE_OBJECT @Override @Deprecated - public boolean contains(Object e) { - return containsValue(e); - } - + public boolean contains(Object e) { return containsValue(e); } #else @Override - public boolean contains(VALUE_TYPE e) { - return containsValue(e); - } - + public boolean contains(VALUE_TYPE e) { return containsValue(e); } #endif @Override - public boolean add(VALUE_TYPE o) { - throw new UnsupportedOperationException(); - } - + public boolean add(VALUE_TYPE o) { throw new UnsupportedOperationException(); } @Override - public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { - return new ValueIterator(); - } - + public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { return new ValueIterator(true); } @Override - public int size() { - return LINKED_CUSTOM_HASH_MAP.this.size(); - } - + public int size() { return LINKED_CUSTOM_HASH_MAP.this.size(); } @Override - public void clear() { - LINKED_CUSTOM_HASH_MAP.this.clear(); + public void clear() { LINKED_CUSTOM_HASH_MAP.this.clear(); } + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE reversed() { return new VALUE_ABSTRACT_COLLECTION.VALUE_REVERSED_ORDERED_COLLECTIONVALUE_BRACES(this, this::reverseIterator); } + private VALUE_ITERATOR VALUE_GENERIC_TYPE reverseIterator() { + return new VALUE_ABSTRACT_COLLECTION.ReverseBiIteratorVALUE_BRACES(new ValueIterator(false)); + } + @Override + public void addFirst(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public void addLast(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE VALUE_GET_FIRST_KEY() { return FIRST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_FIRST_KEY() { + VALUE_TYPE result = FIRST_ENTRY_VALUE(); + POLL_FIRST_ENTRY_KEY(); + return result; + } + @Override + public VALUE_TYPE VALUE_GET_LAST_KEY() { return LAST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_LAST_KEY() { + VALUE_TYPE result = LAST_ENTRY_VALUE(); + POLL_LAST_ENTRY_KEY(); + return result; } @Override @@ -1278,7 +1390,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M private class FastEntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry = new MapEntry(); - public FastEntryIterator() {} + public FastEntryIterator(boolean start) { super(start); } public FastEntryIterator(KEY_TYPE from) { super(from); } @@ -1305,7 +1417,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M private class EntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry; - public EntryIterator() {} + public EntryIterator(boolean start) { super(start); } public EntryIterator(KEY_TYPE from) { super(from); } @@ -1335,7 +1447,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M private class KeyIterator extends MapIterator implements LIST_ITERATOR KEY_GENERIC_TYPE { - public KeyIterator() {} + public KeyIterator(boolean start) { super(start); } public KeyIterator(KEY_TYPE from) { super(from); } @@ -1357,7 +1469,7 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M } private class ValueIterator extends MapIterator implements VALUE_LIST_ITERATOR VALUE_GENERIC_TYPE { - public ValueIterator() {} + public ValueIterator(boolean start) { super(start); } @Override public VALUE_TYPE VALUE_PREVIOUS() { @@ -1383,8 +1495,9 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M int current = -1; int index = 0; - MapIterator() { - next = firstIndex; + MapIterator(boolean start) { + if(start) next = firstIndex; + else previous = lastIndex; } MapIterator(KEY_TYPE from) { diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/impl/hash/LinkedOpenHashMap.template b/src/builder/resources/speiger/assets/collections/templates/maps/impl/hash/LinkedOpenHashMap.template index ceded47..993a1e3 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/impl/hash/LinkedOpenHashMap.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/impl/hash/LinkedOpenHashMap.template @@ -39,7 +39,7 @@ import speiger.src.collections.PACKAGE.maps.interfaces.ORDERED_MAP; import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET; import speiger.src.collections.PACKAGE.sets.ORDERED_SET; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ABSTRACT_COLLECTION; -import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_COLLECTION; +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ITERATOR; #if !SAME_TYPE import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_UNARY_OPERATOR; @@ -272,6 +272,54 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G return getDefaultReturnValue(); } + @Override + public VALUE_TYPE putFirst(KEY_TYPE key, VALUE_TYPE value) { + if(KEY_EQUALS_NULL(key)) { + if(containsNull) return values[nullIndex]; + values[nullIndex] = value; + containsNull = true; + onNodeAdded(nullIndex); + moveToFirstIndex(nullIndex); + } + else { + int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask; + while(KEY_EQUALS_NULL(key)) { + if(KEY_EQUALS(keys[pos], key)) return values[pos]; + pos = ++pos & mask; + } + keys[pos] = key; + values[pos] = value; + onNodeAdded(pos); + moveToFirstIndex(pos); + } + if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor)); + return getDefaultReturnValue(); + } + + @Override + public VALUE_TYPE putLast(KEY_TYPE key, VALUE_TYPE value) { + if(KEY_EQUALS_NULL(key)) { + if(containsNull) return values[nullIndex]; + values[nullIndex] = value; + containsNull = true; + onNodeAdded(nullIndex); + moveToLastIndex(nullIndex); + } + else { + int pos = HashUtil.mix(KEY_TO_HASH(key)) & mask; + while(KEY_EQUALS_NULL(key)) { + if(KEY_EQUALS(keys[pos], key)) return values[pos]; + pos = ++pos & mask; + } + keys[pos] = key; + values[pos] = value; + onNodeAdded(pos); + moveToLastIndex(pos); + } + if(size++ >= maxFill) rehash(HashUtil.arraySize(size+1, loadFactor)); + return getDefaultReturnValue(); + } + @Override public boolean moveToFirst(KEY_TYPE key) { if(isEmpty() || KEY_EQUALS(FIRST_ENTRY_KEY(), key)) return false; @@ -434,6 +482,52 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G return values[lastIndex]; } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[firstIndex], values[firstIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[lastIndex], values[lastIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry() { + if(size == 0) throw new NoSuchElementException(); + int pos = firstIndex; + onNodeRemoved(pos); + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[pos], values[pos]); + size--; + if(KEY_EQUALS_NULL(result.ENTRY_KEY())) { + containsNull = false; + keys[nullIndex] = EMPTY_KEY_VALUE; + values[nullIndex] = EMPTY_VALUE; + } + else shiftKeys(pos); + if(nullIndex > minCapacity && size < maxFill / 4 && nullIndex > HashUtil.DEFAULT_MIN_CAPACITY) rehash(nullIndex / 2); + return result; + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry() { + if(size == 0) throw new NoSuchElementException(); + int pos = lastIndex; + onNodeRemoved(pos); + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[pos], values[pos]); + size--; + if(KEY_EQUALS_NULL(result.ENTRY_KEY())) { + containsNull = false; + keys[nullIndex] = EMPTY_KEY_VALUE; + values[nullIndex] = EMPTY_VALUE; + } + else shiftKeys(pos); + if(nullIndex > minCapacity && size < maxFill / 4 && nullIndex > HashUtil.DEFAULT_MIN_CAPACITY) rehash(nullIndex / 2); + return result; + } + @Override public ObjectOrderedSet ENTRY_SET() { if(entrySet == null) entrySet = new MapEntrySet(); @@ -447,9 +541,9 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G } @Override - public VALUE_COLLECTION VALUE_GENERIC_TYPE values() { + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { if(valuesC == null) valuesC = new Values(); - return valuesC; + return (VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE)valuesC; } @Override @@ -634,24 +728,24 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE first() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getFirst() { return new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE last() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getLast() { return new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirst() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeFirst() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); POLL_FIRST_ENTRY_KEY(); return entry; } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLast() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeLast() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); POLL_LAST_ENTRY_KEY(); return entry; @@ -659,7 +753,12 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G @Override public ObjectBidirectionalIterator iterator() { - return new EntryIterator(); + return new EntryIterator(true); + } + + @Override + public ObjectBidirectionalIterator reverseIterator() { + return new ReverseBiIterator<>(new EntryIterator(false)); } @Override @@ -669,7 +768,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G @Override public ObjectBidirectionalIterator fastIterator() { - return new FastEntryIterator(); + return new FastEntryIterator(true); } @Override @@ -918,7 +1017,12 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G @Override public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { - return new KeyIterator(); + return new KeyIterator(true); + } + + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new KeyIterator(false)); } @Override @@ -940,22 +1044,22 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G } @Override - public KEY_TYPE FIRST_KEY() { + public KEY_TYPE GET_FIRST_KEY() { return FIRST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_FIRST_KEY() { + public KEY_TYPE REMOVE_FIRST_KEY() { return POLL_FIRST_ENTRY_KEY(); } @Override - public KEY_TYPE LAST_KEY() { + public KEY_TYPE GET_LAST_KEY() { return LAST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_LAST_KEY() { + public KEY_TYPE REMOVE_LAST_KEY() { return POLL_LAST_ENTRY_KEY(); } @@ -1099,41 +1203,50 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G } } - private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE { + private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE implements VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE { #if VALUE_OBJECT @Override @Deprecated - public boolean contains(Object e) { - return containsValue(e); - } + public boolean contains(Object e) { return containsValue(e); } #else @Override - public boolean contains(VALUE_TYPE e) { - return containsValue(e); - } + public boolean contains(VALUE_TYPE e) { return containsValue(e); } #endif @Override - public boolean add(VALUE_TYPE o) { - throw new UnsupportedOperationException(); - } - + public boolean add(VALUE_TYPE o) { throw new UnsupportedOperationException(); } @Override - public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { - return new ValueIterator(); - } - + public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { return new ValueIterator(true); } @Override - public int size() { - return LINKED_HASH_MAP.this.size(); - } - + public int size() { return LINKED_HASH_MAP.this.size(); } @Override - public void clear() { - LINKED_HASH_MAP.this.clear(); + public void clear() { LINKED_HASH_MAP.this.clear(); } + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE reversed() { return new VALUE_ABSTRACT_COLLECTION.VALUE_REVERSED_ORDERED_COLLECTIONVALUE_BRACES(this, this::reverseIterator); } + private VALUE_ITERATOR VALUE_GENERIC_TYPE reverseIterator() { + return new VALUE_ABSTRACT_COLLECTION.ReverseBiIteratorVALUE_BRACES(new ValueIterator(false)); + } + @Override + public void addFirst(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public void addLast(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE VALUE_GET_FIRST_KEY() { return FIRST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_FIRST_KEY() { + VALUE_TYPE result = FIRST_ENTRY_VALUE(); + POLL_FIRST_ENTRY_KEY(); + return result; + } + @Override + public VALUE_TYPE VALUE_GET_LAST_KEY() { return LAST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_LAST_KEY() { + VALUE_TYPE result = LAST_ENTRY_VALUE(); + POLL_LAST_ENTRY_KEY(); + return result; } - @Override public void forEach(VALUE_CONSUMER VALUE_SUPER_GENERIC_TYPE action) { Objects.requireNonNull(action); @@ -1278,7 +1391,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G private class FastEntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry = new MapEntry(); - public FastEntryIterator() {} + public FastEntryIterator(boolean start) { super(start); } public FastEntryIterator(KEY_TYPE from) { super(from); } @@ -1305,7 +1418,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G private class EntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry; - public EntryIterator() {} + public EntryIterator(boolean start) { super(start); } public EntryIterator(KEY_TYPE from) { super(from); } @@ -1335,7 +1448,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G private class KeyIterator extends MapIterator implements LIST_ITERATOR KEY_GENERIC_TYPE { - public KeyIterator() {} + public KeyIterator(boolean start) { super(start); } public KeyIterator(KEY_TYPE from) { super(from); } @@ -1357,7 +1470,7 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G } private class ValueIterator extends MapIterator implements VALUE_LIST_ITERATOR VALUE_GENERIC_TYPE { - public ValueIterator() {} + public ValueIterator(boolean start) { super(start); } @Override public VALUE_TYPE VALUE_PREVIOUS() { @@ -1382,8 +1495,9 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G int current = -1; int index = 0; - MapIterator() { - next = firstIndex; + MapIterator(boolean start) { + if(start) next = firstIndex; + else previous = lastIndex; } MapIterator(KEY_TYPE from) { diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/impl/immutable/ImmutableOpenHashMap.template b/src/builder/resources/speiger/assets/collections/templates/maps/impl/immutable/ImmutableOpenHashMap.template index 1191936..b2aef2c 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/impl/immutable/ImmutableOpenHashMap.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/impl/immutable/ImmutableOpenHashMap.template @@ -65,7 +65,7 @@ import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_PREDICATE; import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET; #endif import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ABSTRACT_COLLECTION; -import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_COLLECTION; +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ITERATOR; import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_SUPPLIER; #if !SAME_TYPE @@ -119,7 +119,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ /** KeySet cache */ protected transient ORDERED_SET KEY_GENERIC_TYPE keySet; /** Values cache */ - protected transient VALUE_COLLECTION VALUE_GENERIC_TYPE valuesC; + protected transient VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE valuesC; /** Amount of Elements stored in the HashMap */ protected int size; @@ -320,6 +320,10 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ @Override public VALUE_TYPE putAndMoveToLast(KEY_TYPE key, VALUE_TYPE value) { throw new UnsupportedOperationException(); } @Override + public VALUE_TYPE putFirst(KEY_TYPE key, VALUE_TYPE value) { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE putLast(KEY_TYPE key, VALUE_TYPE value) { throw new UnsupportedOperationException(); } + @Override public boolean moveToFirst(KEY_TYPE key) { throw new UnsupportedOperationException(); } @Override public boolean moveToLast(KEY_TYPE key) { throw new UnsupportedOperationException(); } @@ -441,7 +445,24 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ public VALUE_TYPE LAST_ENTRY_VALUE() { if(size == 0) throw new NoSuchElementException(); return values[lastIndex]; - } + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[firstIndex], values[firstIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[lastIndex], values[lastIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry() { throw new UnsupportedOperationException(); } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry() { throw new UnsupportedOperationException(); } @Override public ObjectOrderedSet ENTRY_SET() { @@ -456,7 +477,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ } @Override - public VALUE_COLLECTION VALUE_GENERIC_TYPE values() { + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { if(valuesC == null) valuesC = new Values(); return valuesC; } @@ -621,24 +642,29 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ public boolean moveToLast(MAP.Entry KEY_VALUE_GENERIC_TYPE o) { throw new UnsupportedOperationException(); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE first() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getFirst() { return new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE last() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getLast() { return new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirst() { throw new UnsupportedOperationException(); } + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeFirst() { throw new UnsupportedOperationException(); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLast() { throw new UnsupportedOperationException(); } + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeLast() { throw new UnsupportedOperationException(); } @Override public ObjectBidirectionalIterator iterator() { - return new EntryIterator(); + return new EntryIterator(true); + } + + @Override + public ObjectBidirectionalIterator reverseIterator() { + return new ReverseBiIterator<>(new EntryIterator(false)); } @Override @@ -648,7 +674,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ @Override public ObjectBidirectionalIterator fastIterator() { - return new FastEntryIterator(); + return new FastEntryIterator(true); } @Override @@ -875,7 +901,12 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ @Override public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { - return new KeyIterator(); + return new KeyIterator(true); + } + + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new KeyIterator(false)); } @Override @@ -895,20 +926,20 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ public void clear() { throw new UnsupportedOperationException(); } @Override - public KEY_TYPE FIRST_KEY() { + public KEY_TYPE GET_FIRST_KEY() { return FIRST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_FIRST_KEY() { throw new UnsupportedOperationException(); } + public KEY_TYPE REMOVE_FIRST_KEY() { throw new UnsupportedOperationException(); } @Override - public KEY_TYPE LAST_KEY() { + public KEY_TYPE GET_LAST_KEY() { return LAST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_LAST_KEY() { throw new UnsupportedOperationException(); } + public KEY_TYPE REMOVE_LAST_KEY() { throw new UnsupportedOperationException(); } @Override public void forEach(CONSUMER KEY_SUPER_GENERIC_TYPE action) { @@ -1050,39 +1081,42 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ } } - private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE { + private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE implements VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE { #if VALUE_OBJECT @Override @Deprecated - public boolean contains(Object e) { - return containsValue(e); - } + public boolean contains(Object e) { return containsValue(e); } #else @Override - public boolean contains(VALUE_TYPE e) { - return containsValue(e); - } + public boolean contains(VALUE_TYPE e) { return containsValue(e); } #endif @Override - public boolean add(VALUE_TYPE o) { - throw new UnsupportedOperationException(); - } - + public boolean add(VALUE_TYPE o) { throw new UnsupportedOperationException(); } @Override - public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { - return new ValueIterator(); - } - + public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { return new ValueIterator(true); } @Override - public int size() { - return IMMUTABLE_HASH_MAP.this.size(); - } - + public int size() { return IMMUTABLE_HASH_MAP.this.size(); } @Override public void clear() { throw new UnsupportedOperationException(); } - + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE reversed() { return new VALUE_ABSTRACT_COLLECTION.VALUE_REVERSED_ORDERED_COLLECTIONVALUE_BRACES(this, this::reverseIterator); } + private VALUE_ITERATOR VALUE_GENERIC_TYPE reverseIterator() { + return new VALUE_ABSTRACT_COLLECTION.ReverseBiIteratorVALUE_BRACES(new ValueIterator(false)); + } + @Override + public void addFirst(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public void addLast(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE VALUE_GET_FIRST_KEY() { return FIRST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_FIRST_KEY() { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE VALUE_GET_LAST_KEY() { return LAST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_LAST_KEY() { throw new UnsupportedOperationException(); } @Override public void forEach(VALUE_CONSUMER VALUE_SUPER_GENERIC_TYPE action) { int index = firstIndex; @@ -1226,7 +1260,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ private class FastEntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry = new MapEntry(); - public FastEntryIterator() {} + public FastEntryIterator(boolean start) { super(start); } public FastEntryIterator(KEY_TYPE from) { super(from); } @@ -1252,7 +1286,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ private class EntryIterator extends MapIterator implements ObjectListIterator { - public EntryIterator() {} + public EntryIterator(boolean start) { super(start); } public EntryIterator(KEY_TYPE from) { super(from); } @@ -1279,7 +1313,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ private class KeyIterator extends MapIterator implements LIST_ITERATOR KEY_GENERIC_TYPE { - public KeyIterator() {} + public KeyIterator(boolean start) { super(start); } public KeyIterator(KEY_TYPE from) { super(from); } @@ -1301,7 +1335,7 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ } private class ValueIterator extends MapIterator implements VALUE_LIST_ITERATOR VALUE_GENERIC_TYPE { - public ValueIterator() {} + public ValueIterator(boolean start) { super(start); } @Override public VALUE_TYPE VALUE_PREVIOUS() { @@ -1327,8 +1361,9 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_ int current = -1; int index = 0; - MapIterator() { - next = firstIndex; + MapIterator(boolean start) { + if(start) next = firstIndex; + else previous = lastIndex; } MapIterator(KEY_TYPE from) { diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/ArrayMap.template b/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/ArrayMap.template index 9e08ec7..f340cbe 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/ArrayMap.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/ArrayMap.template @@ -46,7 +46,7 @@ import speiger.src.collections.PACKAGE.maps.interfaces.ORDERED_MAP; import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET; import speiger.src.collections.PACKAGE.sets.ORDERED_SET; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ABSTRACT_COLLECTION; -import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_COLLECTION; +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ITERATOR; import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_SUPPLIER; #if !SAME_TYPE @@ -105,7 +105,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN /** KeySet cache */ protected ORDERED_SET KEY_GENERIC_TYPE keySet; /** Values cache */ - protected VALUE_COLLECTION VALUE_GENERIC_TYPE valuesC; + protected VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE valuesC; /** EntrySet cache */ protected FastOrderedSet KEY_VALUE_GENERIC_TYPE entrySet; @@ -275,6 +275,27 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN return lastValue; } + @Override + public VALUE_TYPE putFirst(KEY_TYPE key, VALUE_TYPE value) { + int index = findIndex(key); + if(index < 0) { + insertIndex(0, key, value); + size++; + return getDefaultReturnValue(); + } + return values[index]; + } + + @Override + public VALUE_TYPE putLast(KEY_TYPE key, VALUE_TYPE value) { + int index = findIndex(key); + if(index < 0) { + insertIndex(size++, key, value); + return getDefaultReturnValue(); + } + return values[index]; + } + @Override public boolean moveToFirst(KEY_TYPE key) { int index = findIndex(key); @@ -402,6 +423,34 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN return result; } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[0], values[0]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[size-1], values[size-1]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry() { + if(size == 0) throw new NoSuchElementException(); + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[0], values[0]); + removeIndex(0); + return result; + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry() { + if(size == 0) throw new NoSuchElementException(); + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[size-1], values[size-1]); + removeIndex(size-1); + return result; + } + @Override public VALUE_TYPE REMOVE_VALUE(KEY_TYPE key) { int index = findIndex(key); @@ -461,7 +510,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN } @Override - public VALUE_COLLECTION VALUE_GENERIC_TYPE values() { + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { if(valuesC == null) valuesC = new Values(); return valuesC; } @@ -828,24 +877,24 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE first() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getFirst() { return new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE last() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getLast() { return new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirst() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeFirst() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); POLL_FIRST_ENTRY_KEY(); return entry; } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLast() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeLast() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); POLL_LAST_ENTRY_KEY(); return entry; @@ -853,7 +902,12 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN @Override public ObjectBidirectionalIterator iterator() { - return new EntryIterator(); + return new EntryIterator(true); + } + + @Override + public ObjectBidirectionalIterator reverseIterator() { + return new ReverseBiIterator<>(new EntryIterator(false)); } @Override @@ -863,7 +917,7 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN @Override public ObjectBidirectionalIterator fastIterator() { - return new FastEntryIterator(); + return new FastEntryIterator(true); } @Override @@ -1073,7 +1127,9 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN @Override public boolean moveToLast(KEY_TYPE o) { return ARRAY_MAP.this.moveToLast(o); } @Override - public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { return new KeyIterator(); } + public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { return new KeyIterator(true); } + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { return new ReverseBiIteratorBRACES(new KeyIterator(false)); } @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) { return new KeyIterator(fromElement); } @Override @@ -1081,13 +1137,13 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN @Override public void clear() { ARRAY_MAP.this.clear(); } @Override - public KEY_TYPE FIRST_KEY() { return FIRST_ENTRY_KEY(); } + public KEY_TYPE GET_FIRST_KEY() { return FIRST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_FIRST_KEY() { return POLL_FIRST_ENTRY_KEY(); } + public KEY_TYPE REMOVE_FIRST_KEY() { return POLL_FIRST_ENTRY_KEY(); } @Override - public KEY_TYPE LAST_KEY() { return LAST_ENTRY_KEY(); } + public KEY_TYPE GET_LAST_KEY() { return LAST_ENTRY_KEY(); } @Override - public KEY_TYPE POLL_LAST_KEY() { return POLL_LAST_ENTRY_KEY(); } + public KEY_TYPE REMOVE_LAST_KEY() { return POLL_LAST_ENTRY_KEY(); } @Override public KeySet copy() { throw new UnsupportedOperationException(); } @@ -1197,40 +1253,49 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN } } - private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE { + private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE implements VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE { #if VALUE_OBJECT @Override - public boolean contains(Object e) { - return containsValue(e); - } + public boolean contains(Object e) { return containsValue(e); } #else @Override - public boolean contains(VALUE_TYPE e) { - return containsValue(e); - } + public boolean contains(VALUE_TYPE e) { return containsValue(e); } #endif @Override - public boolean add(VALUE_TYPE o) { - throw new UnsupportedOperationException(); - } - + public boolean add(VALUE_TYPE o) { throw new UnsupportedOperationException(); } @Override - public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { - return new ValueIterator(); - } - + public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { return new ValueIterator(true); } @Override - public int size() { - return ARRAY_MAP.this.size(); - } - + public int size() { return ARRAY_MAP.this.size(); } @Override - public void clear() { - ARRAY_MAP.this.clear(); + public void clear() { ARRAY_MAP.this.clear(); } + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE reversed() { return new VALUE_ABSTRACT_COLLECTION.VALUE_REVERSED_ORDERED_COLLECTIONVALUE_BRACES(this, this::reverseIterator); } + private VALUE_ITERATOR VALUE_GENERIC_TYPE reverseIterator() { + return new VALUE_ABSTRACT_COLLECTION.ReverseBiIteratorVALUE_BRACES(new ValueIterator(false)); + } + @Override + public void addFirst(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public void addLast(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE VALUE_GET_FIRST_KEY() { return FIRST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_FIRST_KEY() { + VALUE_TYPE result = FIRST_ENTRY_VALUE(); + POLL_FIRST_ENTRY_KEY(); + return result; + } + @Override + public VALUE_TYPE VALUE_GET_LAST_KEY() { return LAST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_LAST_KEY() { + VALUE_TYPE result = LAST_ENTRY_VALUE(); + POLL_LAST_ENTRY_KEY(); + return result; } - @Override public void forEach(VALUE_CONSUMER VALUE_SUPER_GENERIC_TYPE action) { Objects.requireNonNull(action); @@ -1332,10 +1397,8 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN private class FastEntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry = new MapEntry(); - public FastEntryIterator() {} - public FastEntryIterator(KEY_TYPE from) { - index = findIndex(from); - } + public FastEntryIterator(boolean start) { super(start); } + public FastEntryIterator(KEY_TYPE element) { super(element); } @Override public MAP.Entry KEY_VALUE_GENERIC_TYPE next() { @@ -1358,11 +1421,8 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN private class EntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry = null; - public EntryIterator() {} - public EntryIterator(KEY_TYPE from) { - index = findIndex(from); - if(index == -1) throw new NoSuchElementException(); - } + public EntryIterator(boolean start) { super(start); } + public EntryIterator(KEY_TYPE element) { super(element); } @Override public MAP.Entry KEY_VALUE_GENERIC_TYPE next() { @@ -1389,11 +1449,8 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN } private class KeyIterator extends MapIterator implements LIST_ITERATOR KEY_GENERIC_TYPE { - public KeyIterator() {} - public KeyIterator(KEY_TYPE element) { - index = findIndex(element); - if(index == -1) throw new NoSuchElementException(); - } + public KeyIterator(boolean start) { super(start); } + public KeyIterator(KEY_TYPE element) { super(element); } @Override public KEY_TYPE PREVIOUS() { @@ -1413,6 +1470,9 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN } private class ValueIterator extends MapIterator implements VALUE_LIST_ITERATOR VALUE_GENERIC_TYPE { + public ValueIterator(boolean start) { super(start); } + public ValueIterator(KEY_TYPE element) { super(element); } + @Override public VALUE_TYPE VALUE_PREVIOUS() { return values[previousEntry()]; @@ -1433,7 +1493,16 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN private class MapIterator { int index; int lastReturned = -1; - + + MapIterator(boolean start) { + this.index = start ? 0 : size; + } + + MapIterator(KEY_TYPE element) { + index = findIndex(element); + if(index == -1) throw new NoSuchElementException(); + } + public boolean hasNext() { return index < size; } diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/LinkedEnumMap.template b/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/LinkedEnumMap.template index 82ba166..82fd64c 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/LinkedEnumMap.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/impl/misc/LinkedEnumMap.template @@ -18,7 +18,7 @@ import speiger.src.collections.PACKAGE.maps.interfaces.ORDERED_MAP; import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET; import speiger.src.collections.PACKAGE.sets.ORDERED_SET; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ABSTRACT_COLLECTION; -import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_COLLECTION; +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ITERATOR; #if !VALUE_OBJECT && !SAME_TYPE import speiger.src.collections.VALUE_PACKAGE.functions.VALUE_CONSUMER; @@ -216,6 +216,28 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA return getDefaultReturnValue(); } + @Override + public VALUE_TYPE putFirst(T key, VALUE_TYPE value) { + int index = key.ordinal(); + if(isSet(index)) return values[index]; + set(index); + values[index] = value; + onNodeAdded(index); + moveToFirstIndex(index); + return getDefaultReturnValue(); + } + + @Override + public VALUE_TYPE putLast(T key, VALUE_TYPE value) { + int index = key.ordinal(); + if(isSet(index)) return values[index]; + set(index); + values[index] = value; + onNodeAdded(index); + moveToLastIndex(index); + return getDefaultReturnValue(); + } + @Override public boolean moveToFirst(T key) { int index = key.ordinal(); @@ -312,6 +334,42 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA return values[lastIndex]; } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[firstIndex], values[firstIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry() { + if(size == 0) throw new NoSuchElementException(); + return new BasicEntryKV_BRACES(keys[lastIndex], values[lastIndex]); + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry() { + if(size == 0) throw new NoSuchElementException(); + int pos = firstIndex; + firstIndex = (int)links[pos]; + if(0 <= firstIndex) links[firstIndex] |= 0xFFFFFFFF00000000L; + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[pos], values[pos]); + size--; + values[result.ENTRY_KEY().ordinal()] = EMPTY_VALUE; + return result; + } + + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry() { + if(size == 0) throw new NoSuchElementException(); + int pos = lastIndex; + firstIndex = (int)links[pos]; + if(0 <= firstIndex) links[firstIndex] |= 0xFFFFFFFF00000000L; + BasicEntry KEY_VALUE_GENERIC_TYPE result = new BasicEntryKV_BRACES(keys[pos], values[pos]); + size--; + values[result.ENTRY_KEY().ordinal()] = EMPTY_VALUE; + return result; + } + @Override public ObjectOrderedSet ENTRY_SET() { if(entrySet == null) entrySet = new MapEntrySet(); @@ -325,9 +383,9 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA } @Override - public VALUE_COLLECTION VALUE_GENERIC_TYPE values() { + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { if(valuesC == null) valuesC = new Values(); - return valuesC; + return (VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE)valuesC; } @Override @@ -431,24 +489,24 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE first() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getFirst() { return new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE last() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE getLast() { return new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirst() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeFirst() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(FIRST_ENTRY_KEY(), FIRST_ENTRY_VALUE()); POLL_FIRST_ENTRY_KEY(); return entry; } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLast() { + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeLast() { BasicEntry KEY_VALUE_GENERIC_TYPE entry = new BasicEntryKV_BRACES(LAST_ENTRY_KEY(), LAST_ENTRY_VALUE()); POLL_LAST_ENTRY_KEY(); return entry; @@ -456,7 +514,12 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA @Override public ObjectBidirectionalIterator iterator() { - return new EntryIterator(); + return new EntryIterator(true); + } + + @Override + public ObjectBidirectionalIterator reverseIterator() { + return new ReverseBiIterator<>(new EntryIterator(false)); } @Override @@ -466,7 +529,7 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA @Override public ObjectBidirectionalIterator fastIterator() { - return new FastEntryIterator(); + return new FastEntryIterator(true); } @Override @@ -593,7 +656,12 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA @Override public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { - return new KeyIterator(); + return new KeyIterator(true); + } + + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new KeyIterator(false)); } @Override @@ -614,22 +682,22 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA } @Override - public T FIRST_KEY() { + public T GET_FIRST_KEY() { return FIRST_ENTRY_KEY(); } @Override - public T POLL_FIRST_KEY() { + public T REMOVE_FIRST_KEY() { return POLL_FIRST_ENTRY_KEY(); } @Override - public T LAST_KEY() { + public T GET_LAST_KEY() { return LAST_ENTRY_KEY(); } @Override - public T POLL_LAST_KEY() { + public T REMOVE_LAST_KEY() { return POLL_LAST_ENTRY_KEY(); } @@ -656,41 +724,50 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA #endif } - private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE { + private class Values extends VALUE_ABSTRACT_COLLECTION VALUE_GENERIC_TYPE implements VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE { #if VALUE_OBJECT @Override @Deprecated - public boolean contains(Object e) { - return containsValue(e); - } + public boolean contains(Object e) { return containsValue(e); } #else @Override - public boolean contains(VALUE_TYPE e) { - return containsValue(e); - } + public boolean contains(VALUE_TYPE e) { return containsValue(e); } #endif @Override - public boolean add(VALUE_TYPE o) { - throw new UnsupportedOperationException(); - } - + public boolean add(VALUE_TYPE o) { throw new UnsupportedOperationException(); } @Override - public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { - return new ValueIterator(); - } - + public VALUE_ITERATOR VALUE_GENERIC_TYPE iterator() { return new ValueIterator(true); } @Override - public int size() { - return LINKED_ENUM_MAP.this.size(); - } - + public int size() { return LINKED_ENUM_MAP.this.size(); } @Override - public void clear() { - LINKED_ENUM_MAP.this.clear(); + public void clear() { LINKED_ENUM_MAP.this.clear(); } + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE reversed() { return new VALUE_ABSTRACT_COLLECTION.VALUE_REVERSED_ORDERED_COLLECTIONVALUE_BRACES(this, this::reverseIterator); } + private VALUE_ITERATOR VALUE_GENERIC_TYPE reverseIterator() { + return new VALUE_ABSTRACT_COLLECTION.ReverseBiIteratorVALUE_BRACES(new ValueIterator(false)); + } + @Override + public void addFirst(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public void addLast(VALUE_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE VALUE_GET_FIRST_KEY() { return FIRST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_FIRST_KEY() { + VALUE_TYPE result = FIRST_ENTRY_VALUE(); + POLL_FIRST_ENTRY_KEY(); + return result; + } + @Override + public VALUE_TYPE VALUE_GET_LAST_KEY() { return LAST_ENTRY_VALUE(); } + @Override + public VALUE_TYPE VALUE_REMOVE_LAST_KEY() { + VALUE_TYPE result = LAST_ENTRY_VALUE(); + POLL_LAST_ENTRY_KEY(); + return result; } - #if VALUE_OBJECT @Override public void forEach(Consumer VALUE_SUPER_GENERIC_TYPE action) { @@ -715,7 +792,7 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA private class FastEntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry = new MapEntry(); - public FastEntryIterator() {} + public FastEntryIterator(boolean start) { super(start); } public FastEntryIterator(T from) { super(from); } @@ -742,7 +819,7 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA private class EntryIterator extends MapIterator implements ObjectListIterator { MapEntry entry; - public EntryIterator() {} + public EntryIterator(boolean start) { super(start); } public EntryIterator(T from) { super(from); } @@ -772,7 +849,7 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA private class KeyIterator extends MapIterator implements LIST_ITERATOR KEY_GENERIC_TYPE { - public KeyIterator() {} + public KeyIterator(boolean start) { super(start); } public KeyIterator(T from) { super(from); } @@ -794,7 +871,7 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA } private class ValueIterator extends MapIterator implements VALUE_LIST_ITERATOR VALUE_GENERIC_TYPE { - public ValueIterator() {} + public ValueIterator(boolean start) { super(start); } @Override public VALUE_TYPE VALUE_PREVIOUS() { @@ -820,8 +897,9 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA int current = -1; int index = 0; - MapIterator() { - next = firstIndex; + MapIterator(boolean start) { + if(start) next = firstIndex; + else previous = lastIndex; } MapIterator(T from) { diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/Map.template b/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/Map.template index 08adcf2..c073c8a 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/Map.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/Map.template @@ -154,7 +154,7 @@ public interface MAP KEY_VALUE_GENERIC_TYPE extends Map entry) { - return put(entry.getKey(), entry.getValue()); + return put(OBJ_TO_KEY(entry.getKey()), OBJ_TO_VALUE(entry.getValue())); } #endif diff --git a/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/OrderedMap.template b/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/OrderedMap.template index 1882661..074329f 100644 --- a/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/OrderedMap.template +++ b/src/builder/resources/speiger/assets/collections/templates/maps/interfaces/OrderedMap.template @@ -1,8 +1,15 @@ package speiger.src.collections.PACKAGE.maps.interfaces; +#if JAVA_VERSION>=21 +import java.util.Map; +import java.util.SequencedMap; + +#endif #if MAPS_FEATURE import speiger.src.collections.PACKAGE.utils.maps.MAPS; #endif +import speiger.src.collections.PACKAGE.maps.abstracts.ABSTRACT_MAP; +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; #if !TYPE_OBJECT import speiger.src.collections.PACKAGE.sets.ORDERED_SET; #endif @@ -17,7 +24,11 @@ import speiger.src.collections.objects.sets.ObjectOrderedSet; * @Type(T) * @ValueType(V) */ +#if JAVA_VERSION>=21 +public interface ORDERED_MAP KEY_VALUE_GENERIC_TYPE extends MAP KEY_VALUE_GENERIC_TYPE, SequencedMap +#else public interface ORDERED_MAP KEY_VALUE_GENERIC_TYPE extends MAP KEY_VALUE_GENERIC_TYPE +#endif { /** * A customized put method that allows you to insert into the first index. @@ -37,6 +48,26 @@ public interface ORDERED_MAP KEY_VALUE_GENERIC_TYPE extends MAP KEY_VALUE_GENERI */ public VALUE_TYPE putAndMoveToLast(KEY_TYPE key, VALUE_TYPE value); + /** + * A alternative to putAndMoveToFirst. + * This method simply puts an entry at the first spot of the Map but only if the entry is missing. + * @param key the key that should be inserted + * @param value the value that should be inserted + * @return the previous present or default return value + * @see java.util.Map#put(Object, Object) + */ + public VALUE_TYPE putFirst(KEY_TYPE key, VALUE_TYPE value); + + /** + * A alternative to putAndMoveToLast. + * This method simply puts an entry at the last spot of the Map but only if the entry is missing. + * @param key the key that should be inserted + * @param value the value that should be inserted + * @return the previous present or default return value + * @see java.util.Map#put(Object, Object) + */ + public VALUE_TYPE putLast(KEY_TYPE key, VALUE_TYPE value); + /** * A specific move method to move a given key/value to the first index. * @param key that should be moved to the first index @@ -97,13 +128,34 @@ public interface ORDERED_MAP KEY_VALUE_GENERIC_TYPE extends MAP KEY_VALUE_GENERI */ public VALUE_TYPE LAST_ENTRY_VALUE(); + @Java21 + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry(); + @Java21 + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry(); + @Java21 + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry(); + @Java21 + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry(); @Override public ORDERED_MAP KEY_VALUE_GENERIC_TYPE copy(); @Override public ORDERED_SET KEY_GENERIC_TYPE keySet(); @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values(); + @Override public ObjectOrderedSet ENTRY_SET(); + @Java21 + public default ORDERED_MAP KEY_VALUE_GENERIC_TYPE reversed() { return new ABSTRACT_MAP.REVERSED_ORDERED_MAPKV_BRACES(this); } +#if JAVA_VERSION>=21 + @Override + default ORDERED_SET KEY_GENERIC_TYPE sequencedKeySet() { return keySet(); } + @Override + default VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE sequencedValues() { return values(); } + @Override + default ObjectOrderedSet> sequencedEntrySet() { return (ObjectOrderedSet>)(Object)ENTRY_SET(); } + +#endif #if MAPS_FEATURE /** * Creates a Wrapped SortedMap that is Synchronized @@ -130,6 +182,22 @@ public interface ORDERED_MAP KEY_VALUE_GENERIC_TYPE extends MAP KEY_VALUE_GENERI @Override public default ORDERED_MAP KEY_VALUE_GENERIC_TYPE unmodifiable() { return MAPS.unmodifiable(this); } +#endif +#if JAVA_VERSION>=21 +#if !SAME_TYPE || !TYPE_OBJECT + @Override + @Deprecated + public default CLASS_VALUE_TYPE putFirst(CLASS_TYPE k, CLASS_VALUE_TYPE v) { + return putFirst(OBJ_TO_KEY(k), OBJ_TO_VALUE(v)); + } + + @Override + @Deprecated + public default CLASS_VALUE_TYPE putLast(CLASS_TYPE k, CLASS_VALUE_TYPE v) { + return putLast(OBJ_TO_KEY(k), OBJ_TO_VALUE(v)); + } + +#endif #endif /** * Fast Ordered Entry Set that allows for a faster Entry Iterator by recycling the Entry Object and just exchanging 1 internal value diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/AbstractSet.template b/src/builder/resources/speiger/assets/collections/templates/sets/AbstractSet.template index bc97fff..468c4b8 100644 --- a/src/builder/resources/speiger/assets/collections/templates/sets/AbstractSet.template +++ b/src/builder/resources/speiger/assets/collections/templates/sets/AbstractSet.template @@ -6,6 +6,7 @@ import java.util.Objects; import java.util.Set; import speiger.src.collections.PACKAGE.collections.ABSTRACT_COLLECTION; +import speiger.src.collections.PACKAGE.collections.BI_ITERATOR; import speiger.src.collections.PACKAGE.collections.ITERATOR; /** @@ -47,4 +48,95 @@ public abstract class ABSTRACT_SET KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION return false; } } + +#if ORDERED_SET_FEATURE + public static class REVERSED_ORDERED_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE implements ORDERED_SET KEY_GENERIC_TYPE { + protected ORDERED_SET KEY_GENERIC_TYPE set; + + public REVERSED_ORDERED_SET(ORDERED_SET KEY_GENERIC_TYPE set) { + this.set = set; + } + + @Override + public REVERSED_ORDERED_SET KEY_GENERIC_TYPE copy() { throw new UnsupportedOperationException(); } + @Override + public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) { + return set.iterator(fromElement); + } + + @Override + public BI_ITERATOR KEY_GENERIC_TYPE iterator() { + return set.reverseIterator(); + } + + @Override + public BI_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return set.iterator(); + } + + @Override +#if !TYPE_OBJECT + public boolean remove(KEY_TYPE o) { +#else + public boolean remove(Object o) { +#endif + return set.remove(o); + } + + @Override + public boolean add(KEY_TYPE o) { + return set.add(o); + } + + @Override + public boolean addAndMoveToFirst(KEY_TYPE o) { + return set.addAndMoveToLast(o); + } + + @Override + public boolean addAndMoveToLast(KEY_TYPE o) { + return set.addAndMoveToFirst(o); + } + + @Override + public boolean moveToFirst(KEY_TYPE o) { + return set.moveToLast(o); + } + + @Override + public boolean moveToLast(KEY_TYPE o) { + return set.moveToFirst(o); + } + + @Override + public KEY_TYPE GET_FIRST_KEY() { + return set.GET_LAST_KEY(); + } + + @Override + public KEY_TYPE REMOVE_FIRST_KEY() { + return set.REMOVE_LAST_KEY(); + } + + @Override + public KEY_TYPE GET_LAST_KEY() { + return set.GET_FIRST_KEY(); + } + + @Override + public KEY_TYPE REMOVE_LAST_KEY() { + return set.REMOVE_FIRST_KEY(); + } + + @Override + public ORDERED_SET KEY_GENERIC_TYPE reversed() { + return set; + } + + @Override + public int size() { + return set.size(); + } + } +#endif } diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/ArraySet.template b/src/builder/resources/speiger/assets/collections/templates/sets/ArraySet.template index 01fa4dc..eab53f1 100644 --- a/src/builder/resources/speiger/assets/collections/templates/sets/ArraySet.template +++ b/src/builder/resources/speiger/assets/collections/templates/sets/ArraySet.template @@ -219,13 +219,13 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im #endif @Override - public KEY_TYPE FIRST_KEY() { + public KEY_TYPE GET_FIRST_KEY() { if(size == 0) throw new NoSuchElementException(); return data[0]; } @Override - public KEY_TYPE LAST_KEY() { + public KEY_TYPE GET_LAST_KEY() { if(size == 0) throw new NoSuchElementException(); return data[size - 1]; } @@ -354,7 +354,7 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im #endif @Override - public KEY_TYPE POLL_FIRST_KEY() { + public KEY_TYPE REMOVE_FIRST_KEY() { if(size == 0) throw new NoSuchElementException(); KEY_TYPE result = data[0]; System.arraycopy(data, 1, data, 0, --size); @@ -365,7 +365,7 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im } @Override - public KEY_TYPE POLL_LAST_KEY() { + public KEY_TYPE REMOVE_LAST_KEY() { if(size == 0) throw new NoSuchElementException(); size--; #if TYPE_OBJECT @@ -514,6 +514,11 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im return new SetIterator(0); } + @Override + public BI_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new SetIterator(size)); + } + @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) { int index = findIndex(fromElement); diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/ImmutableOpenHashSet.template b/src/builder/resources/speiger/assets/collections/templates/sets/ImmutableOpenHashSet.template index 0128ee9..7ccc55f 100644 --- a/src/builder/resources/speiger/assets/collections/templates/sets/ImmutableOpenHashSet.template +++ b/src/builder/resources/speiger/assets/collections/templates/sets/ImmutableOpenHashSet.template @@ -285,22 +285,22 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI } @Override - public KEY_TYPE FIRST_KEY() { + public KEY_TYPE GET_FIRST_KEY() { if(size == 0) throw new NoSuchElementException(); return keys[firstIndex]; } @Override - public KEY_TYPE POLL_FIRST_KEY() { throw new UnsupportedOperationException(); } + public KEY_TYPE REMOVE_FIRST_KEY() { throw new UnsupportedOperationException(); } @Override - public KEY_TYPE LAST_KEY() { + public KEY_TYPE GET_LAST_KEY() { if(size == 0) throw new NoSuchElementException(); return keys[lastIndex]; } @Override - public KEY_TYPE POLL_LAST_KEY() { throw new UnsupportedOperationException(); } + public KEY_TYPE REMOVE_LAST_KEY() { throw new UnsupportedOperationException(); } @Override public boolean remove(Object o) { throw new UnsupportedOperationException(); } @@ -455,7 +455,12 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI @Override public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { - return new SetIterator(); + return new SetIterator(true); + } + + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new SetIterator(false)); } @Override @@ -526,8 +531,9 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI int current = -1; int index = 0; - SetIterator() { - next = firstIndex; + SetIterator(boolean start) { + if(start) next = firstIndex; + else previous = lastIndex; } SetIterator(KEY_TYPE from) { diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenCustomHashSet.template b/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenCustomHashSet.template index ba5282f..2d32083 100644 --- a/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenCustomHashSet.template +++ b/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenCustomHashSet.template @@ -291,7 +291,7 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY @Override public boolean moveToFirst(KEY_TYPE o) { - if(isEmpty() || strategy.equals(FIRST_KEY(), o)) return false; + if(isEmpty() || strategy.equals(GET_FIRST_KEY(), o)) return false; if(strategy.equals(o, EMPTY_KEY_VALUE)) { if(containsNull) { moveToFirstIndex(nullIndex); @@ -313,7 +313,7 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY @Override public boolean moveToLast(KEY_TYPE o) { - if(isEmpty() || strategy.equals(LAST_KEY(), o)) return false; + if(isEmpty() || strategy.equals(GET_LAST_KEY(), o)) return false; if(strategy.equals(o, EMPTY_KEY_VALUE)) { if(containsNull) { moveToLastIndex(nullIndex); @@ -370,13 +370,13 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY } @Override - public KEY_TYPE FIRST_KEY() { + public KEY_TYPE GET_FIRST_KEY() { if(size == 0) throw new NoSuchElementException(); return keys[firstIndex]; } @Override - public KEY_TYPE POLL_FIRST_KEY() { + public KEY_TYPE REMOVE_FIRST_KEY() { if(size == 0) throw new NoSuchElementException(); int pos = firstIndex; onNodeRemoved(pos); @@ -392,13 +392,13 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY } @Override - public KEY_TYPE LAST_KEY() { + public KEY_TYPE GET_LAST_KEY() { if(size == 0) throw new NoSuchElementException(); return keys[lastIndex]; } @Override - public KEY_TYPE POLL_LAST_KEY() { + public KEY_TYPE REMOVE_LAST_KEY() { if(size == 0) throw new NoSuchElementException(); int pos = lastIndex; onNodeRemoved(pos); @@ -697,7 +697,12 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY @Override public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { - return new SetIterator(); + return new SetIterator(true); + } + + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new SetIterator(false)); } @Override @@ -727,8 +732,9 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY int current = -1; int index = 0; - SetIterator() { - next = firstIndex; + SetIterator(boolean start) { + if(start) next = firstIndex; + else previous = lastIndex; } SetIterator(KEY_TYPE from) { diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenHashSet.template b/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenHashSet.template index 9ebffa8..0cfb36f 100644 --- a/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenHashSet.template +++ b/src/builder/resources/speiger/assets/collections/templates/sets/LinkedOpenHashSet.template @@ -262,7 +262,7 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE @Override public boolean moveToFirst(KEY_TYPE o) { - if(isEmpty() || KEY_EQUALS(FIRST_KEY(), o)) return false; + if(isEmpty() || KEY_EQUALS(GET_FIRST_KEY(), o)) return false; if(KEY_EQUALS_NULL(o)) { if(containsNull) { moveToFirstIndex(nullIndex); @@ -284,7 +284,7 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE @Override public boolean moveToLast(KEY_TYPE o) { - if(isEmpty() || KEY_EQUALS(LAST_KEY(), o)) return false; + if(isEmpty() || KEY_EQUALS(GET_LAST_KEY(), o)) return false; if(KEY_EQUALS_NULL(o)) { if(containsNull) { moveToLastIndex(nullIndex); @@ -341,13 +341,13 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE } @Override - public KEY_TYPE FIRST_KEY() { + public KEY_TYPE GET_FIRST_KEY() { if(size == 0) throw new NoSuchElementException(); return keys[firstIndex]; } @Override - public KEY_TYPE POLL_FIRST_KEY() { + public KEY_TYPE REMOVE_FIRST_KEY() { if(size == 0) throw new NoSuchElementException(); int pos = firstIndex; onNodeRemoved(pos); @@ -363,13 +363,13 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE } @Override - public KEY_TYPE LAST_KEY() { + public KEY_TYPE GET_LAST_KEY() { if(size == 0) throw new NoSuchElementException(); return keys[lastIndex]; } @Override - public KEY_TYPE POLL_LAST_KEY() { + public KEY_TYPE REMOVE_LAST_KEY() { if(size == 0) throw new NoSuchElementException(); int pos = lastIndex; onNodeRemoved(pos); @@ -668,7 +668,12 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE @Override public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { - return new SetIterator(); + return new SetIterator(true); + } + + @Override + public LIST_ITERATOR KEY_GENERIC_TYPE reverseIterator() { + return new ReverseBiIteratorBRACES(new SetIterator(false)); } @Override @@ -698,8 +703,9 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE int current = -1; int index = 0; - SetIterator() { - next = firstIndex; + SetIterator(boolean start) { + if(start) next = firstIndex; + else previous = lastIndex; } SetIterator(KEY_TYPE from) { diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/OrderedSet.template b/src/builder/resources/speiger/assets/collections/templates/sets/OrderedSet.template index c80fa92..7a31a48 100644 --- a/src/builder/resources/speiger/assets/collections/templates/sets/OrderedSet.template +++ b/src/builder/resources/speiger/assets/collections/templates/sets/OrderedSet.template @@ -1,10 +1,15 @@ package speiger.src.collections.PACKAGE.sets; +#if JAVA_VERSION>=21 +import java.util.SequencedSet; + +#endif import speiger.src.collections.PACKAGE.collections.BI_ITERATOR; #if SPLIT_ITERATOR_FEATURE import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR; import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS; #endif +import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET.REVERSED_ORDERED_SET; #if SETS_FEATURE import speiger.src.collections.PACKAGE.utils.SETS; #endif @@ -17,7 +22,11 @@ import speiger.src.collections.PACKAGE.utils.SETS; * * @Type(T) */ +#if JAVA_VERSION>=21 +public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE, SequencedSet +#else public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE +#endif { /** * A customized add method that allows you to insert into the first index. @@ -54,6 +63,7 @@ public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator(); + public BI_ITERATOR KEY_GENERIC_TYPE reverseIterator(); /** * A type Specific Iterator starting from a given key @@ -76,23 +86,76 @@ public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE * A method to get the first element in the set * @return first element in the set */ - public KEY_TYPE FIRST_KEY(); + public KEY_TYPE GET_FIRST_KEY(); /** * A method to get and remove the first element in the set * @return first element in the set */ - public KEY_TYPE POLL_FIRST_KEY(); + public KEY_TYPE REMOVE_FIRST_KEY(); /** * A method to get the last element in the set * @return last element in the set */ - public KEY_TYPE LAST_KEY(); + public KEY_TYPE GET_LAST_KEY(); /** * A method to get and remove the last element in the set * @return last element in the set */ - public KEY_TYPE POLL_LAST_KEY(); + public KEY_TYPE REMOVE_LAST_KEY(); +#if JAVA_VERSION>=21 && !TYPE_OBJECT + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default void addFirst(CLASS_TYPE e) { addAndMoveToFirst(OBJ_TO_KEY(e)); } + + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default void addLast(CLASS_TYPE e) { addAndMoveToLast(OBJ_TO_KEY(e)); } + + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default CLASS_TYPE getFirst() { return GET_FIRST_KEY(); } + + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default CLASS_TYPE getLast() { return GET_LAST_KEY(); } + + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default CLASS_TYPE removeFirst() { return REMOVE_FIRST_KEY(); } + + /** {@inheritDoc} + *

This default implementation delegates to the corresponding type-specific function. + * @deprecated Please use the corresponding type-specific function instead. + */ + @Override + @Deprecated + default CLASS_TYPE removeLast() { return REMOVE_LAST_KEY(); } + +#endif + @Java21 + public default ORDERED_SET KEY_GENERIC_TYPE reversed() { return new REVERSED_ORDERED_SETBRACES(this); } + #if SETS_FEATURE /** * Creates a Wrapped OrderedSet that is Synchronized diff --git a/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template b/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template index f8a98a4..200f46c 100644 --- a/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template +++ b/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template @@ -23,6 +23,9 @@ import java.util.function.Consumer; import speiger.src.collections.PACKAGE.collections.ABSTRACT_COLLECTION; import speiger.src.collections.PACKAGE.collections.COLLECTION; +#if ORDERED_MAP_FEATURE +import speiger.src.collections.PACKAGE.collections.ORDERED_COLLECTION; +#endif import speiger.src.collections.PACKAGE.collections.ITERATOR; #if !TYPE_OBJECT import speiger.src.collections.PACKAGE.functions.COMPARATOR; @@ -76,6 +79,37 @@ public class COLLECTIONS return c instanceof UnmodifiableCollection ? c : new UnmodifiableCollectionBRACES(c); } + /** + * Returns a Immutable Ordered Collection instance based on the instance given. + * @param c that should be made immutable/unmodifiable + * @Type(T) + * @return a unmodifiable Ordered collection wrapper. If the Collection already a unmodifiable wrapper then it just returns itself. + */ + public static GENERIC_KEY_BRACES ORDERED_COLLECTION KEY_GENERIC_TYPE unmodifiable(ORDERED_COLLECTION KEY_GENERIC_TYPE c) { + return c instanceof UnmodifiableOrderedCollection ? c : new UnmodifiableOrderedCollectionBRACES(c); + } + + /** + * Returns a synchronized ordered Collection instance based on the instance given. + * @param c that should be synchronized + * @Type(T) + * @return a synchronized ordered collection wrapper. If the Collection already a synchronized wrapper then it just returns itself. + */ + public static GENERIC_KEY_BRACES ORDERED_COLLECTION KEY_GENERIC_TYPE synchronize(ORDERED_COLLECTION KEY_GENERIC_TYPE c) { + return c instanceof SynchronizedOrderedCollection ? c : new SynchronizedOrderedCollectionBRACES(c); + } + + /** + * Returns a synchronized ordered Collection instance based on the instance given. + * @param c that should be synchronized + * @param mutex is the controller of the synchronization block. + * @Type(T) + * @return a synchronized ordered collection wrapper. If the Collection already a synchronized wrapper then it just returns itself. + */ + public static GENERIC_KEY_BRACES ORDERED_COLLECTION KEY_GENERIC_TYPE synchronize(ORDERED_COLLECTION KEY_GENERIC_TYPE c, Object mutex) { + return c instanceof SynchronizedOrderedCollection ? c : new SynchronizedOrderedCollectionBRACES(c, mutex); + } + /** * Returns a synchronized Collection instance based on the instance given. * @param c that should be synchronized @@ -668,6 +702,38 @@ public class COLLECTIONS @Override public SingletonCollection KEY_GENERIC_TYPE copy() { return new SingletonCollectionBRACES(element); } } + /** + * Synchronized Ordered Collection Wrapper for the synchronizedCollection function + * @Type(T) + */ + public static class SynchronizedOrderedCollection KEY_GENERIC_TYPE extends SynchronizedCollection KEY_GENERIC_TYPE implements ORDERED_COLLECTION KEY_GENERIC_TYPE { + ORDERED_COLLECTION KEY_GENERIC_TYPE c; + + SynchronizedOrderedCollection(ORDERED_COLLECTION KEY_GENERIC_TYPE c, Object mutex) { + super(c, mutex); + this.c = c; + } + + SynchronizedOrderedCollection(ORDERED_COLLECTION KEY_GENERIC_TYPE c) { + super(c); + this.c = c; + } + + @Override + public ORDERED_COLLECTION KEY_GENERIC_TYPE reversed() { return COLLECTIONS.synchronize(c.reversed(), mutex); } + @Override + public void addFirst(KEY_TYPE e) { synchronized(mutex) { this.c.addFirst(e); } } + @Override + public void addLast(KEY_TYPE e) { synchronized(mutex) { this.c.addLast(e); } } + @Override + public KEY_TYPE GET_FIRST_KEY() { synchronized(mutex) { return this.c.GET_FIRST_KEY(); } } + @Override + public KEY_TYPE REMOVE_FIRST_KEY() { synchronized(mutex) { return this.c.REMOVE_FIRST_KEY(); } } + @Override + public KEY_TYPE GET_LAST_KEY() { synchronized(mutex) { return this.c.GET_LAST_KEY(); } } + @Override + public KEY_TYPE REMOVE_LAST_KEY() { synchronized(mutex) { return this.c.REMOVE_LAST_KEY(); } } + } /** * Synchronized Collection Wrapper for the synchronizedCollection function @@ -810,6 +876,34 @@ public class COLLECTIONS public int count(PREDICATE KEY_GENERIC_TYPE filter) { synchronized(mutex) { return c.count(filter); } } } + /** + * Unmodifyable Ordered Collection Wrapper for the unmodifyableCollection method + * @Type(T) + */ + public static class UnmodifiableOrderedCollection KEY_GENERIC_TYPE extends UnmodifiableCollection KEY_GENERIC_TYPE implements ORDERED_COLLECTION KEY_GENERIC_TYPE { + ORDERED_COLLECTION KEY_GENERIC_TYPE c; + + UnmodifiableOrderedCollection(ORDERED_COLLECTION KEY_GENERIC_TYPE c) { + super(c); + this.c = c; + } + + @Override + public ORDERED_COLLECTION KEY_GENERIC_TYPE reversed() { return COLLECTIONS.unmodifiable(c.reversed()); } + @Override + public void addFirst(KEY_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public void addLast(KEY_TYPE e) { throw new UnsupportedOperationException(); } + @Override + public KEY_TYPE GET_FIRST_KEY() { return c.GET_FIRST_KEY(); } + @Override + public KEY_TYPE REMOVE_FIRST_KEY() { throw new UnsupportedOperationException(); } + @Override + public KEY_TYPE GET_LAST_KEY() { return c.GET_LAST_KEY(); } + @Override + public KEY_TYPE REMOVE_LAST_KEY() { throw new UnsupportedOperationException(); } + } + /** * Unmodifyable Collection Wrapper for the unmodifyableCollection method * @Type(T) diff --git a/src/builder/resources/speiger/assets/collections/templates/utils/Iterators.template b/src/builder/resources/speiger/assets/collections/templates/utils/Iterators.template index 302fae7..c0b5da2 100644 --- a/src/builder/resources/speiger/assets/collections/templates/utils/Iterators.template +++ b/src/builder/resources/speiger/assets/collections/templates/utils/Iterators.template @@ -65,7 +65,7 @@ public class ITERATORS * @Type(T) * @return an empty iterator */ - public static GENERIC_KEY_BRACES EmptyIterator KEY_GENERIC_TYPE empty() { + public static GENERIC_KEY_BRACES LIST_ITERATOR KEY_GENERIC_TYPE empty() { #if TYPE_OBJECT return (EmptyIterator)EMPTY; #else @@ -400,7 +400,7 @@ public class ITERATORS * @ArrayType(T) * @return a Iterator that is wrapping a array. */ - public static GENERIC_KEY_BRACES ArrayIterator KEY_GENERIC_TYPE wrap(KEY_TYPE... a) { + public static GENERIC_KEY_BRACES ITERATOR KEY_GENERIC_TYPE wrap(KEY_TYPE... a) { return wrap(a, 0, a.length); } @@ -412,7 +412,7 @@ public class ITERATORS * @ArrayType(T) * @return a Iterator that is wrapping a array. */ - public static GENERIC_KEY_BRACES ArrayIterator KEY_GENERIC_TYPE wrap(KEY_TYPE[] a, int start, int end) { + public static GENERIC_KEY_BRACES ITERATOR KEY_GENERIC_TYPE wrap(KEY_TYPE[] a, int start, int end) { return new ArrayIteratorBRACES(a, start, end); } diff --git a/src/builder/resources/speiger/assets/collections/templates/utils/Lists.template b/src/builder/resources/speiger/assets/collections/templates/utils/Lists.template index f48adc3..8735d35 100644 --- a/src/builder/resources/speiger/assets/collections/templates/utils/Lists.template +++ b/src/builder/resources/speiger/assets/collections/templates/utils/Lists.template @@ -45,7 +45,7 @@ public class LISTS * @Type(T) * @return an empty list */ - public static GENERIC_KEY_BRACES EmptyList KEY_GENERIC_TYPE empty() { + public static GENERIC_KEY_BRACES LIST KEY_GENERIC_TYPE empty() { #if TYPE_OBJECT return (EmptyList)EMPTY; #else diff --git a/src/builder/resources/speiger/assets/collections/templates/utils/Sets.template b/src/builder/resources/speiger/assets/collections/templates/utils/Sets.template index 14e62c0..78b0e8f 100644 --- a/src/builder/resources/speiger/assets/collections/templates/utils/Sets.template +++ b/src/builder/resources/speiger/assets/collections/templates/utils/Sets.template @@ -371,17 +371,19 @@ public class SETS @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator() { return ITERATORS.unmodifiable(s.iterator()); } @Override + public BI_ITERATOR KEY_GENERIC_TYPE reverseIterator() { return ITERATORS.unmodifiable(s.reverseIterator()); } + @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) { return ITERATORS.unmodifiable(s.iterator(fromElement)); } @Override public ORDERED_SET KEY_GENERIC_TYPE copy() { return s.copy(); } @Override - public KEY_TYPE FIRST_KEY() { return s.FIRST_KEY(); } + public KEY_TYPE GET_FIRST_KEY() { return s.GET_FIRST_KEY(); } @Override - public KEY_TYPE POLL_FIRST_KEY() { throw new UnsupportedOperationException(); } + public KEY_TYPE REMOVE_FIRST_KEY() { throw new UnsupportedOperationException(); } @Override - public KEY_TYPE LAST_KEY() { return s.LAST_KEY(); } + public KEY_TYPE GET_LAST_KEY() { return s.GET_LAST_KEY(); } @Override - public KEY_TYPE POLL_LAST_KEY() { throw new UnsupportedOperationException(); } + public KEY_TYPE REMOVE_LAST_KEY() { throw new UnsupportedOperationException(); } } #endif @@ -660,17 +662,19 @@ public class SETS @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator() { synchronized(mutex) { return s.iterator(); } } @Override + public BI_ITERATOR KEY_GENERIC_TYPE reverseIterator() { synchronized(mutex) { return s.reverseIterator(); } } + @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) { synchronized(mutex) { return s.iterator(fromElement); } } @Override public ORDERED_SET KEY_GENERIC_TYPE copy() { synchronized(mutex) { return s.copy(); } } @Override - public KEY_TYPE FIRST_KEY() { synchronized(mutex) { return s.FIRST_KEY(); } } + public KEY_TYPE GET_FIRST_KEY() { synchronized(mutex) { return s.GET_FIRST_KEY(); } } @Override - public KEY_TYPE POLL_FIRST_KEY() { synchronized(mutex) { return s.POLL_FIRST_KEY(); } } + public KEY_TYPE REMOVE_FIRST_KEY() { synchronized(mutex) { return s.REMOVE_FIRST_KEY(); } } @Override - public KEY_TYPE LAST_KEY() { synchronized(mutex) { return s.LAST_KEY(); } } + public KEY_TYPE GET_LAST_KEY() { synchronized(mutex) { return s.GET_LAST_KEY(); } } @Override - public KEY_TYPE POLL_LAST_KEY() { synchronized(mutex) { return s.POLL_LAST_KEY(); } } + public KEY_TYPE REMOVE_LAST_KEY() { synchronized(mutex) { return s.REMOVE_LAST_KEY(); } } } #endif diff --git a/src/builder/resources/speiger/assets/collections/templates/utils/maps/Maps.template b/src/builder/resources/speiger/assets/collections/templates/utils/maps/Maps.template index 2fa0854..6bf3db4 100644 --- a/src/builder/resources/speiger/assets/collections/templates/utils/maps/Maps.template +++ b/src/builder/resources/speiger/assets/collections/templates/utils/maps/Maps.template @@ -56,6 +56,9 @@ import speiger.src.collections.PACKAGE.sets.SET; import speiger.src.collections.PACKAGE.utils.SETS; #endif import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_COLLECTION; +#if ORDERED_MAP_FEATURE +import speiger.src.collections.VALUE_PACKAGE.collections.VALUE_ORDERED_COLLECTION; +#endif #if !SAME_TYPE import speiger.src.collections.VALUE_PACKAGE.functions.function.VALUE_UNARY_OPERATOR; #endif @@ -553,6 +556,10 @@ public class MAPS @Override public VALUE_TYPE putAndMoveToLast(KEY_TYPE key, VALUE_TYPE value) { throw new UnsupportedOperationException(); } @Override + public VALUE_TYPE putFirst(KEY_TYPE key, VALUE_TYPE value) { throw new UnsupportedOperationException(); } + @Override + public VALUE_TYPE putLast(KEY_TYPE key, VALUE_TYPE value) { throw new UnsupportedOperationException(); } + @Override public boolean moveToFirst(KEY_TYPE key) { throw new UnsupportedOperationException(); } @Override public boolean moveToLast(KEY_TYPE key) { throw new UnsupportedOperationException(); } @@ -573,13 +580,25 @@ public class MAPS @Override public VALUE_TYPE LAST_ENTRY_VALUE() { return map.LAST_ENTRY_VALUE(); } @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry() { return map.firstEntry(); } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry() { return map.lastEntry(); } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry() { throw new UnsupportedOperationException(); } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry() { throw new UnsupportedOperationException(); } + @Override public ORDERED_MAP KEY_VALUE_GENERIC_TYPE copy() { return map.copy(); } @Override public ORDERED_SET KEY_GENERIC_TYPE keySet() { if(keys == null) keys = SETS.unmodifiable(map.keySet()); return (ORDERED_SET KEY_GENERIC_TYPE)keys; } - + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { + if(values == null) values = VALUE_COLLECTIONS.unmodifiable(map.values()); + return (VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE)values; + } @Override public ObjectOrderedSet ENTRY_SET() { if(entrySet == null) entrySet = new UnmodifyableOrderedEntrySetKV_BRACES(map.ENTRY_SET()); @@ -749,15 +768,17 @@ public class MAPS @Override public ObjectBidirectionalIterator iterator() { return ObjectIterators.unmodifiable(set.iterator()); } @Override + public ObjectBidirectionalIterator reverseIterator() { return ObjectIterators.unmodifiable(set.reverseIterator()); } + @Override public ObjectBidirectionalIterator iterator(MAP.Entry KEY_VALUE_GENERIC_TYPE fromElement) { return ObjectIterators.unmodifiable(set.iterator(fromElement)); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE first() { return set.first(); } + public MAP.Entry KEY_VALUE_GENERIC_TYPE getFirst() { return set.getFirst(); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirst() { throw new UnsupportedOperationException(); } + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeFirst() { throw new UnsupportedOperationException(); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE last() { return set.last(); } + public MAP.Entry KEY_VALUE_GENERIC_TYPE getLast() { return set.getLast(); } @Override - public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLast() { throw new UnsupportedOperationException(); } + public MAP.Entry KEY_VALUE_GENERIC_TYPE removeLast() { throw new UnsupportedOperationException(); } } #endif @@ -938,6 +959,10 @@ public class MAPS @Override public VALUE_TYPE putAndMoveToLast(KEY_TYPE key, VALUE_TYPE value) { synchronized(mutex) { return map.putAndMoveToLast(key, value); } } @Override + public VALUE_TYPE putFirst(KEY_TYPE key, VALUE_TYPE value) { synchronized(mutex) { return map.putFirst(key, value); } } + @Override + public VALUE_TYPE putLast(KEY_TYPE key, VALUE_TYPE value) { synchronized(mutex) { return map.putLast(key, value); } } + @Override public boolean moveToFirst(KEY_TYPE key) { synchronized(mutex) { return map.moveToFirst(key); } } @Override public boolean moveToLast(KEY_TYPE key) { synchronized(mutex) { return map.moveToLast(key); } } @@ -958,13 +983,25 @@ public class MAPS @Override public VALUE_TYPE LAST_ENTRY_VALUE() { synchronized(mutex) { return map.LAST_ENTRY_VALUE(); } } @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE firstEntry() { synchronized(mutex) { return map.firstEntry(); } } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE lastEntry() { synchronized(mutex) { return map.lastEntry(); } } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollFirstEntry() { synchronized(mutex) { return map.pollFirstEntry(); } } + @Override + public MAP.Entry KEY_VALUE_GENERIC_TYPE pollLastEntry() { synchronized(mutex) { return map.pollLastEntry(); } } + @Override public ORDERED_MAP KEY_VALUE_GENERIC_TYPE copy() { synchronized(mutex) { return map.copy(); } } @Override public ORDERED_SET KEY_GENERIC_TYPE keySet() { if(keys == null) keys = SETS.synchronize(map.keySet(), mutex); return (ORDERED_SET KEY_GENERIC_TYPE)keys; } - + @Override + public VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE values() { + if(values == null) values = VALUE_COLLECTIONS.synchronize(map.values(), mutex); + return (VALUE_ORDERED_COLLECTION VALUE_GENERIC_TYPE)values; + } @Override public ObjectOrderedSet ENTRY_SET() { if(entrySet == null) entrySet = ObjectSets.synchronize(map.ENTRY_SET(), mutex); diff --git a/src/builder/resources/speiger/assets/testers/templates/builder/maps/OrderedMapTestSuiteBuilder.template b/src/builder/resources/speiger/assets/testers/templates/builder/maps/OrderedMapTestSuiteBuilder.template index f47fbf2..9b052ca 100644 --- a/src/builder/resources/speiger/assets/testers/templates/builder/maps/OrderedMapTestSuiteBuilder.template +++ b/src/builder/resources/speiger/assets/testers/templates/builder/maps/OrderedMapTestSuiteBuilder.template @@ -1,9 +1,14 @@ package speiger.src.testers.PACKAGE.builder.maps; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import com.google.common.collect.testing.AbstractTester; +import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder; +import com.google.common.collect.testing.OneSizeTestContainerGenerator; import com.google.common.collect.testing.features.CollectionFeature; +import com.google.common.collect.testing.features.Feature; import junit.framework.TestSuite; import speiger.src.collections.PACKAGE.maps.interfaces.MAP; @@ -12,6 +17,7 @@ import speiger.src.testers.PACKAGE.builder.SET_TEST_BUILDER; import speiger.src.testers.PACKAGE.generators.TEST_ORDERED_SET_GENERATOR; import speiger.src.testers.PACKAGE.generators.TEST_SET_GENERATOR; 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.tests.maps.FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapMoveTester; import speiger.src.testers.PACKAGE.tests.maps.FILE_KEY_TYPE2FILE_VALUE_TYPEOrderedMapNavigationTester; #if !TYPE_OBJECT @@ -20,6 +26,7 @@ import speiger.src.testers.objects.generators.TestObjectSetGenerator; import speiger.src.testers.objects.builder.ObjectOrderedSetTestSuiteBuilder; import speiger.src.testers.objects.generators.TestObjectOrderedSetGenerator; #endif +import speiger.src.testers.utils.SpecialFeature; @SuppressWarnings("javadoc") public class ORDERED_MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE @@ -45,6 +52,15 @@ public class ORDERED_MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MAP_TEST_BU return super.createTestSuite(); } + @Override + protected List createDerivedSuites(FeatureSpecificTestSuiteBuilder, Map.Entry>> parentBuilder) { + List derivedSuites = super.createDerivedSuites(parentBuilder); + if (!parentBuilder.getFeatures().contains(SpecialFeature.DESCENDING)) { + derivedSuites.add(createDescendingSuite(parentBuilder)); + } + return derivedSuites; + } + protected ObjectSetTestSuiteBuilder createDerivedEntrySetSuite(TestObjectSetGenerator entrySetGenerator) { return ObjectOrderedSetTestSuiteBuilder.using((TestObjectOrderedSetGenerator)entrySetGenerator); } @@ -52,4 +68,17 @@ public class ORDERED_MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MAP_TEST_BU protected SET_TEST_BUILDER KEY_GENERIC_TYPE createDerivedKeySetSuite(TEST_SET_GENERATOR KEY_GENERIC_TYPE generator) { return ORDERED_SET_TEST_BUILDER.using((TEST_ORDERED_SET_GENERATOR KEY_GENERIC_TYPE)generator); } + + private TestSuite createDescendingSuite(FeatureSpecificTestSuiteBuilder, Map.Entry>> parentBuilder) { + TEST_ORDERED_MAP_GENERATOR KEY_VALUE_GENERIC_TYPE delegate = (TEST_ORDERED_MAP_GENERATOR KEY_VALUE_GENERIC_TYPE) parentBuilder.getSubjectGenerator().getInnerGenerator(); + + List> features = new ArrayList<>(); + features.add(SpecialFeature.DESCENDING); + features.addAll(parentBuilder.getFeatures()); + features.remove(SpecialFeature.COPYING); + features.remove(SpecialFeature.CHILDREN_COPY); + return ORDERED_MAP_TEST_BUILDER.using(new DERIVED_MAP_GENERATORS.DescendingTestOrderedMapGeneratorKV_BRACES(delegate)) + .named(parentBuilder.getName() + " reversed").withFeatures(features) + .suppressing(parentBuilder.getSuppressedTests()).createTestSuite(); + } } diff --git a/src/builder/resources/speiger/assets/testers/templates/impl/maps/DerivedMapGenerators.template b/src/builder/resources/speiger/assets/testers/templates/impl/maps/DerivedMapGenerators.template index a8d141a..bee25b4 100644 --- a/src/builder/resources/speiger/assets/testers/templates/impl/maps/DerivedMapGenerators.template +++ b/src/builder/resources/speiger/assets/testers/templates/impl/maps/DerivedMapGenerators.template @@ -20,6 +20,7 @@ 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.Entry; import speiger.src.collections.PACKAGE.maps.interfaces.NAVIGABLE_MAP; +import speiger.src.collections.PACKAGE.maps.interfaces.ORDERED_MAP; import speiger.src.collections.PACKAGE.maps.interfaces.SORTED_MAP; #if !TYPE_OBJECT import speiger.src.collections.PACKAGE.sets.SET; @@ -206,6 +207,34 @@ public class DERIVED_MAP_GENERATORS { } } + public static class DescendingTestOrderedMapGenerator KEY_VALUE_GENERIC_TYPE extends MapGenerator KEY_VALUE_GENERIC_TYPE implements TEST_ORDERED_MAP_GENERATOR KEY_VALUE_GENERIC_TYPE { + TEST_ORDERED_MAP_GENERATOR KEY_VALUE_GENERIC_TYPE parent; + + public DescendingTestOrderedMapGenerator(TEST_ORDERED_MAP_GENERATOR KEY_VALUE_GENERIC_TYPE parent) { + super(parent); + this.parent = parent; + } + + @Override + public ORDERED_MAP KEY_VALUE_GENERIC_TYPE create(Entry KEY_VALUE_GENERIC_TYPE... elements) { + return ((ORDERED_MAP KEY_VALUE_GENERIC_TYPE)parent.create(elements)).reversed(); + } + + @Override + public Iterable> order(List> insertionOrder) { + ObjectList> values = ObjectIterators.pour(ObjectIterators.wrap(parent.order(insertionOrder).iterator())); + ObjectLists.reverse(values); + return values; + } + + @Override + public ObjectIterable order(ObjectList insertionOrder) { + ObjectList values = parent.order(insertionOrder).pourAsList(); + ObjectLists.reverse(values); + return values; + } + } + public static class MapGenerator KEY_VALUE_GENERIC_TYPE implements TEST_MAP_GENERATOR KEY_VALUE_GENERIC_TYPE { TEST_MAP_GENERATOR KEY_VALUE_GENERIC_TYPE parent; diff --git a/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetMoveTester.template b/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetMoveTester.template index 55f70f6..48d351d 100644 --- a/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetMoveTester.template +++ b/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetMoveTester.template @@ -45,10 +45,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testaddMoveToFirstMissing() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); assertEquals(true, orderedSet.addAndMoveToFirst(e4())); - assertNotEquals(a, orderedSet.FIRST_KEY()); - assertEquals(e4(), orderedSet.FIRST_KEY()); + assertNotEquals(a, orderedSet.GET_FIRST_KEY()); + assertEquals(e4(), orderedSet.GET_FIRST_KEY()); } #ignore @@ -57,10 +57,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testaddMoveToFirstPreset() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); assertEquals(false, orderedSet.addAndMoveToFirst(c)); - assertNotEquals(a, orderedSet.FIRST_KEY()); - assertEquals(c, orderedSet.FIRST_KEY()); + assertNotEquals(a, orderedSet.GET_FIRST_KEY()); + assertEquals(c, orderedSet.GET_FIRST_KEY()); } #ignore @@ -69,10 +69,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testaddMoveToLastMissing() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); assertEquals(true, orderedSet.addAndMoveToLast(e4())); - assertNotEquals(c, orderedSet.LAST_KEY()); - assertEquals(e4(), orderedSet.LAST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); + assertEquals(e4(), orderedSet.GET_LAST_KEY()); } #ignore @@ -81,10 +81,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testaddMoveToLastPreset() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); assertEquals(false, orderedSet.addAndMoveToLast(a)); - assertNotEquals(c, orderedSet.LAST_KEY()); - assertEquals(a, orderedSet.LAST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); + assertEquals(a, orderedSet.GET_LAST_KEY()); } #ignore @@ -93,9 +93,9 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveToFirstMissing() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); assertEquals(false, orderedSet.moveToFirst(e4())); - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); } #ignore @@ -104,10 +104,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveToFirstPreset() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); assertEquals(true, orderedSet.moveToFirst(c)); - assertNotEquals(a, orderedSet.FIRST_KEY()); - assertEquals(c, orderedSet.FIRST_KEY()); + assertNotEquals(a, orderedSet.GET_FIRST_KEY()); + assertEquals(c, orderedSet.GET_FIRST_KEY()); } #ignore @@ -116,9 +116,9 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveToLastMissing() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); assertEquals(false, orderedSet.moveToLast(e4())); - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); } #ignore @@ -127,10 +127,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveToLastPreset() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); assertEquals(true, orderedSet.moveToLast(a)); - assertNotEquals(c, orderedSet.LAST_KEY()); - assertEquals(a, orderedSet.LAST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); + assertEquals(a, orderedSet.GET_LAST_KEY()); } #ignore @@ -139,10 +139,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveCenterToLast() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); assertTrue(orderedSet.moveToLast(e1())); - assertNotEquals(c, orderedSet.LAST_KEY()); - assertEquals(e1(), orderedSet.LAST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); + assertEquals(e1(), orderedSet.GET_LAST_KEY()); } #ignore @@ -151,10 +151,10 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveCenterToFirst() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); assertTrue(orderedSet.moveToFirst(e1())); - assertNotEquals(c, orderedSet.FIRST_KEY()); - assertEquals(e1(), orderedSet.FIRST_KEY()); + assertNotEquals(c, orderedSet.GET_FIRST_KEY()); + assertEquals(e1(), orderedSet.GET_FIRST_KEY()); } #ignore @@ -163,13 +163,13 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveForthAndBack() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); assertTrue(orderedSet.moveToLast(e0())); - assertNotEquals(c, orderedSet.LAST_KEY()); - assertEquals(a, orderedSet.LAST_KEY()); - assertNotEquals(a, orderedSet.FIRST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); + assertEquals(a, orderedSet.GET_LAST_KEY()); + assertNotEquals(a, orderedSet.GET_FIRST_KEY()); assertTrue(orderedSet.moveToFirst(e0())); - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); } #ignore @@ -178,13 +178,13 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testMoveBackAndForth() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); assertTrue(orderedSet.moveToFirst(e2())); - assertNotEquals(a, orderedSet.FIRST_KEY()); - assertEquals(c, orderedSet.FIRST_KEY()); - assertNotEquals(c, orderedSet.LAST_KEY()); + assertNotEquals(a, orderedSet.GET_FIRST_KEY()); + assertEquals(c, orderedSet.GET_FIRST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); assertTrue(orderedSet.moveToLast(e2())); - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); } #ignore @@ -193,13 +193,13 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testAddForthAndBack() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); assertFalse(orderedSet.addAndMoveToLast(e0())); - assertNotEquals(c, orderedSet.LAST_KEY()); - assertEquals(a, orderedSet.LAST_KEY()); - assertNotEquals(a, orderedSet.FIRST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); + assertEquals(a, orderedSet.GET_LAST_KEY()); + assertNotEquals(a, orderedSet.GET_FIRST_KEY()); assertFalse(orderedSet.addAndMoveToFirst(e0())); - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); } #ignore @@ -208,13 +208,13 @@ public class FILE_KEY_TYPEOrderedSetMoveTester KEY_GENERIC_TYPE extends ABSTRACT #endignore public void testAddBackAndForth() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); assertFalse(orderedSet.addAndMoveToFirst(e2())); - assertNotEquals(a, orderedSet.FIRST_KEY()); - assertEquals(c, orderedSet.FIRST_KEY()); - assertNotEquals(c, orderedSet.LAST_KEY()); + assertNotEquals(a, orderedSet.GET_FIRST_KEY()); + assertEquals(c, orderedSet.GET_FIRST_KEY()); + assertNotEquals(c, orderedSet.GET_LAST_KEY()); assertFalse(orderedSet.addAndMoveToLast(e2())); - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); } #ignore diff --git a/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetNavigationTester.template b/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetNavigationTester.template index 5b38428..70657dc 100644 --- a/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetNavigationTester.template +++ b/src/builder/resources/speiger/assets/testers/templates/tests/set/OrderedSetNavigationTester.template @@ -68,7 +68,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB int polled = 0; int expectedPolls = orderedSet.size(); while(polled < expectedPolls) { - orderedSet.POLL_FIRST_KEY(); + orderedSet.REMOVE_FIRST_KEY(); polled++; } assertTrue("Map should be empty", orderedSet.isEmpty()); @@ -82,7 +82,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB int polled = 0; int expectedPolls = orderedSet.size(); while(polled < expectedPolls) { - orderedSet.POLL_LAST_KEY(); + orderedSet.REMOVE_LAST_KEY(); polled++; } assertTrue("Map should be empty", orderedSet.isEmpty()); @@ -94,8 +94,8 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testEmptySetPollFirst() { try { - orderedSet.POLL_FIRST_KEY(); - fail("OrderedSet.POLL_FIRST_KEY should throw NoSuchElementException"); + orderedSet.REMOVE_FIRST_KEY(); + fail("OrderedSet.REMOVE_FIRST_KEY should throw NoSuchElementException"); } catch (NoSuchElementException e) { } expectUnchanged(); @@ -107,8 +107,8 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testEmptySetPollLast() { try { - orderedSet.POLL_LAST_KEY(); - fail("OrderedSet.POLL_LAST_KEY should throw NoSuchElementException"); + orderedSet.REMOVE_LAST_KEY(); + fail("OrderedSet.REMOVE_LAST_KEY should throw NoSuchElementException"); } catch (NoSuchElementException e) { } expectUnchanged(); @@ -119,8 +119,8 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testUnsupportedSetPollFirst() { try { - orderedSet.POLL_FIRST_KEY(); - fail("OrderedSet.POLL_FIRST_KEY should throw UnsupportedOperationException"); + orderedSet.REMOVE_FIRST_KEY(); + fail("OrderedSet.REMOVE_FIRST_KEY should throw UnsupportedOperationException"); } catch (UnsupportedOperationException e) { } expectUnchanged(); @@ -131,8 +131,8 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testUnsupportedSetPollLast() { try { - orderedSet.POLL_LAST_KEY(); - fail("OrderedSet.POLL_LAST_KEY should throw UnsupportedOperationException"); + orderedSet.REMOVE_LAST_KEY(); + fail("OrderedSet.REMOVE_LAST_KEY should throw UnsupportedOperationException"); } catch (UnsupportedOperationException e) { } expectUnchanged(); @@ -143,7 +143,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB @CollectionSize.Require(ONE) #endignore public void testSingletonSetPollFirst() { - assertEquals(a, orderedSet.POLL_FIRST_KEY()); + assertEquals(a, orderedSet.REMOVE_FIRST_KEY()); assertTrue(orderedSet.isEmpty()); } @@ -152,7 +152,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB @CollectionSize.Require(ONE) #endignore public void testSingletonSetPollLast() { - assertEquals(a, orderedSet.POLL_LAST_KEY()); + assertEquals(a, orderedSet.REMOVE_LAST_KEY()); assertTrue(orderedSet.isEmpty()); } @@ -161,7 +161,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB @CollectionSize.Require(SEVERAL) #endignore public void testPollFirst() { - assertEquals(a, orderedSet.POLL_FIRST_KEY()); + assertEquals(a, orderedSet.REMOVE_FIRST_KEY()); assertEquals(values.subList(1, values.size()), HELPERS.copyToList(orderedSet)); } @@ -170,7 +170,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB @CollectionSize.Require(SEVERAL) #endignore public void testPollLast() { - assertEquals(c, orderedSet.POLL_LAST_KEY()); + assertEquals(c, orderedSet.REMOVE_LAST_KEY()); assertEquals(values.subList(0, values.size()-1), HELPERS.copyToList(orderedSet)); } @@ -179,7 +179,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testPollFirstUnsupported() { try { - orderedSet.POLL_FIRST_KEY(); + orderedSet.REMOVE_FIRST_KEY(); fail(); } catch (UnsupportedOperationException e) { } @@ -190,7 +190,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testPollLastUnsupported() { try { - orderedSet.POLL_LAST_KEY(); + orderedSet.REMOVE_LAST_KEY(); fail(); } catch (UnsupportedOperationException e) { } @@ -201,7 +201,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testEmptySetFirst() { try { - orderedSet.FIRST_KEY(); + orderedSet.GET_FIRST_KEY(); fail(); } catch (NoSuchElementException e) { } @@ -212,7 +212,7 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB #endignore public void testEmptySetLast() { try { - orderedSet.LAST_KEY(); + orderedSet.GET_LAST_KEY(); fail(); } catch (NoSuchElementException e) { } @@ -222,27 +222,27 @@ public class FILE_KEY_TYPEOrderedSetNavigationTester KEY_GENERIC_TYPE extends AB @CollectionSize.Require(ONE) #endignore public void testSingletonSetFirst() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); } #ignore @CollectionSize.Require(ONE) #endignore public void testSingletonSetLast() { - assertEquals(a, orderedSet.LAST_KEY()); + assertEquals(a, orderedSet.GET_LAST_KEY()); } #ignore @CollectionSize.Require(SEVERAL) #endignore public void testFirst() { - assertEquals(a, orderedSet.FIRST_KEY()); + assertEquals(a, orderedSet.GET_FIRST_KEY()); } #ignore @CollectionSize.Require(SEVERAL) #endignore public void testLast() { - assertEquals(c, orderedSet.LAST_KEY()); + assertEquals(c, orderedSet.GET_LAST_KEY()); } } \ No newline at end of file diff --git a/src/test/java/speiger/src/collections/ints/base/BaseIntOrderedSetTest.java b/src/test/java/speiger/src/collections/ints/base/BaseIntOrderedSetTest.java index d20947a..1aa9f12 100644 --- a/src/test/java/speiger/src/collections/ints/base/BaseIntOrderedSetTest.java +++ b/src/test/java/speiger/src/collections/ints/base/BaseIntOrderedSetTest.java @@ -40,8 +40,8 @@ public abstract class BaseIntOrderedSetTest extends BaseIntCollectionTest public void peekTest() { if(getValidOrderedSetTests().contains(OrderedSetTest.PEEK)) { IntOrderedSet set = create(TEST_ARRAY); - Assert.assertEquals(set.firstInt(), 0); - Assert.assertEquals(set.lastInt(), 99); + Assert.assertEquals(set.getFirstInt(), 0); + Assert.assertEquals(set.getLastInt(), 99); } } @@ -51,12 +51,12 @@ public abstract class BaseIntOrderedSetTest extends BaseIntCollectionTest IntOrderedSet set = create(TEST_ARRAY); for(int i = 0;i<100;i++) { - Assert.assertEquals(i, set.pollFirstInt()); + Assert.assertEquals(i, set.removeFirstInt()); } set = create(TEST_ARRAY); for(int i = 99;i>=0;i--) { - Assert.assertEquals(i, set.pollLastInt()); + Assert.assertEquals(i, set.removeLastInt()); } } } diff --git a/src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java b/src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java index 5f3290f..b1e5546 100644 --- a/src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java +++ b/src/test/java/speiger/src/collections/ints/base/BaseIntPriorityQueueTest.java @@ -113,7 +113,6 @@ public abstract class BaseIntPriorityQueueTest extends BaseIntIterableTest } @Test - @SuppressWarnings("deprecation") public void testToArray() { if(getValidPriorityQueueTests().contains(PriorityQueueTest.TO_ARRAY)) { IntPriorityQueue queue = create(EMPTY_ARRAY);