package speiger.src.collections.PACKAGE.utils; #if TYPE_BOOLEAN import speiger.src.collections.booleans.collections.BooleanIterator; import speiger.src.collections.booleans.sets.AbstractBooleanSet; import speiger.src.collections.booleans.sets.BooleanSet; import speiger.src.collections.booleans.utils.BooleanCollections.EmptyCollection; #else #if TYPE_OBJECT import java.util.Comparator; #endif import speiger.src.collections.PACKAGE.collections.BI_ITERATOR; #if !TYPE_OBJECT import speiger.src.collections.PACKAGE.functions.COMPARATOR; #endif import speiger.src.collections.PACKAGE.collections.ITERATOR; import speiger.src.collections.PACKAGE.sets.NAVIGABLE_SET; import speiger.src.collections.PACKAGE.sets.ABSTRACT_SET; import speiger.src.collections.PACKAGE.sets.SET; import speiger.src.collections.PACKAGE.sets.SORTED_SET; import speiger.src.collections.PACKAGE.utils.COLLECTIONS.EmptyCollection; import speiger.src.collections.PACKAGE.utils.COLLECTIONS.SynchronizedCollection; import speiger.src.collections.PACKAGE.utils.COLLECTIONS.UnmodifiableCollection; import speiger.src.collections.utils.ITrimmable; #endif /** * A Helper class for sets */ public class SETS { /** * Empty Set Variable */ public static final SET NO_GENERIC_TYPE EMPTY = new EmptySetBRACES(); /** * EmptySet getter * @Type(T) * @return a EmptySet */ public static GENERIC_KEY_BRACES SET KEY_GENERIC_TYPE empty() { #if TYPE_OBJECT return (SET)EMPTY; #else return EMPTY; #endif } #if !TYPE_BOOLEAN /** * Creates a Synchronized set while preserving the ITrimmable interface * @param s the set that should be synchronized * @Type(T) * @return a set that is synchronized * @note if the set is already synchronized then it will just self return it */ public static GENERIC_KEY_BRACES SET KEY_GENERIC_TYPE synchronize(SET KEY_GENERIC_TYPE s) { return s instanceof SynchronizedSet ? s : (s instanceof ITrimmable ? new SynchronizedTrimSetBRACES(s) : new SynchronizedSetBRACES(s)); } /** * Creates a Synchronized set while preserving the ITrimmable interface * @param s the set that should be synchronized * @param mutex controller for access * @Type(T) * @return a set that is synchronized * @note if the set is already synchronized then it will just self return it */ public static GENERIC_KEY_BRACES SET KEY_GENERIC_TYPE synchronize(SET KEY_GENERIC_TYPE s, Object mutex) { return s instanceof SynchronizedSet ? s : (s instanceof ITrimmable ? new SynchronizedTrimSetBRACES(s, mutex) : new SynchronizedSetBRACES(s, mutex)); } /** * Creates a Synchronized SortedSet while preserving the ITrimmable interface * @param s the set that should be synchronized * @Type(T) * @return a SortedSet that is synchronized * @note if the set is already synchronized then it will just self return it */ public static GENERIC_KEY_BRACES SORTED_SET KEY_GENERIC_TYPE synchronize(SORTED_SET KEY_GENERIC_TYPE s) { return s instanceof SynchronizedSortedSet ? s : (s instanceof ITrimmable ? new SynchronizedSortedTrimSetBRACES(s) : new SynchronizedSortedSetBRACES(s)); } /** * Creates a Synchronized SortedSet while preserving the ITrimmable interface * @param s the set that should be synchronized * @param mutex controller for access * @Type(T) * @return a SortedSet that is synchronized * @note if the set is already synchronized then it will just self return it */ public static GENERIC_KEY_BRACES SORTED_SET KEY_GENERIC_TYPE synchronize(SORTED_SET KEY_GENERIC_TYPE s, Object mutex) { return s instanceof SynchronizedSortedSet ? s : (s instanceof ITrimmable ? new SynchronizedSortedTrimSetBRACES(s, mutex) : new SynchronizedSortedSetBRACES(s, mutex)); } /** * Creates a Synchronized NavigableSet while preserving the ITrimmable interface * @param s the set that should be synchronized * @Type(T) * @return a NavigableSet that is synchronized * @note if the set is already synchronized then it will just self return it */ public static GENERIC_KEY_BRACES NAVIGABLE_SET KEY_GENERIC_TYPE synchronize(NAVIGABLE_SET KEY_GENERIC_TYPE s) { return s instanceof SynchronizedNavigableSet ? s : (s instanceof ITrimmable ? new SynchronizedNavigableTrimSetBRACES(s) : new SynchronizedNavigableSetBRACES(s)); } /** * Creates a Synchronized NavigableSet while preserving the ITrimmable interface * @param s the set that should be synchronized * @param mutex controller for access * @Type(T) * @return a NavigableSet that is synchronized * @note if the set is already synchronized then it will just self return it */ public static GENERIC_KEY_BRACES NAVIGABLE_SET KEY_GENERIC_TYPE synchronize(NAVIGABLE_SET KEY_GENERIC_TYPE s, Object mutex) { return s instanceof SynchronizedNavigableSet ? s : (s instanceof ITrimmable ? new SynchronizedNavigableTrimSetBRACES(s, mutex) : new SynchronizedNavigableSetBRACES(s, mutex)); } /** * Creates Unmodifyable Set wrapper * @param s set that should be made unmodifiable * @Type(T) * @return a UnmodifyableSet, if the set is already unmodifiable then it returns itself */ public static GENERIC_KEY_BRACES SET KEY_GENERIC_TYPE unmodifiable(SET KEY_GENERIC_TYPE s) { return s instanceof UnmodifiableSet ? s : new UnmodifiableSetBRACES(s); } /** * Creates Unmodifyable SortedSet wrapper * @param s sortedSet that should be made unmodifiable * @Type(T) * @return a UnmodifyableSortedSet, if the set is already unmodifiable then it returns itself */ public static GENERIC_KEY_BRACES SORTED_SET KEY_GENERIC_TYPE unmodifiable(SORTED_SET KEY_GENERIC_TYPE s) { return s instanceof UnmodifiableSortedSet ? s : new UnmodifiableSortedSetBRACES(s); } /** * Creates Unmodifyable NavigableSet wrapper * @param s navigableSet that should be made unmodifiable * @Type(T) * @return a UnmodifyableNavigableSet, if the set is already unmodifiable then it returns itself */ public static GENERIC_KEY_BRACES NAVIGABLE_SET KEY_GENERIC_TYPE unmodifiable(NAVIGABLE_SET KEY_GENERIC_TYPE s) { return s instanceof UnmodifiableNavigableSet ? s : new UnmodifiableNavigableSetBRACES(s); } #endif /** * Creates a Singleton set of a given element * @param element the element that should be converted into a singleton set * @Type(T) * @return a singletonset of the given element */ public static GENERIC_KEY_BRACES SET KEY_GENERIC_TYPE singleton(KEY_TYPE element) { return new SingletonSetBRACES(element); } private static class SingletonSet KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE { KEY_TYPE element; SingletonSet(KEY_TYPE element) { this.element = element; } #if !TYPE_OBJECT @Override public boolean remove(KEY_TYPE o) { throw new UnsupportedOperationException(); } #endif @Override public boolean add(KEY_TYPE o) { throw new UnsupportedOperationException(); } @Override public ITERATOR KEY_GENERIC_TYPE iterator() { return new ITERATOR KEY_GENERIC_TYPE() { boolean next = true; @Override public boolean hasNext() { return next = false; } @Override public KEY_TYPE NEXT() { if(!next) throw new IllegalStateException(); next = false; return element; } }; } @Override public int size() { return 1; } } private static class EmptySet KEY_GENERIC_TYPE extends EmptyCollection KEY_GENERIC_TYPE implements SET KEY_GENERIC_TYPE { #if !TYPE_OBJECT @Override public boolean remove(KEY_TYPE o) { throw new UnsupportedOperationException(); } #endif } #if !TYPE_BOOLEAN private static class UnmodifiableNavigableSet KEY_GENERIC_TYPE extends UnmodifiableSortedSet KEY_GENERIC_TYPE implements NAVIGABLE_SET KEY_GENERIC_TYPE { NAVIGABLE_SET KEY_GENERIC_TYPE n; UnmodifiableNavigableSet(NAVIGABLE_SET KEY_GENERIC_TYPE c) { super(c); n = c; } #if !TYPE_OBJECT @Override public boolean contains(KEY_TYPE o) { return n.contains(o); } #endif @Override @Deprecated public boolean contains(Object o) { return n.contains(o); } @Override public KEY_TYPE lower(KEY_TYPE e) { return n.lower(e); } @Override public KEY_TYPE floor(KEY_TYPE e) { return n.floor(e); } @Override public KEY_TYPE ceiling(KEY_TYPE e) { return n.ceiling(e); } @Override public KEY_TYPE higher(KEY_TYPE e) { return n.higher(e); } #if !TYPE_OBJECT @Override public void setDefaultMaxValue(KEY_TYPE e) { throw new UnsupportedOperationException(); } @Override public KEY_TYPE getDefaultMaxValue() { return n.getDefaultMaxValue(); } @Override public void setDefaultMinValue(KEY_TYPE e) { throw new UnsupportedOperationException(); } @Override public KEY_TYPE getDefaultMinValue() { return n.getDefaultMinValue(); } #endif @Override public NAVIGABLE_SET KEY_GENERIC_TYPE subSet(KEY_TYPE fromElement, boolean fromInclusive, KEY_TYPE toElement, boolean toInclusive) { return unmodifiable(n.subSet(fromElement, fromInclusive, toElement, toInclusive)); } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE headSet(KEY_TYPE toElement, boolean inclusive) { return unmodifiable(n.headSet(toElement, inclusive)); } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE tailSet(KEY_TYPE fromElement, boolean inclusive) { return unmodifiable(n.tailSet(fromElement, inclusive)); } @Override public BI_ITERATOR KEY_GENERIC_TYPE descendingIterator() { return ITERATORS.unmodifiable(n.descendingIterator()); } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE descendingSet() { return unmodifiable(n.descendingSet()); } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE subSet(KEY_TYPE fromElement, KEY_TYPE toElement) { return unmodifiable(n.subSet(fromElement, toElement)); } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE headSet(KEY_TYPE toElement) { return unmodifiable(n.headSet(toElement)); } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE tailSet(KEY_TYPE fromElement) { return unmodifiable(n.tailSet(fromElement)); } } private static class UnmodifiableSortedSet KEY_GENERIC_TYPE extends UnmodifiableSet KEY_GENERIC_TYPE implements SORTED_SET KEY_GENERIC_TYPE { SORTED_SET KEY_GENERIC_TYPE s; UnmodifiableSortedSet(SORTED_SET KEY_GENERIC_TYPE c) { super(c); s = c; } @Override public boolean addAndMoveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); } @Override public boolean addAndMoveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); } @Override public boolean moveToFirst(KEY_TYPE o) { throw new UnsupportedOperationException(); } @Override public boolean moveToLast(KEY_TYPE o) { throw new UnsupportedOperationException(); } @Override public COMPARATOR KEY_GENERIC_TYPE comparator() { return s.comparator(); } @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator() { return ITERATORS.unmodifiable(s.iterator()); } @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) { return ITERATORS.unmodifiable(s.iterator(fromElement)); } @Override public SORTED_SET KEY_GENERIC_TYPE subSet(KEY_TYPE fromElement, KEY_TYPE toElement) { return unmodifiable(s.subSet(fromElement, toElement)); } @Override public SORTED_SET KEY_GENERIC_TYPE headSet(KEY_TYPE toElement) { return unmodifiable(s.headSet(toElement)); } @Override public SORTED_SET KEY_GENERIC_TYPE tailSet(KEY_TYPE fromElement) { return unmodifiable(s.tailSet(fromElement)); } @Override public KEY_TYPE FIRST_KEY() { return s.FIRST_KEY(); } @Override public KEY_TYPE POLL_FIRST_KEY() { throw new UnsupportedOperationException(); } @Override public KEY_TYPE LAST_KEY() { return s.LAST_KEY(); } @Override public KEY_TYPE POLL_LAST_KEY() { throw new UnsupportedOperationException(); } } /** * Unmodifyable Set wrapper that helps is used with unmodifyableSet function * @Type(T) */ public static class UnmodifiableSet KEY_GENERIC_TYPE extends UnmodifiableCollection KEY_GENERIC_TYPE implements SET KEY_GENERIC_TYPE { SET KEY_GENERIC_TYPE s; protected UnmodifiableSet(SET KEY_GENERIC_TYPE c) { super(c); s = c; } #if !TYPE_OBJECT @Override public boolean remove(KEY_TYPE o) { throw new UnsupportedOperationException(); } #endif } private static class SynchronizedNavigableTrimSet KEY_GENERIC_TYPE extends SynchronizedNavigableSet KEY_GENERIC_TYPE implements ITrimmable { ITrimmable trim; SynchronizedNavigableTrimSet(NAVIGABLE_SET KEY_GENERIC_TYPE c) { super(c); trim = (ITrimmable)c; } SynchronizedNavigableTrimSet(NAVIGABLE_SET KEY_GENERIC_TYPE c, Object mutex) { super(c, mutex); trim = (ITrimmable)c; } @Override public boolean trim(int size) { synchronized(mutex) { return trim.trim(size); } } @Override public void clearAndTrim(int size) { synchronized(mutex) { trim.clearAndTrim(size); } } } private static class SynchronizedNavigableSet KEY_GENERIC_TYPE extends SynchronizedSortedSet KEY_GENERIC_TYPE implements NAVIGABLE_SET KEY_GENERIC_TYPE { NAVIGABLE_SET KEY_GENERIC_TYPE n; SynchronizedNavigableSet(NAVIGABLE_SET KEY_GENERIC_TYPE c) { super(c); n = c; } SynchronizedNavigableSet(NAVIGABLE_SET KEY_GENERIC_TYPE c, Object mutex) { super(c, mutex); n = c; } @Override @Deprecated public boolean contains(Object o) { synchronized(mutex) { return n.contains(o); } } #if !TYPE_OBJECT @Override public boolean contains(KEY_TYPE o) { synchronized(mutex) { return n.contains(o); } } #endif @Override public KEY_TYPE lower(KEY_TYPE e) { synchronized(mutex) { return n.lower(e); } } @Override public KEY_TYPE floor(KEY_TYPE e) { synchronized(mutex) { return n.floor(e); } } @Override public KEY_TYPE ceiling(KEY_TYPE e) { synchronized(mutex) { return n.ceiling(e); } } @Override public KEY_TYPE higher(KEY_TYPE e) { synchronized(mutex) { return n.higher(e); } } #if !TYPE_OBJECT @Override public void setDefaultMaxValue(KEY_TYPE e) { synchronized(mutex) { n.setDefaultMaxValue(e); } } @Override public KEY_TYPE getDefaultMaxValue() { synchronized(mutex) { return n.getDefaultMaxValue(); } } @Override public void setDefaultMinValue(KEY_TYPE e) { synchronized(mutex) { n.setDefaultMinValue(e); } } @Override public KEY_TYPE getDefaultMinValue() { synchronized(mutex) { return n.getDefaultMinValue(); } } #endif @Override public NAVIGABLE_SET KEY_GENERIC_TYPE subSet(KEY_TYPE fromElement, boolean fromInclusive, KEY_TYPE toElement, boolean toInclusive) { synchronized(mutex) { return synchronize(n.subSet(fromElement, fromInclusive, toElement, toInclusive), mutex); } } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE headSet(KEY_TYPE toElement, boolean inclusive) { synchronized(mutex) { return synchronize(n.headSet(toElement, inclusive), mutex); } } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE tailSet(KEY_TYPE fromElement, boolean inclusive) { synchronized(mutex) { return synchronize(n.tailSet(fromElement, inclusive), mutex); } } @Override public BI_ITERATOR KEY_GENERIC_TYPE descendingIterator() { synchronized(mutex) { return n.descendingIterator(); } } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE descendingSet() { synchronized(mutex) { return synchronize(n.descendingSet(), mutex); } } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE subSet(KEY_TYPE fromElement, KEY_TYPE toElement) { synchronized(mutex) { return synchronize(n.subSet(fromElement, toElement), mutex); } } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE headSet(KEY_TYPE toElement) { synchronized(mutex) { return synchronize(n.headSet(toElement), mutex); } } @Override public NAVIGABLE_SET KEY_GENERIC_TYPE tailSet(KEY_TYPE fromElement) { synchronized(mutex) { return synchronize(n.tailSet(fromElement), mutex); } } } private static class SynchronizedSortedTrimSet KEY_GENERIC_TYPE extends SynchronizedSortedSet KEY_GENERIC_TYPE implements ITrimmable { ITrimmable trim; SynchronizedSortedTrimSet(SORTED_SET KEY_GENERIC_TYPE c) { super(c); trim = (ITrimmable)c; } SynchronizedSortedTrimSet(SORTED_SET KEY_GENERIC_TYPE c, Object mutex) { super(c, mutex); trim = (ITrimmable)c; } @Override public boolean trim(int size) { synchronized(mutex) { return trim.trim(size); } } @Override public void clearAndTrim(int size) { synchronized(mutex) { trim.clearAndTrim(size); } } } private static class SynchronizedSortedSet KEY_GENERIC_TYPE extends SynchronizedSet KEY_GENERIC_TYPE implements SORTED_SET KEY_GENERIC_TYPE { SORTED_SET KEY_GENERIC_TYPE s; SynchronizedSortedSet(SORTED_SET KEY_GENERIC_TYPE c) { super(c); s = c; } SynchronizedSortedSet(SORTED_SET KEY_GENERIC_TYPE c, Object mutex) { super(c, mutex); s = c; } @Override public boolean addAndMoveToFirst(KEY_TYPE o) { synchronized(mutex) { return s.addAndMoveToFirst(o); } } @Override public boolean addAndMoveToLast(KEY_TYPE o) { synchronized(mutex) { return s.addAndMoveToLast(o); } } @Override public boolean moveToFirst(KEY_TYPE o) { synchronized(mutex) { return s.moveToFirst(o); } } @Override public boolean moveToLast(KEY_TYPE o) { synchronized(mutex) { return s.moveToLast(o); } } @Override public COMPARATOR KEY_GENERIC_TYPE comparator(){ synchronized(mutex) { return s.comparator(); } } @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator() { synchronized(mutex) { return s.iterator(); } } @Override public BI_ITERATOR KEY_GENERIC_TYPE iterator(KEY_TYPE fromElement) { synchronized(mutex) { return s.iterator(fromElement); } } @Override public SORTED_SET KEY_GENERIC_TYPE subSet(KEY_TYPE fromElement, KEY_TYPE toElement) { synchronized(mutex) { return synchronize(s.subSet(fromElement, toElement), mutex); } } @Override public SORTED_SET KEY_GENERIC_TYPE headSet(KEY_TYPE toElement) { synchronized(mutex) { return synchronize(s.headSet(toElement), mutex); } } @Override public SORTED_SET KEY_GENERIC_TYPE tailSet(KEY_TYPE fromElement) { synchronized(mutex) { return synchronize(s.tailSet(fromElement), mutex); } } @Override public KEY_TYPE FIRST_KEY() { synchronized(mutex) { return s.FIRST_KEY(); } } @Override public KEY_TYPE POLL_FIRST_KEY() { synchronized(mutex) { return s.POLL_FIRST_KEY(); } } @Override public KEY_TYPE LAST_KEY() { synchronized(mutex) { return s.LAST_KEY(); } } @Override public KEY_TYPE POLL_LAST_KEY() { synchronized(mutex) { return s.POLL_LAST_KEY(); } } } private static class SynchronizedTrimSet KEY_GENERIC_TYPE extends SynchronizedSet KEY_GENERIC_TYPE implements ITrimmable { ITrimmable trim; SynchronizedTrimSet(SET KEY_GENERIC_TYPE c) { super(c); trim = (ITrimmable)c; } SynchronizedTrimSet(SET KEY_GENERIC_TYPE c, Object mutex) { super(c, mutex); trim = (ITrimmable)c; } @Override public boolean trim(int size) { synchronized(mutex) { return trim.trim(size); } } @Override public void clearAndTrim(int size) { synchronized(mutex) { trim.clearAndTrim(size); } } } private static class SynchronizedSet KEY_GENERIC_TYPE extends SynchronizedCollection KEY_GENERIC_TYPE implements SET KEY_GENERIC_TYPE { #if !TYPE_OBJECT SET KEY_GENERIC_TYPE s; #endif SynchronizedSet(SET KEY_GENERIC_TYPE c) { super(c); #if !TYPE_OBJECT s = c; #endif } SynchronizedSet(SET KEY_GENERIC_TYPE c, Object mutex) { super(c, mutex); #if !TYPE_OBJECT s = c; #endif } #if !TYPE_OBJECT @Override public boolean remove(KEY_TYPE o) { synchronized(mutex) { return s.remove(o); } } #endif } #endif }