Added TrimAndClear function into ITrimmable

This commit is contained in:
Speiger 2021-05-26 13:06:52 +02:00
parent 13b2c727fc
commit 998272c8d5
9 changed files with 110 additions and 0 deletions

View File

@ -921,6 +921,20 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
return true; return true;
} }
/**
* Trims the collection down to the requested size and clears all elements while doing so
* @param size the amount of elements that should be allowed
* @note this will enforce minimum size of the collection itself
*/
@Override
public void clearAndTrim(int size) {
if(data.length <= size) {
clear();
return;
}
data = size == 0 ? EMPTY_KEY_ARRAY : NEW_KEY_ARRAY(size);
}
/** /**
* Increases the capacity of this implementation instance, if necessary, * Increases the capacity of this implementation instance, if necessary,
* to ensure that it can hold at least the number of elements specified by * to ensure that it can hold at least the number of elements specified by

View File

@ -237,6 +237,22 @@ public class ARRAY_FIFO_QUEUE KEY_GENERIC_TYPE implements PRIORITY_DEQUEUE KEY_G
return true; return true;
} }
/**
* Trims the collection down to the requested size and clears all elements while doing so
* @param size the amount of elements that should be allowed
* @note this will enforce minimum size of the collection itself
*/
@Override
public void clearAndTrim(int size) {
int newSize = Math.max(MIN_CAPACITY, size);
if(array.length <= newSize) {
clear();
return;
}
first = last = 0;
array = NEW_KEY_ARRAY(newSize);
}
@Override @Override
public KEY_TYPE[] TO_ARRAY(KEY_TYPE[] input) { public KEY_TYPE[] TO_ARRAY(KEY_TYPE[] input) {
if(input == null || input.length < size()) input = NEW_KEY_ARRAY(size()); if(input == null || input.length < size()) input = NEW_KEY_ARRAY(size());

View File

@ -501,6 +501,21 @@ public class LINKED_CUSTOM_HASH_SET KEY_GENERIC_TYPE extends CUSTOM_HASH_SET KEY
firstIndex = lastIndex = -1; firstIndex = lastIndex = -1;
} }
@Override
public void clearAndTrim(int size) {
if(nullIndex <= size) {
clear();
return;
}
nullIndex = size;
mask = nullIndex - 1;
maxFill = Math.min((int)Math.ceil(nullIndex * loadFactor), nullIndex - 1);
keys = NEW_KEY_ARRAY(nullIndex + 1);
links = new long[nullIndex + 1];
firstIndex = -1;
lastIndex = -1;
}
@Override @Override
public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { public LIST_ITERATOR KEY_GENERIC_TYPE iterator() {
return new SetIterator(); return new SetIterator();

View File

@ -473,6 +473,21 @@ public class LINKED_HASH_SET KEY_GENERIC_TYPE extends HASH_SET KEY_GENERIC_TYPE
firstIndex = lastIndex = -1; firstIndex = lastIndex = -1;
} }
@Override
public void clearAndTrim(int size) {
if(nullIndex <= size) {
clear();
return;
}
nullIndex = size;
mask = nullIndex - 1;
maxFill = Math.min((int)Math.ceil(nullIndex * loadFactor), nullIndex - 1);
keys = NEW_KEY_ARRAY(nullIndex + 1);
links = new long[nullIndex + 1];
firstIndex = -1;
lastIndex = -1;
}
@Override @Override
public LIST_ITERATOR KEY_GENERIC_TYPE iterator() { public LIST_ITERATOR KEY_GENERIC_TYPE iterator() {
return new SetIterator(); return new SetIterator();

View File

@ -348,6 +348,18 @@ public class CUSTOM_HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_T
return true; return true;
} }
@Override
public void clearAndTrim(int size) {
if(nullIndex <= size) {
clear();
return;
}
nullIndex = size;
mask = nullIndex - 1;
maxFill = Math.min((int)Math.ceil(nullIndex * loadFactor), nullIndex - 1);
keys = NEW_KEY_ARRAY(nullIndex + 1);
}
private void ensureCapacity(int newCapacity) { private void ensureCapacity(int newCapacity) {
int size = HashUtil.arraySize(newCapacity, loadFactor); int size = HashUtil.arraySize(newCapacity, loadFactor);
if(size > nullIndex) rehash(size); if(size > nullIndex) rehash(size);

View File

@ -306,6 +306,18 @@ public class HASH_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE imp
return true; return true;
} }
@Override
public void clearAndTrim(int size) {
if(nullIndex <= size) {
clear();
return;
}
nullIndex = size;
mask = nullIndex - 1;
maxFill = Math.min((int)Math.ceil(nullIndex * loadFactor), nullIndex - 1);
keys = NEW_KEY_ARRAY(nullIndex + 1);
}
private void ensureCapacity(int newCapacity) { private void ensureCapacity(int newCapacity) {
int size = HashUtil.arraySize(newCapacity, loadFactor); int size = HashUtil.arraySize(newCapacity, loadFactor);
if(size > nullIndex) rehash(size); if(size > nullIndex) rehash(size);

View File

@ -146,6 +146,9 @@ public class LISTS
@Override @Override
public boolean trim(int size) { synchronized(mutex) { return l.trim(size); } } public boolean trim(int size) { synchronized(mutex) { return l.trim(size); } }
@Override
public void clearAndTrim(int size) { synchronized(mutex) { l.clearAndTrim(size); } }
@Override @Override
public KEY_TYPE[] elements() { synchronized(mutex) { return l.elements(); } } public KEY_TYPE[] elements() { synchronized(mutex) { return l.elements(); } }

View File

@ -358,6 +358,9 @@ public class SETS
@Override @Override
public boolean trim(int size) { synchronized(mutex) { return trim.trim(size); } } 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 private static class SynchronizedNavigableSet KEY_GENERIC_TYPE extends SynchronizedSortedSet KEY_GENERIC_TYPE implements NAVIGABLE_SET KEY_GENERIC_TYPE
@ -450,6 +453,9 @@ public class SETS
@Override @Override
public boolean trim(int size) { synchronized(mutex) { return trim.trim(size); } } 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 private static class SynchronizedSortedSet KEY_GENERIC_TYPE extends SynchronizedSet KEY_GENERIC_TYPE implements SORTED_SET KEY_GENERIC_TYPE
@ -525,6 +531,9 @@ public class SETS
@Override @Override
public boolean trim(int size) { synchronized(mutex) { return trim.trim(size); } } 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 private static class SynchronizedSet KEY_GENERIC_TYPE extends SynchronizedCollection KEY_GENERIC_TYPE implements SET KEY_GENERIC_TYPE

View File

@ -20,4 +20,18 @@ public interface ITrimmable
* @return if the internal array has been trimmed. * @return if the internal array has been trimmed.
*/ */
public boolean trim(int size); public boolean trim(int size);
/**
* Trims the collection down to the original size and clears all present elements with it.
*/
public default void clearAndTrim() {
clearAndTrim(0);
}
/**
* Trims the collection down to the requested size and clears all elements while doing so
* @param size the amount of elements that should be allowed
* @note this will enforce minimum size of the collection itself
*/
public void clearAndTrim(int size);
} }