forked from Speiger/Primitive-Collections
Added RemoveSwap
This commit is contained in:
parent
e7bc242292
commit
c930bda7a6
|
@ -284,6 +284,7 @@ public class GlobalVariables
|
|||
addFunctionValueMapper("MERGE", "merge");
|
||||
addFunctionMapper("NEXT", "next");
|
||||
addFunctionMapper("PREVIOUS", "previous");
|
||||
addFunctionMapper("REMOVE_SWAP", "swapRemove");
|
||||
if(type.isObject()) addFunctionMapper("REMOVE_VALUE", "rem");
|
||||
else addSimpleMapper("REMOVE_VALUE", "remove");
|
||||
addFunctionMapper("REMOVE_KEY", "rem");
|
||||
|
|
|
@ -155,6 +155,14 @@ public abstract class ABSTRACT_LIST KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION
|
|||
}
|
||||
|
||||
#endif
|
||||
@Override
|
||||
public boolean REMOVE_SWAP(KEY_TYPE e) {
|
||||
int index = indexOf(e);
|
||||
if(index == -1) return false;
|
||||
swapRemove(index);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares if the list are the same.
|
||||
*/
|
||||
|
@ -347,8 +355,18 @@ public abstract class ABSTRACT_LIST KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION
|
|||
@Override
|
||||
public KEY_TYPE REMOVE(int index) {
|
||||
checkRange(index);
|
||||
size--;
|
||||
return l.REMOVE(index + offset);
|
||||
int temp = l.size();
|
||||
KEY_TYPE type = l.REMOVE(index + offset);
|
||||
if(l.size() != temp) size--;
|
||||
return type;
|
||||
}
|
||||
|
||||
public KEY_TYPE swapRemove(int index) {
|
||||
checkRange(index);
|
||||
int temp = l.size();
|
||||
KEY_TYPE type = l.swapRemove(index + offset);
|
||||
if(l.size() != temp) size--;
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -760,6 +760,17 @@ public class ARRAY_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||
return old;
|
||||
}
|
||||
|
||||
public KEY_TYPE swapRemove(int index) {
|
||||
checkRange(index);
|
||||
KEY_TYPE old = data[index];
|
||||
size--;
|
||||
data[index] = data[size];
|
||||
#if TYPE_OBJECT
|
||||
data[size] = null;
|
||||
#endif
|
||||
return old;
|
||||
}
|
||||
|
||||
#if !TYPE_OBJECT
|
||||
/**
|
||||
* A Type-Specific implementation of remove. This implementation iterates over the elements until it finds the element that is searched for or it runs out of elements.
|
||||
|
|
|
@ -378,7 +378,8 @@ public class IMMUTABLE_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_T
|
|||
#endif
|
||||
@Override
|
||||
public KEY_TYPE REMOVE(int index) { throw new UnsupportedOperationException(); }
|
||||
|
||||
@Override
|
||||
public KEY_TYPE swapRemove(int index) { throw new UnsupportedOperationException(); }
|
||||
#if !TYPE_OBJECT
|
||||
@Override
|
||||
public boolean REMOVE_KEY(KEY_TYPE type) { throw new UnsupportedOperationException(); }
|
||||
|
|
|
@ -569,6 +569,66 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public KEY_TYPE swapRemove(int index) {
|
||||
checkRange(index);
|
||||
Entry KEY_GENERIC_TYPE entry = getNode(index);
|
||||
if(entry == null) return EMPTY_KEY_VALUE;
|
||||
if(entry.next == null) return unlinkLast(entry);
|
||||
Entry KEY_GENERIC_TYPE before = entry.prev;
|
||||
KEY_TYPE result = unlink(entry);
|
||||
if(before == null) {
|
||||
Entry KEY_GENERIC_TYPE temp = last;
|
||||
last = temp.prev;
|
||||
last.next = null;
|
||||
temp.next = first;
|
||||
temp.prev = null;
|
||||
first.prev = temp;
|
||||
first = temp;
|
||||
return result;
|
||||
}
|
||||
Entry KEY_GENERIC_TYPE temp = last;
|
||||
last = temp.prev;
|
||||
last.next = null;
|
||||
temp.next = before.next;
|
||||
temp.prev = before;
|
||||
before.next = temp;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean REMOVE_SWAP(KEY_TYPE e) {
|
||||
if(size == 0) return false;
|
||||
for(Entry KEY_GENERIC_TYPE entry = last;entry.prev != null;entry = entry.prev) {
|
||||
if(KEY_EQUALS(entry.value, e)) {
|
||||
if(entry.next == null) {
|
||||
unlinkLast(entry);
|
||||
return true;
|
||||
}
|
||||
Entry KEY_GENERIC_TYPE before = entry.prev;
|
||||
unlink(entry);
|
||||
if(before == null) {
|
||||
Entry KEY_GENERIC_TYPE temp = last;
|
||||
last = temp.prev;
|
||||
last.next = null;
|
||||
temp.next = first;
|
||||
temp.prev = null;
|
||||
first.prev = temp;
|
||||
first = temp;
|
||||
return true;
|
||||
}
|
||||
Entry KEY_GENERIC_TYPE temp = last;
|
||||
last = temp.prev;
|
||||
last.next = null;
|
||||
temp.next = before.next;
|
||||
temp.prev = before;
|
||||
before.next = temp;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#if TYPE_OBJECT
|
||||
@Override
|
||||
public boolean remove(Object e) {
|
||||
|
@ -592,7 +652,8 @@ public class LINKED_LIST KEY_GENERIC_TYPE extends ABSTRACT_LIST KEY_GENERIC_TYPE
|
|||
@Override
|
||||
public KEY_TYPE REMOVE(int index) {
|
||||
checkRange(index);
|
||||
return unlink(getNode(index));
|
||||
Entry KEY_GENERIC_TYPE entry = getNode(index);
|
||||
return entry == null ? EMPTY_KEY_VALUE : unlink(entry);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -226,6 +226,22 @@ public interface LIST KEY_GENERIC_TYPE extends COLLECTION KEY_GENERIC_TYPE, List
|
|||
*/
|
||||
public void removeElements(int from, int to);
|
||||
|
||||
/**
|
||||
* A Highly Optimized remove function that removes the desired element.
|
||||
* But instead of shifting the elements to the left it moves the last element to the removed space.
|
||||
* @param index the index of the element to be removed
|
||||
* @return the element previously at the specified position
|
||||
*/
|
||||
public KEY_TYPE swapRemove(int index);
|
||||
|
||||
/**
|
||||
* A Highly Optimized remove function that removes the desired element.
|
||||
* But instead of shifting the elements to the left it moves the last element to the removed space.
|
||||
* @param e the element that should be removed
|
||||
* @return true if the element was removed
|
||||
*/
|
||||
public boolean REMOVE_SWAP(KEY_TYPE e);
|
||||
|
||||
#if TYPE_OBJECT
|
||||
/**
|
||||
* A function to fast extract elements out of the list, this removes the elements that were fetched.
|
||||
|
|
|
@ -200,6 +200,8 @@ public class LISTS
|
|||
@Override
|
||||
public KEY_TYPE REMOVE(int index) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public KEY_TYPE swapRemove(int index) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public void addElements(int from, KEY_TYPE[] a, int offset, int length) { throw new UnsupportedOperationException(); }
|
||||
@Override
|
||||
public KEY_TYPE[] getElements(int from, KEY_TYPE[] a, int offset, int length) {
|
||||
|
@ -331,6 +333,12 @@ public class LISTS
|
|||
@Override
|
||||
public KEY_TYPE REMOVE(int index) { synchronized(mutex) { return l.REMOVE(index); } }
|
||||
|
||||
@Override
|
||||
public KEY_TYPE swapRemove(int index) { synchronized(mutex) { return l.swapRemove(index); } }
|
||||
|
||||
@Override
|
||||
public boolean REMOVE_SWAP(KEY_TYPE e) { synchronized(mutex) { return l.REMOVE_SWAP(e); } }
|
||||
|
||||
@Override
|
||||
@Primitive
|
||||
public int indexOf(Object e) { synchronized(mutex) { return l.indexOf(e); } }
|
||||
|
@ -444,6 +452,12 @@ public class LISTS
|
|||
@Override
|
||||
public KEY_TYPE REMOVE(int index) { throw new UnsupportedOperationException(); }
|
||||
|
||||
@Override
|
||||
public KEY_TYPE swapRemove(int index) { throw new UnsupportedOperationException(); }
|
||||
|
||||
@Override
|
||||
public boolean REMOVE_SWAP(KEY_TYPE e) { throw new UnsupportedOperationException(); }
|
||||
|
||||
@Override
|
||||
@Primitive
|
||||
public int indexOf(Object e) { return l.indexOf(e); }
|
||||
|
@ -537,6 +551,12 @@ public class LISTS
|
|||
@Override
|
||||
public KEY_TYPE REMOVE(int index) { throw new UnsupportedOperationException(); }
|
||||
|
||||
@Override
|
||||
public KEY_TYPE swapRemove(int index) { throw new UnsupportedOperationException(); }
|
||||
|
||||
@Override
|
||||
public boolean REMOVE_SWAP(KEY_TYPE e) { throw new UnsupportedOperationException(); }
|
||||
|
||||
@Override
|
||||
public int indexOf(Object e) { return -1; }
|
||||
|
||||
|
|
Loading…
Reference in New Issue