-#else
/**
* This is a basically a {@link java.util.ListIterator} without the index functions.
* Allowing to have a simple Bidirectional Iterator without having to keep track of the Iteration index.
* @Type(T)
*/
public interface BI_ITERATOR KEY_GENERIC_TYPE extends ITERATOR KEY_GENERIC_TYPE
-#endif
{
/**
* Returns true if the Iterator has a Previous element
@@ -29,11 +21,11 @@ public interface BI_ITERATOR KEY_GENERIC_TYPE extends ITERATOR KEY_GENERIC_TYPE
public KEY_TYPE PREVIOUS();
#if !TYPE_OBJECT
- /** {@inheritDoc}
+ /**
* This default implementation delegates to the corresponding type-specific function.
* @deprecated Please use the corresponding type-specific function instead.
+ * @return the Previous element of the iterator.+
*/
- @Override
@Deprecated
public default CLASS_TYPE previous() {
return KEY_TO_OBJ(PREVIOUS());
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/AbstractList.template b/src/builder/resources/speiger/assets/collections/templates/lists/AbstractList.template
index 54a1143..029a8c7 100644
--- a/src/builder/resources/speiger/assets/collections/templates/lists/AbstractList.template
+++ b/src/builder/resources/speiger/assets/collections/templates/lists/AbstractList.template
@@ -11,11 +11,15 @@ import java.util.RandomAccess;
import speiger.src.collections.PACKAGE.collections.ABSTRACT_COLLECTION;
import speiger.src.collections.PACKAGE.collections.COLLECTION;
import speiger.src.collections.PACKAGE.collections.ITERATOR;
+#if SPLIT_ITERATOR_FEATURE
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
+#endif
#if INT_LIST_MODULE && !TYPE_INT
import speiger.src.collections.ints.lists.IntList;
#endif
+#if SPLIT_ITERATOR_FEATURE
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
+#endif
import speiger.src.collections.utils.SanityChecks;
/**
@@ -532,9 +536,10 @@ public abstract class ABSTRACT_LIST KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION
public int size() {
return size;
}
-
+#if SPLIT_ITERATOR_FEATURE
@Override
public SPLIT_ITERATOR KEY_GENERIC_TYPE spliterator() { return SPLIT_ITERATORS.createSplititerator(this, 16464); }
+#endif
@Override
public LIST_ITERATOR KEY_GENERIC_TYPE listIterator(int index) {
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/LinkedList.template b/src/builder/resources/speiger/assets/collections/templates/lists/LinkedList.template
index b8d336b..722e8ee 100644
--- a/src/builder/resources/speiger/assets/collections/templates/lists/LinkedList.template
+++ b/src/builder/resources/speiger/assets/collections/templates/lists/LinkedList.template
@@ -13,11 +13,13 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.Objects;
import java.util.NoSuchElementException;
+#if SPLIT_ITERATOR_FEATURE
import java.util.Spliterator;
#if PRIMITIVES
import java.util.Spliterator.JAVA_SPLIT_ITERATOR;
#endif
import java.util.function.Consumer;
+#endif
import java.util.function.Predicate;
#if TYPE_OBJECT
import java.util.function.IntFunction;
@@ -60,12 +62,14 @@ import speiger.src.collections.objects.utils.ObjectArrays;
#if TYPE_OBJECT
import speiger.src.collections.utils.Stack;
#endif
+#if SPLIT_ITERATOR_FEATURE
#if PRIMITIVES
import java.util.stream.JAVA_STREAM;
import java.util.stream.StreamSupport;
#endif
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
+#endif
import speiger.src.collections.utils.SanityChecks;
/**
@@ -415,7 +419,8 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
if(index == 0) return new ListIter(first, index);
return new ListIter(getNode(index), index);
}
-
+
+#if SPLIT_ITERATOR_FEATURE
#if PRIMITIVES
/**
* Returns a Java-Type-Specific Stream to reduce boxing/unboxing.
@@ -436,6 +441,7 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
@Override
public SPLIT_ITERATOR KEY_GENERIC_TYPE spliterator() { return new TypeSplitIteratorBRACES(this, first, 0); }
+#endif
@Override
public void forEach(CONSUMER KEY_SUPER_GENERIC_TYPE action) {
Objects.requireNonNull(action);
@@ -1253,6 +1259,7 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
}
}
+#if SPLIT_ITERATOR_FEATURE
private static class TypeSplitIterator KEY_GENERIC_TYPE implements SPLIT_ITERATOR KEY_GENERIC_TYPE
{
static final int BATCH_UNIT = 1 << 10;
@@ -1397,4 +1404,5 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
}
}
#endif
+#endif
}
\ No newline at end of file
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 3443086..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,7 +15,10 @@ 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
import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER;
#if !TYPE_OBJECT
import speiger.src.collections.PACKAGE.functions.COMPARATOR;
@@ -27,7 +30,9 @@ import speiger.src.collections.PACKAGE.utils.LISTS;
#if INT_LIST_MODULE && !TYPE_INT
import speiger.src.collections.ints.lists.IntList;
#endif
+#if SPLIT_ITERATOR_FEATURE
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
+#endif
#if TYPE_BYTE || TYPE_SHORT || TYPE_CHAR || TYPE_FLOAT
import speiger.src.collections.utils.SanityChecks;
#endif
@@ -36,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
/**
@@ -101,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.
@@ -504,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.
@@ -554,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}
@@ -564,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}
@@ -594,10 +664,12 @@ public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List
}
#endif
#endif
+#if SPLIT_ITERATOR_FEATURE
/**
* A Type Specific Type Splititerator to reduce boxing/unboxing
* @return type specific splititerator
*/
@Override
default SPLIT_ITERATOR KEY_GENERIC_TYPE spliterator() { return SPLIT_ITERATORS.createSplititerator(this, 0); }
+#endif
}
\ No newline at end of file
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..91fb553 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
@@ -42,7 +51,7 @@ import speiger.src.collections.utils.SanityChecks;
*/
public abstract class ABSTRACT_MAP KEY_VALUE_GENERIC_TYPE extends AbstractMap implements MAP KEY_VALUE_GENERIC_TYPE
{
- protected VALUE_TYPE defaultReturnValue = EMPTY_VALUE;
+ protected VALUE_TYPE defaultReturnValue = INVALID_VALUE;
@Override
public VALUE_TYPE getDefaultReturnValue() {
@@ -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..3f3f2bc 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 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 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 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() {
@@ -1378,16 +1490,20 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
}
private class MapIterator {
+ boolean forward;
int previous = -1;
int next = -1;
int current = -1;
int index = 0;
- MapIterator() {
- next = firstIndex;
+ MapIterator(boolean start) {
+ this.forward = start;
+ if(start) next = firstIndex;
+ else previous = lastIndex;
}
MapIterator(KEY_TYPE from) {
+ this.forward = true;
if(strategy.equals(from, EMPTY_KEY_VALUE)) {
if(containsNull) {
next = (int) links[nullIndex];
@@ -1415,11 +1531,11 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
}
public boolean hasNext() {
- return next != -1;
+ return (forward ? next : previous) != -1;
}
public boolean hasPrevious() {
- return previous != -1;
+ return (forward ? previous : next) != -1;
}
public int nextIndex() {
@@ -1479,20 +1595,30 @@ public class LINKED_CUSTOM_HASH_MAP KEY_VALUE_GENERIC_TYPE extends CUSTOM_HASH_M
public int previousEntry() {
if(!hasPrevious()) throw new NoSuchElementException();
- current = previous;
- previous = (int)(links[current] >> 32);
- next = current;
+ if(forward) moveBackwards();
+ else moveForwards();
if(index >= 0) index--;
return current;
}
public int nextEntry() {
if(!hasNext()) throw new NoSuchElementException();
+ if(forward) moveForwards();
+ else moveBackwards();
+ if(index >= 0) index++;
+ return current;
+ }
+
+ private void moveBackwards() {
+ current = previous;
+ previous = (int)(links[current] >> 32);
+ next = current;
+ }
+
+ private void moveForwards() {
current = next;
next = (int)(links[current]);
previous = current;
- if(index >= 0) index++;
- return current;
}
private void ensureIndexKnown() {
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..3ac8a24 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 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 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 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() {
@@ -1377,13 +1490,16 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
}
private class MapIterator {
+ boolean forward;
int previous = -1;
int next = -1;
int current = -1;
int index = 0;
- MapIterator() {
- next = firstIndex;
+ MapIterator(boolean start) {
+ this.forward = start;
+ if(start) next = firstIndex;
+ else previous = lastIndex;
}
MapIterator(KEY_TYPE from) {
@@ -1414,11 +1530,11 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
}
public boolean hasNext() {
- return next != -1;
+ return (forward ? next : previous) != -1;
}
public boolean hasPrevious() {
- return previous != -1;
+ return (forward ? previous : next) != -1;
}
public int nextIndex() {
@@ -1478,20 +1594,30 @@ public class LINKED_HASH_MAP KEY_VALUE_GENERIC_TYPE extends HASH_MAP KEY_VALUE_G
public int previousEntry() {
if(!hasPrevious()) throw new NoSuchElementException();
- current = previous;
- previous = (int)(links[current] >> 32);
- next = current;
+ if(forward) moveBackwards();
+ else moveForwards();
if(index >= 0) index--;
return current;
}
public int nextEntry() {
if(!hasNext()) throw new NoSuchElementException();
+ if(forward) moveForwards();
+ else moveBackwards();
+ if(index >= 0) index++;
+ return current;
+ }
+
+ private void moveBackwards() {
+ current = previous;
+ previous = (int)(links[current] >> 32);
+ next = current;
+ }
+
+ private void moveForwards() {
current = next;
next = (int)(links[current]);
previous = current;
- if(index >= 0) index++;
- return current;
}
private void ensureIndexKnown() {
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..3434913 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 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 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 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() {
@@ -1322,13 +1356,16 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
}
private class MapIterator {
+ boolean forward;
int previous = -1;
int next = -1;
int current = -1;
int index = 0;
- MapIterator() {
- next = firstIndex;
+ MapIterator(boolean start) {
+ this.forward = start;
+ if(start) next = firstIndex;
+ else previous = lastIndex;
}
MapIterator(KEY_TYPE from) {
@@ -1359,11 +1396,11 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
}
public boolean hasNext() {
- return next != -1;
+ return (forward ? next : previous) != -1;
}
public boolean hasPrevious() {
- return previous != -1;
+ return (forward ? previous : next) != -1;
}
public int nextIndex() {
@@ -1380,20 +1417,30 @@ public class IMMUTABLE_HASH_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_
public int previousEntry() {
if(!hasPrevious()) throw new NoSuchElementException();
- current = previous;
- previous = (int)(links[current] >> 32);
- next = current;
+ if(forward) moveBackwards();
+ else moveForwards();
if(index >= 0) index--;
return current;
}
public int nextEntry() {
if(!hasNext()) throw new NoSuchElementException();
+ if(forward) moveForwards();
+ else moveBackwards();
+ if(index >= 0) index++;
+ return current;
+ }
+
+ private void moveBackwards() {
+ current = previous;
+ previous = (int)(links[current] >> 32);
+ next = current;
+ }
+
+ private void moveForwards() {
current = next;
next = (int)(links[current]);
previous = current;
- if(index >= 0) index++;
- return current;
}
private void ensureIndexKnown() {
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..6a678b4 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 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 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 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()];
@@ -1431,23 +1491,37 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
}
private class MapIterator {
+ boolean forward;
int index;
int lastReturned = -1;
-
+
+ MapIterator(boolean start) {
+ this.forward = start;
+ this.index = start ? 0 : size;
+ }
+
+ MapIterator(KEY_TYPE element) {
+ this.forward = true;
+ index = findIndex(element);
+ if(index == -1) throw new NoSuchElementException();
+ }
+
public boolean hasNext() {
- return index < size;
+ return forward ? index < size : index > 0;
}
public boolean hasPrevious() {
- return index > 0;
+ return forward ? index > 0 : index < size;
}
public int nextIndex() {
- return index;
+ if(forward) return index;
+ return size - index;
}
public int previousIndex() {
- return index-1;
+ if(forward) return index-1;
+ return (size - index)-1;
}
public void remove() {
@@ -1460,26 +1534,42 @@ public class ARRAY_MAP KEY_VALUE_GENERIC_TYPE extends ABSTRACT_MAP KEY_VALUE_GEN
public int previousEntry() {
if(!hasPrevious()) throw new NoSuchElementException();
- index--;
- return (lastReturned = index);
- }
-
- public int nextEntry() {
- if(!hasNext()) throw new NoSuchElementException();
+ if(forward) {
+ index--;
+ return (lastReturned = index);
+ }
lastReturned = index;
return index++;
}
+ public int nextEntry() {
+ if(!hasNext()) throw new NoSuchElementException();
+ if(forward) {
+ lastReturned = index;
+ return index++;
+ }
+ index--;
+ return (lastReturned = index);
+ }
+
public int skip(int amount) {
if(amount < 0) throw new IllegalStateException("Negative Numbers are not allowed");
+ return forward ? moveForward(amount) : moveBackwards(amount);
+ }
+
+ public int back(int amount) {
+ if(amount < 0) throw new IllegalStateException("Negative Numbers are not allowed");
+ return forward ? moveBackwards(amount) : moveForward(amount);
+ }
+
+ private int moveForward(int amount) {
int steps = Math.min(amount, size() - index);
index += steps;
if(steps > 0) lastReturned = Math.min(index-1, size()-1);
return steps;
}
- public int back(int amount) {
- if(amount < 0) throw new IllegalStateException("Negative Numbers are not allowed");
+ private int moveBackwards(int amount) {
int steps = Math.min(amount, index);
index -= steps;
if(steps > 0) lastReturned = Math.min(index, size()-1);
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..35a913a 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 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 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 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() {
@@ -815,16 +892,20 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
}
private class MapIterator {
+ boolean forward;
int previous = -1;
int next = -1;
int current = -1;
int index = 0;
- MapIterator() {
- next = firstIndex;
+ MapIterator(boolean start) {
+ this.forward = start;
+ if(start) next = firstIndex;
+ else previous = lastIndex;
}
MapIterator(T from) {
+ this.forward = true;
previous = from.ordinal() - 1;
index = from.ordinal();
next = from.ordinal();
@@ -832,11 +913,11 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
}
public boolean hasNext() {
- return next != -1;
+ return (forward ? next : previous) != -1;
}
public boolean hasPrevious() {
- return previous != -1;
+ return (forward ? previous : next) != -1;
}
public int nextIndex() {
@@ -871,20 +952,30 @@ public class LINKED_ENUM_MAP KEY_ENUM_VALUE_GENERIC_TYPE extends ENUM_MAP KEY_VA
public int previousEntry() {
if(!hasPrevious()) throw new NoSuchElementException();
- current = previous;
- previous = (int)(links[current] >> 32);
- next = current;
+ if(forward) moveBackwards();
+ else moveForwards();
if(index >= 0) index--;
return current;
}
public int nextEntry() {
if(!hasNext()) throw new NoSuchElementException();
+ if(forward) moveForwards();
+ else moveBackwards();
+ if(index >= 0) index++;
+ return current;
+ }
+
+ private void moveBackwards() {
+ current = previous;
+ previous = (int)(links[current] >> 32);
+ next = current;
+ }
+
+ private void moveForwards() {
current = next;
next = (int)(links[current]);
previous = current;
- if(index >= 0) index++;
- return current;
}
private void ensureIndexKnown() {
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..bcffc7f 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
@@ -511,13 +511,18 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
@Override
public BI_ITERATOR KEY_GENERIC_TYPE iterator() {
- return new SetIterator(0);
+ return new SetIterator(true, 0);
+ }
+
+ @Override
+ public BI_ITERATOR KEY_GENERIC_TYPE reverseIterator() {
+ return new SetIterator(false, size);
}
@Override
public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) {
int index = findIndex(fromElement);
- if(index != -1) return new SetIterator(index);
+ if(index != -1) return new SetIterator(true, index);
throw new NoSuchElementException();
}
@@ -570,45 +575,57 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
}
private class SetIterator implements LIST_ITERATOR KEY_GENERIC_TYPE {
+ boolean forward;
int index;
int lastReturned = -1;
- public SetIterator(int index) {
+ public SetIterator(boolean forward, int index) {
+ this.forward = forward;
this.index = index;
}
@Override
public boolean hasNext() {
- return index < size();
+ return forward ? index < size() : index > 0;
}
@Override
public KEY_TYPE NEXT() {
if(!hasNext()) throw new NoSuchElementException();
- lastReturned = index;
- return data[index++];
+ if(forward) {
+ lastReturned = index;
+ return data[index++];
+ }
+ index--;
+ return data[(lastReturned = index)];
}
@Override
public boolean hasPrevious() {
- return index > 0;
+ return forward ? index > 0 : index < size();
}
@Override
public KEY_TYPE PREVIOUS() {
if(!hasPrevious()) throw new NoSuchElementException();
- --index;
- return data[(lastReturned = index)];
+ if(forward) {
+ index--;
+ return data[(lastReturned = index)];
+ }
+ lastReturned = index;
+ return data[index++];
}
@Override
public int nextIndex() {
- return index;
+ if(forward) return index;
+ return size - index;
}
@Override
public int previousIndex() {
- return index-1;
+ if(forward) return index-1;
+ return (size - index)-1;
}
@Override
@@ -637,15 +654,23 @@ public class ARRAY_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE im
@Override
public int skip(int amount) {
if(amount < 0) throw new IllegalStateException("Negative Numbers are not allowed");
+ return forward ? moveForward(amount) : moveBackwards(amount);
+ }
+
+ @Override
+ public int back(int amount) {
+ if(amount < 0) throw new IllegalStateException("Negative Numbers are not allowed");
+ return forward ? moveBackwards(amount) : moveForward(amount);
+ }
+
+ private int moveForward(int amount) {
int steps = Math.min(amount, size() - index);
index += steps;
if(steps > 0) lastReturned = Math.min(index-1, size()-1);
return steps;
}
- @Override
- public int back(int amount) {
- if(amount < 0) throw new IllegalStateException("Negative Numbers are not allowed");
+ private int moveBackwards(int amount) {
int steps = Math.min(amount, index);
index -= steps;
if(steps > 0) lastReturned = Math.min(index, size()-1);
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..73f00a8 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 SetIterator(false);
}
@Override
@@ -521,16 +526,20 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
}
private class SetIterator implements LIST_ITERATOR KEY_GENERIC_TYPE {
+ boolean forward;
int previous = -1;
int next = -1;
int current = -1;
- int index = 0;
+ int index = -1;
- SetIterator() {
- next = firstIndex;
+ SetIterator(boolean start) {
+ this.forward = start;
+ if(start) next = firstIndex;
+ else previous = lastIndex;
}
SetIterator(KEY_TYPE from) {
+ this.forward = true;
if(KEY_EQUALS_NULL(from)) {
if(containsNull) {
next = (int) links[nullIndex];
@@ -559,48 +568,60 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
@Override
public int skip(int amount) {
- int result = 0;
- while(next != -1 && result != amount) {
- current = previous = next;
- next = (int)(links[current]);
- result++;
- }
+ int result = forward ? moveForward(amount) : moveBackwards(amount);
if(index >= 0) index+=result;
return result;
}
@Override
public int back(int amount) {
+ int result = forward ? moveBackwards(amount) : moveForward(amount);
+ if(index >= 0) index-=result;
+ return result;
+ }
+
+ private int moveForward(int amount) {
+ int result = 0;
+ while(next != -1 && result != amount) {
+ current = previous = next;
+ next = (int)(links[current]);
+ result++;
+ }
+ return result;
+ }
+
+ private int moveBackwards(int amount) {
int result = 0;
while(previous != -1 && result != amount) {
current = next = previous;
previous = (int)(links[current] >> 32);
result++;
}
- if(index >= 0) index-=result;
return result;
}
@Override
public boolean hasNext() {
- return next != -1;
+ return (forward ? next : previous) != -1;
}
@Override
public boolean hasPrevious() {
- return previous != -1;
+ return (forward ? previous : next) != -1;
}
@Override
public int nextIndex() {
ensureIndexKnown();
- return index;
+ if(forward) return index;
+ return size - index;
}
@Override
public int previousIndex() {
ensureIndexKnown();
- return index - 1;
+ if(forward) return index-1;
+ return (size - index)-1;
}
@Override
@@ -609,8 +630,8 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
@Override
public KEY_TYPE PREVIOUS() {
if(!hasPrevious()) throw new NoSuchElementException();
- current = next = previous;
- previous = (int)(links[current] >> 32);
+ if(forward) moveBackwards();
+ else moveForwards();
if(index >= 0) index--;
return keys[current];
}
@@ -618,12 +639,22 @@ public class IMMUTABLE_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERI
@Override
public KEY_TYPE NEXT() {
if(!hasNext()) throw new NoSuchElementException();
- current = previous = next;
- next = (int)(links[current]);
+ if(forward) moveForwards();
+ else moveBackwards();
if(index >= 0) index++;
return keys[current];
}
+ private void moveBackwards() {
+ current = next = previous;
+ previous = (int)(links[current] >> 32);
+ }
+
+ private void moveForwards() {
+ current = previous = next;
+ next = (int)(links[current]);
+ }
+
private void ensureIndexKnown() {
if(index == -1) {
if(previous == -1) {
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..90876dd 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 SetIterator(false);
}
@Override
@@ -722,16 +727,20 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
}
private class SetIterator implements LIST_ITERATOR KEY_GENERIC_TYPE {
+ boolean forward;
int previous = -1;
int next = -1;
int current = -1;
- int index = 0;
+ int index = -1;
- SetIterator() {
- next = firstIndex;
+ SetIterator(boolean start) {
+ this.forward = start;
+ if(start) next = firstIndex;
+ else previous = lastIndex;
}
SetIterator(KEY_TYPE from) {
+ this.forward = true;
if(strategy.equals(from, EMPTY_KEY_VALUE)) {
if(containsNull) {
next = (int) links[nullIndex];
@@ -760,48 +769,60 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
@Override
public boolean hasNext() {
- return next != -1;
+ return (forward ? next : previous) != -1;
}
@Override
public boolean hasPrevious() {
- return previous != -1;
+ return (forward ? previous : next) != -1;
}
@Override
public int skip(int amount) {
- int result = 0;
- while(next != -1 && result != amount) {
- current = previous = next;
- next = (int)(links[current]);
- result++;
- }
+ int result = forward ? moveForward(amount) : moveBackwards(amount);
if(index >= 0) index+=result;
return result;
}
@Override
public int back(int amount) {
+ int result = forward ? moveBackwards(amount) : moveForward(amount);
+ if(index >= 0) index-=result;
+ return result;
+ }
+
+ private int moveForward(int amount) {
+ int result = 0;
+ while(next != -1 && result != amount) {
+ current = previous = next;
+ next = (int)(links[current]);
+ result++;
+ }
+ return result;
+ }
+
+ private int moveBackwards(int amount) {
int result = 0;
while(previous != -1 && result != amount) {
current = next = previous;
previous = (int)(links[current] >> 32);
result++;
}
- if(index >= 0) index-=result;
return result;
}
@Override
public int nextIndex() {
ensureIndexKnown();
- return index;
+ if(forward) return index;
+ return size - index;
}
@Override
public int previousIndex() {
ensureIndexKnown();
- return index - 1;
+ if(forward) return index-1;
+ return (size - index)-1;
}
@Override
@@ -850,8 +871,8 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
@Override
public KEY_TYPE PREVIOUS() {
if(!hasPrevious()) throw new NoSuchElementException();
- current = next = previous;
- previous = (int)(links[current] >> 32);
+ if(forward) moveBackwards();
+ else moveForwards();
if(index >= 0) index--;
return keys[current];
}
@@ -859,12 +880,22 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
@Override
public KEY_TYPE NEXT() {
if(!hasNext()) throw new NoSuchElementException();
- current = previous = next;
- next = (int)(links[current]);
+ if(forward) moveForwards();
+ else moveBackwards();
if(index >= 0) index++;
return keys[current];
}
+ private void moveBackwards() {
+ current = next = previous;
+ previous = (int)(links[current] >> 32);
+ }
+
+ private void moveForwards() {
+ current = previous = next;
+ next = (int)(links[current]);
+ }
+
private void ensureIndexKnown() {
if(index == -1) {
if(previous == -1) {
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..ff8c356 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 SetIterator(false);
}
@Override
@@ -693,16 +698,20 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
}
private class SetIterator implements LIST_ITERATOR KEY_GENERIC_TYPE {
+ boolean forward;
int previous = -1;
int next = -1;
int current = -1;
- int index = 0;
+ int index = -1;
- SetIterator() {
- next = firstIndex;
+ SetIterator(boolean start) {
+ this.forward = start;
+ if(start) next = firstIndex;
+ else previous = lastIndex;
}
SetIterator(KEY_TYPE from) {
+ this.forward = true;
if(KEY_EQUALS_NULL(from)) {
if(containsNull) {
next = (int) links[nullIndex];
@@ -731,48 +740,60 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
@Override
public int skip(int amount) {
- int result = 0;
- while(next != -1 && result != amount) {
- current = previous = next;
- next = (int)(links[current]);
- result++;
- }
+ int result = forward ? moveForward(amount) : moveBackwards(amount);
if(index >= 0) index+=result;
return result;
}
@Override
public int back(int amount) {
+ int result = forward ? moveBackwards(amount) : moveForward(amount);
+ if(index >= 0) index-=result;
+ return result;
+ }
+
+ private int moveForward(int amount) {
+ int result = 0;
+ while(next != -1 && result != amount) {
+ current = previous = next;
+ next = (int)(links[current]);
+ result++;
+ }
+ return result;
+ }
+
+ private int moveBackwards(int amount) {
int result = 0;
while(previous != -1 && result != amount) {
current = next = previous;
previous = (int)(links[current] >> 32);
result++;
}
- if(index >= 0) index-=result;
return result;
}
@Override
public boolean hasNext() {
- return next != -1;
+ return (forward ? next : previous) != -1;
}
@Override
public boolean hasPrevious() {
- return previous != -1;
+ return (forward ? previous : next) != -1;
}
@Override
public int nextIndex() {
ensureIndexKnown();
- return index;
+ if(forward) return index;
+ return size - index;
}
@Override
public int previousIndex() {
ensureIndexKnown();
- return index - 1;
+ if(forward) return index-1;
+ return (size - index)-1;
}
@Override
@@ -821,8 +842,8 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
@Override
public KEY_TYPE PREVIOUS() {
if(!hasPrevious()) throw new NoSuchElementException();
- current = next = previous;
- previous = (int)(links[current] >> 32);
+ if(forward) moveBackwards();
+ else moveForwards();
if(index >= 0) index--;
return keys[current];
}
@@ -830,12 +851,22 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
@Override
public KEY_TYPE NEXT() {
if(!hasNext()) throw new NoSuchElementException();
- current = previous = next;
- next = (int)(links[current]);
+ if(forward) moveForwards();
+ else moveBackwards();
if(index >= 0) index++;
return keys[current];
}
+ private void moveBackwards() {
+ current = next = previous;
+ previous = (int)(links[current] >> 32);
+ }
+
+ private void moveForwards() {
+ current = previous = next;
+ next = (int)(links[current]);
+ }
+
private void ensureIndexKnown() {
if(index == -1) {
if(previous == -1) {
diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/NavigableSet.template b/src/builder/resources/speiger/assets/collections/templates/sets/NavigableSet.template
index eaa07b7..c215610 100644
--- a/src/builder/resources/speiger/assets/collections/templates/sets/NavigableSet.template
+++ b/src/builder/resources/speiger/assets/collections/templates/sets/NavigableSet.template
@@ -3,11 +3,13 @@ package speiger.src.collections.PACKAGE.sets;
import java.util.NavigableSet;
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
#if SETS_FEATURE
import speiger.src.collections.PACKAGE.utils.SETS;
#endif
-import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
/**
* A Type Specific Navigable Set interface with a couple helper methods
@@ -145,6 +147,7 @@ public interface NAVIGABLE_SET KEY_GENERIC_TYPE extends NavigableSet
public default NAVIGABLE_SET KEY_GENERIC_TYPE unmodifiable() { return SETS.unmodifiable(this); }
#endif
+#if SPLIT_ITERATOR_FEATURE
/**
* A Type Specific Type Splititerator to reduce boxing/unboxing
* @return type specific splititerator
@@ -152,6 +155,7 @@ public interface NAVIGABLE_SET KEY_GENERIC_TYPE extends NavigableSet
@Override
default SPLIT_ITERATOR KEY_GENERIC_TYPE spliterator() { return SPLIT_ITERATORS.createSplititerator(this, 0); }
+#endif
#if !TYPE_OBJECT
@Override
@Deprecated
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 f98bf74..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,11 +1,18 @@
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
-import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
/**
* A Special Set Interface giving Access to some really usefull functions
@@ -15,7 +22,11 @@ import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
*
* @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.
@@ -52,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
@@ -61,6 +73,7 @@ public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE
*/
public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement);
+#if SPLIT_ITERATOR_FEATURE
/**
* A Type Specific Type Splititerator to reduce boxing/unboxing
* @return type specific splititerator
@@ -68,27 +81,81 @@ public interface ORDERED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE
@Override
default SPLIT_ITERATOR KEY_GENERIC_TYPE spliterator() { return SPLIT_ITERATORS.createSplititerator(this, 0); }
+#endif
/**
* 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/sets/Set.template b/src/builder/resources/speiger/assets/collections/templates/sets/Set.template
index a83e5c6..aa637d8 100644
--- a/src/builder/resources/speiger/assets/collections/templates/sets/Set.template
+++ b/src/builder/resources/speiger/assets/collections/templates/sets/Set.template
@@ -4,11 +4,13 @@ import java.util.Set;
import speiger.src.collections.PACKAGE.collections.COLLECTION;
import speiger.src.collections.PACKAGE.collections.ITERATOR;
+#if SPLIT_ITERATOR_FEATURE
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
+import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
+#endif
#if SETS_FEATURE
import speiger.src.collections.PACKAGE.utils.SETS;
#endif
-import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
/**
@@ -88,10 +90,12 @@ public interface SET KEY_GENERIC_TYPE extends Set, COLLECTION KEY_GE
public default SET KEY_GENERIC_TYPE unmodifiable() { return SETS.unmodifiable(this); }
#endif
+#if SPLIT_ITERATOR_FEATURE
/**
* A Type Specific Type Splititerator to reduce boxing/unboxing
* @return type specific splititerator
*/
@Override
default SPLIT_ITERATOR KEY_GENERIC_TYPE spliterator() { return SPLIT_ITERATORS.createSplititerator(this, 0); }
-}
\ No newline at end of file
+#endif
+}
diff --git a/src/builder/resources/speiger/assets/collections/templates/sets/SortedSet.template b/src/builder/resources/speiger/assets/collections/templates/sets/SortedSet.template
index 01cc4f9..cc00ca5 100644
--- a/src/builder/resources/speiger/assets/collections/templates/sets/SortedSet.template
+++ b/src/builder/resources/speiger/assets/collections/templates/sets/SortedSet.template
@@ -3,7 +3,9 @@ package speiger.src.collections.PACKAGE.sets;
import java.util.SortedSet;
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
+#if SPLIT_ITERATOR_FEATURE
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
+#endif
#if TYPE_OBJECT
import java.util.Comparator;
#else
@@ -12,7 +14,9 @@ import speiger.src.collections.PACKAGE.functions.COMPARATOR;
#if SETS_FEATURE
import speiger.src.collections.PACKAGE.utils.SETS;
#endif
+#if SPLIT_ITERATOR_FEATURE
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
+#endif
/**
* A Type Specific SortedSet implementation to reduce boxing/unboxing
@@ -67,6 +71,7 @@ public interface SORTED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE, Sorte
public default SORTED_SET KEY_GENERIC_TYPE unmodifiable() { return SETS.unmodifiable(this); }
#endif
+#if SPLIT_ITERATOR_FEATURE
/**
* A Type Specific Type Splititerator to reduce boxing/unboxing
* @return type specific splititerator
@@ -74,6 +79,7 @@ public interface SORTED_SET KEY_GENERIC_TYPE extends SET KEY_GENERIC_TYPE, Sorte
@Override
default SPLIT_ITERATOR KEY_GENERIC_TYPE spliterator() { return SPLIT_ITERATORS.createSplititerator(this, 0); }
+#endif
#if !TYPE_OBJECT
/**
* A Type Specific SubSet method to reduce boxing/unboxing
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/Iterables.template b/src/builder/resources/speiger/assets/collections/templates/utils/Iterables.template
index d7b6c64..27ffc7e 100644
--- a/src/builder/resources/speiger/assets/collections/templates/utils/Iterables.template
+++ b/src/builder/resources/speiger/assets/collections/templates/utils/Iterables.template
@@ -342,6 +342,8 @@ public class ITERABLES
#argument MAPPER Predicate ToByteFunction ToShortFunction ToIntFunction ToLongFunction ToFloatFunction ToDoubleFunction
#argument APPLY test applyAsByte applyAsShort applyAsInt applyAsLong applyAsFloat applyAsDouble
#argument DATA_TYPE Boolean Byte Short Int Long Float Double
+#argument FILTER_TYPE BOOLEAN_COLLECTION_MODULE BYTE_COLLECTION_MODULE SHORT_COLLECTION_MODULE INT_COLLECTION_MODULE LONG_COLLECTION_MODULE FLOAT_COLLECTION_MODULE DOUBLE_COLLECTION_MODULE
+#if FILTER_TYPE
private static class MAPPED_TYPEIterable implements OUTPUT_ITERABLE, ISizeProvider
{
ITERABLE KEY_SPECIAL_GENERIC_TYPE iterable;
@@ -369,6 +371,7 @@ public class ITERABLES
}
}
+#endif
#enditerate
#endif
private static class MappedIterable KSS_GENERIC_TYPE implements ObjectIterable, ISizeProvider
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 dc71c85..c0b5da2 100644
--- a/src/builder/resources/speiger/assets/collections/templates/utils/Iterators.template
+++ b/src/builder/resources/speiger/assets/collections/templates/utils/Iterators.template
@@ -25,7 +25,7 @@ import speiger.src.collections.booleans.collections.BooleanIterator;
#argument PACKAGE bytes shorts ints longs floats doubles
#argument MAPPER ToByteFunction ToShortFunction ToIntFunction ToLongFunction ToFloatFunction ToDoubleFunction
#argument FILTER_TYPE BYTE_COLLECTION_MODULE SHORT_COLLECTION_MODULE INT_COLLECTION_MODULE LONG_COLLECTION_MODULE FLOAT_COLLECTION_MODULE DOUBLE_COLLECTION_MODULE
-#if BOOLEAN_COLLECTION_MODULE
+#if FILTER_TYPE
import speiger.src.collections.objects.functions.function.MAPPER;
import speiger.src.collections.PACKAGE.collections.ITERATOR;
#endif
@@ -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);
}
@@ -925,6 +925,8 @@ public class ITERATORS
#argument MAPPER Predicate ToByteFunction ToShortFunction ToIntFunction ToLongFunction ToFloatFunction ToDoubleFunction
#argument APPLY test applyAsByte applyAsShort applyAsInt applyAsLong applyAsFloat applyAsDouble
#argument DATA_TYPE boolean byte short int long float double
+#argument FILTER_TYPE BOOLEAN_COLLECTION_MODULE BYTE_COLLECTION_MODULE SHORT_COLLECTION_MODULE INT_COLLECTION_MODULE LONG_COLLECTION_MODULE FLOAT_COLLECTION_MODULE DOUBLE_COLLECTION_MODULE
+#if FILTER_TYPE
private static class MAPPED_TYPEIterator implements OUTPUT_ITERATOR
{
ITERATOR iterator;
@@ -951,6 +953,7 @@ public class ITERATORS
}
}
+#endif
#enditerate
#endif
private static class FlatMappedIterator KSS_GENERIC_TYPE> implements ObjectIterator
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/OrderedSetTestSuiteBuilder.template b/src/builder/resources/speiger/assets/testers/templates/builder/OrderedSetTestSuiteBuilder.template
index 247eba5..d2bbdfd 100644
--- a/src/builder/resources/speiger/assets/testers/templates/builder/OrderedSetTestSuiteBuilder.template
+++ b/src/builder/resources/speiger/assets/testers/templates/builder/OrderedSetTestSuiteBuilder.template
@@ -1,16 +1,29 @@
package speiger.src.testers.PACKAGE.builder;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import com.google.common.collect.testing.AbstractTester;
+import com.google.common.collect.testing.FeatureSpecificTestSuiteBuilder;
import com.google.common.collect.testing.Helpers;
+import com.google.common.collect.testing.OneSizeTestContainerGenerator;
+import com.google.common.collect.testing.SampleElements;
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.collections.ITERABLE;
+import speiger.src.collections.PACKAGE.lists.ARRAY_LIST;
+import speiger.src.collections.PACKAGE.lists.LIST;
+import speiger.src.collections.PACKAGE.sets.ORDERED_SET;
+import speiger.src.collections.PACKAGE.utils.LISTS;
import speiger.src.testers.PACKAGE.generators.TEST_ORDERED_SET_GENERATOR;
import speiger.src.testers.PACKAGE.tests.set.FILE_KEY_TYPEOrderedSetMoveTester;
import speiger.src.testers.PACKAGE.tests.set.FILE_KEY_TYPEOrderedSetIterationTester;
import speiger.src.testers.PACKAGE.tests.set.FILE_KEY_TYPEOrderedSetNavigationTester;
+import speiger.src.testers.PACKAGE.utils.SAMPLE_ELEMENTS;
+import speiger.src.testers.utils.SpecialFeature;
@SuppressWarnings("javadoc")
public class ORDERED_SET_TEST_BUILDER KEY_GENERIC_TYPE extends SET_TEST_BUILDER KEY_GENERIC_TYPE {
@@ -35,4 +48,68 @@ public class ORDERED_SET_TEST_BUILDER KEY_GENERIC_TYPE extends SET_TEST_BUILDER
#endignore
return super.createTestSuite();
}
+
+ @Override
+ protected List createDerivedSuites(
+ FeatureSpecificTestSuiteBuilder, ? extends OneSizeTestContainerGenerator, CLASS_TYPE>> parentBuilder) {
+ List derivedSuites = super.createDerivedSuites(parentBuilder);
+
+ if (!parentBuilder.getFeatures().contains(SpecialFeature.REVERSE)) {
+ derivedSuites.add(createReverseSuite(parentBuilder));
+ }
+
+ return derivedSuites;
+ }
+
+ private TestSuite createReverseSuite(FeatureSpecificTestSuiteBuilder, ? extends OneSizeTestContainerGenerator, CLASS_TYPE>> parentBuilder) {
+ TEST_ORDERED_SET_GENERATOR KEY_GENERIC_TYPE delegate = (TEST_ORDERED_SET_GENERATOR KEY_GENERIC_TYPE) parentBuilder.getSubjectGenerator().getInnerGenerator();
+
+ List> features = new ArrayList<>();
+ features.add(SpecialFeature.REVERSE);
+ features.addAll(parentBuilder.getFeatures());
+ features.remove(SpecialFeature.COPYING);
+ features.remove(SpecialFeature.CHILDREN_COPY);
+
+ return ORDERED_SET_TEST_BUILDER.using(new TEST_ORDERED_SET_GENERATOR KEY_GENERIC_TYPE() {
+ @Override
+ public SampleElements samples() {
+ return delegate.samples();
+ }
+
+ @Override
+ public SAMPLE_ELEMENTS KEY_GENERIC_TYPE getSamples() {
+ return delegate.getSamples();
+ }
+
+ @Override
+ public ITERABLE KEY_GENERIC_TYPE order(LIST KEY_GENERIC_TYPE insertionOrder) {
+ return insertionOrder;
+ }
+
+ @Override
+ public Iterable order(List insertionOrder) {
+ return insertionOrder;
+ }
+
+#if !TYPE_OBJECT
+ @Override
+ public ORDERED_SET KEY_GENERIC_TYPE create(KEY_TYPE... elements) {
+ LIST KEY_GENERIC_TYPE list = new ARRAY_LISTBRACES(elements);
+ LISTS.reverse(list);
+ return delegate.create(list.TO_ARRAY()).reversed();
+ }
+
+#endif
+ @Override
+ public ORDERED_SET KEY_GENERIC_TYPE create(Object... elements) {
+ LIST KEY_GENERIC_TYPE list = new ARRAY_LISTBRACES();
+ for (Object e : elements) {
+ list.add(CLASS_TO_KEY(e));
+ }
+ LISTS.reverse(list);
+ return delegate.create(list.toArray()).reversed();
+ }
+ }).named(parentBuilder.getName() + " reversing").withFeatures(features)
+ .suppressing(parentBuilder.getSuppressedTests()).createTestSuite();
+ }
}
diff --git a/src/builder/resources/speiger/assets/testers/templates/builder/maps/MapTestSuiteBuilder.template b/src/builder/resources/speiger/assets/testers/templates/builder/maps/MapTestSuiteBuilder.template
index 74ea9fb..9b6bcec 100644
--- a/src/builder/resources/speiger/assets/testers/templates/builder/maps/MapTestSuiteBuilder.template
+++ b/src/builder/resources/speiger/assets/testers/templates/builder/maps/MapTestSuiteBuilder.template
@@ -238,21 +238,17 @@ public class MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MapTestSuiteBuilder
private static Set> computeEntrySetFeatures(Set> mapFeatures) {
Set> entrySetFeatures = MapTestSuiteBuilder.computeCommonDerivedCollectionFeatures(mapFeatures);
#ignore
- if (mapFeatures.contains(MapFeature.ALLOWS_NULL_ENTRY_QUERIES)) {
- entrySetFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
- }
- if(mapFeatures.contains(SpecialFeature.CHILDREN_COPY)) {
- entrySetFeatures.add(SpecialFeature.COPYING);
- }
- else {
- entrySetFeatures.remove(SpecialFeature.COPYING);
- }
- if(mapFeatures.contains(SpecialFeature.MODIFIABLE)) {
- entrySetFeatures.add(SpecialFeature.MODIFIABLE);
- }
- else {
- entrySetFeatures.remove(SpecialFeature.MODIFIABLE);
- }
+ if (mapFeatures.contains(MapFeature.ALLOWS_NULL_ENTRY_QUERIES)) entrySetFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
+
+ if(mapFeatures.contains(SpecialFeature.CHILDREN_COPY)) entrySetFeatures.add(SpecialFeature.COPYING);
+ else entrySetFeatures.remove(SpecialFeature.COPYING);
+
+ if(mapFeatures.contains(SpecialFeature.MODIFIABLE)) entrySetFeatures.add(SpecialFeature.MODIFIABLE);
+ else entrySetFeatures.remove(SpecialFeature.MODIFIABLE);
+
+ if(mapFeatures.contains(SpecialFeature.REVERSE)) entrySetFeatures.add(SpecialFeature.REVERSE);
+ else entrySetFeatures.remove(SpecialFeature.REVERSE);
+
entrySetFeatures.add(SpecialFeature.MAP_ENTRY);
#endignore
return entrySetFeatures;
@@ -262,23 +258,17 @@ public class MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MapTestSuiteBuilder
Set> keySetFeatures = MapTestSuiteBuilder.computeCommonDerivedCollectionFeatures(mapFeatures);
#ignore
keySetFeatures.add(CollectionFeature.SUBSET_VIEW);
- if (mapFeatures.contains(MapFeature.ALLOWS_NULL_KEYS)) {
- keySetFeatures.add(CollectionFeature.ALLOWS_NULL_VALUES);
- } else if (mapFeatures.contains(MapFeature.ALLOWS_NULL_KEY_QUERIES)) {
- keySetFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
- }
- if(mapFeatures.contains(SpecialFeature.CHILDREN_COPY)) {
- keySetFeatures.add(SpecialFeature.COPYING);
- }
- else {
- keySetFeatures.remove(SpecialFeature.COPYING);
- }
- if(mapFeatures.contains(SpecialFeature.MODIFIABLE)) {
- keySetFeatures.add(SpecialFeature.MODIFIABLE);
- }
- else {
- keySetFeatures.remove(SpecialFeature.MODIFIABLE);
- }
+ if (mapFeatures.contains(MapFeature.ALLOWS_NULL_KEYS)) keySetFeatures.add(CollectionFeature.ALLOWS_NULL_VALUES);
+ else if (mapFeatures.contains(MapFeature.ALLOWS_NULL_KEY_QUERIES)) keySetFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
+
+ if(mapFeatures.contains(SpecialFeature.CHILDREN_COPY)) keySetFeatures.add(SpecialFeature.COPYING);
+ else keySetFeatures.remove(SpecialFeature.COPYING);
+
+ if(mapFeatures.contains(SpecialFeature.MODIFIABLE)) keySetFeatures.add(SpecialFeature.MODIFIABLE);
+ else keySetFeatures.remove(SpecialFeature.MODIFIABLE);
+
+ if(mapFeatures.contains(SpecialFeature.REVERSE)) keySetFeatures.add(SpecialFeature.REVERSE);
+ else keySetFeatures.remove(SpecialFeature.REVERSE);
#endignore
return keySetFeatures;
}
@@ -287,18 +277,15 @@ public class MAP_TEST_BUILDER KEY_VALUE_GENERIC_TYPE extends MapTestSuiteBuilder
private static Set> computeValuesCollectionFeatures(Set> mapFeatures) {
Set> valuesCollectionFeatures = MapTestSuiteBuilder.computeCommonDerivedCollectionFeatures(mapFeatures);
#ignore
- if (mapFeatures.contains(MapFeature.ALLOWS_NULL_VALUE_QUERIES)) {
- valuesCollectionFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
- }
- if (mapFeatures.contains(MapFeature.ALLOWS_NULL_VALUES)) {
- valuesCollectionFeatures.add(CollectionFeature.ALLOWS_NULL_VALUES);
- }
- if(mapFeatures.contains(SpecialFeature.CHILDREN_COPY)) {
- valuesCollectionFeatures.add(SpecialFeature.COPYING);
- }
- else {
- valuesCollectionFeatures.remove(SpecialFeature.COPYING);
- }
+ if (mapFeatures.contains(MapFeature.ALLOWS_NULL_VALUE_QUERIES)) valuesCollectionFeatures.add(CollectionFeature.ALLOWS_NULL_QUERIES);
+
+ if (mapFeatures.contains(MapFeature.ALLOWS_NULL_VALUES)) valuesCollectionFeatures.add(CollectionFeature.ALLOWS_NULL_VALUES);
+
+ if(mapFeatures.contains(SpecialFeature.CHILDREN_COPY)) valuesCollectionFeatures.add(SpecialFeature.COPYING);
+ else valuesCollectionFeatures.remove(SpecialFeature.COPYING);
+
+ if(mapFeatures.contains(SpecialFeature.REVERSE)) valuesCollectionFeatures.add(SpecialFeature.REVERSE);
+ else valuesCollectionFeatures.remove(SpecialFeature.REVERSE);
#endignore
return valuesCollectionFeatures;
}
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..5568ad5 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, ? extends OneSizeTestContainerGenerator