package speiger.src.collections.PACKAGE.lists; import java.util.List; #if !TYPE_OBJECT && !TYPE_BOOLEAN import java.util.Objects; import java.util.function.UNARY_OPERATOR; import java.util.function.UnaryOperator; #endif import java.util.Comparator; import speiger.src.collections.PACKAGE.collections.COLLECTION; #if !TYPE_OBJECT import speiger.src.collections.PACKAGE.functions.COMPARATOR; #endif import speiger.src.collections.PACKAGE.utils.ARRAYS; #if TYPE_BYTE || TYPE_SHORT || TYPE_CHAR || TYPE_FLOAT import speiger.src.collections.utils.SanityChecks; #endif public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List { #if !TYPE_OBJECT @Override public boolean add(KEY_TYPE e); public void add(int index, KEY_TYPE e); #endif public boolean addAll(int index, COLLECTION KEY_GENERIC_TYPE c); public boolean addAll(LIST KEY_GENERIC_TYPE c); public boolean addAll(int index, LIST KEY_GENERIC_TYPE c); #if !TYPE_OBJECT public KEY_TYPE GET_KEY(int index); public KEY_TYPE set(int index, KEY_TYPE e); public KEY_TYPE REMOVE(int index); public int indexOf(KEY_TYPE e); public int lastIndexOf(KEY_TYPE e); #if !TYPE_BOOLEAN public default void REPLACE(UNARY_OPERATOR o) { Objects.requireNonNull(o); LIST_ITERATOR iter = listIterator(); while (iter.hasNext()) #if TYPE_BYTE || TYPE_SHORT || TYPE_CHAR || TYPE_FLOAT iter.set(SanityChecks.SANITY_CAST(o.APPLY(iter.NEXT()))); #else iter.set(o.APPLY(iter.NEXT())); #endif } #endif #endif public default void addElements(int from, KEY_TYPE[] a) { addElements(from, a, 0, a.length); } public void addElements(int from, KEY_TYPE[] a, int offset, int length); public default KEY_TYPE[] getElements(int from, KEY_TYPE[] a) { return getElements(from, a, 0, a.length); } public KEY_TYPE[] getElements(int from, KEY_TYPE[] a, int offset, int length); public void removeElements(int from, int to); #if TYPE_OBJECT public KEY_TYPE[] extractElements(int from, int to, Class type); @Override public default void sort(Comparator c) { KEY_TYPE[] array = (KEY_TYPE[])TO_ARRAY(); if(c != null) ARRAYS.stableSort(array, c); else ARRAYS.stableSort((Comparable[])array); LIST_ITERATOR KEY_GENERIC_TYPE iter = listIterator(); for (int i = 0,m=size();i c) { KEY_TYPE[] array = (KEY_TYPE[])TO_ARRAY(); if(c != null) ARRAYS.unstableSort(array, c); else ARRAYS.unstableSort((Comparable[])array); LIST_ITERATOR KEY_GENERIC_TYPE iter = listIterator(); for (int i = 0,m=size();i c) { sort((K, V) -> c.compare(KEY_TO_OBJ(K), KEY_TO_OBJ(V))); } public default void sort(COMPARATOR c) { KEY_TYPE[] array = TO_ARRAY(); if(c != null) ARRAYS.stableSort(array, c); else ARRAYS.stableSort(array); LIST_ITERATOR KEY_GENERIC_TYPE iter = listIterator(); for (int i = 0,m=size();i c) { unstableSort((K, V) -> c.compare(KEY_TO_OBJ(K), KEY_TO_OBJ(V))); } public default void unstableSort(COMPARATOR c) { KEY_TYPE[] array = TO_ARRAY(); if(c != null) ARRAYS.unstableSort(array, c); else ARRAYS.unstableSort(array); LIST_ITERATOR KEY_GENERIC_TYPE iter = listIterator(); for (int i = 0,m=size();i o) { Objects.requireNonNull(o); #if TYPE_BYTE || TYPE_SHORT || TYPE_CHAR || TYPE_FLOAT REPLACE(T -> OBJ_TO_KEY(o.apply(KEY_TO_OBJ((KEY_TYPE)T)))); #else REPLACE(T -> OBJ_TO_KEY(o.apply(KEY_TO_OBJ(T)))); #endif } #endif #endif }