package in.srain.cube.util;
/**
* A single linked list to wrap <T>
*/
public class HandlerHolder<T> {
private T mHandler;
private HandlerHolder mNext;
private boolean contains(T handler) {
return mHandler != null && mHandler == handler;
}
private HandlerHolder() {
}
public boolean hasHandler() {
return mHandler != null;
}
private T getHandler() {
return mHandler;
}
public static <T> void addHandler(HandlerHolder head, T handler) {
if (null == handler) {
return;
}
if (head == null) {
return;
}
if (null == head.mHandler) {
head.mHandler = handler;
return;
}
HandlerHolder current = head;
for (; ; current = current.mNext) {
// duplicated
if (current.contains(handler)) {
return;
}
if (current.mNext == null) {
break;
}
}
HandlerHolder newHolder = new HandlerHolder();
newHolder.mHandler = handler;
current.mNext = newHolder;
}
public static HandlerHolder create() {
return new HandlerHolder();
}
public static <T> HandlerHolder removeHandler(HandlerHolder head, T handler) {
if (head == null || handler == null || null == head.mHandler) {
return head;
}
HandlerHolder current = head;
HandlerHolder pre = null;
do {
// delete current: link pre to next, unlink next from current;
// pre will no change, current move to next element;
if (current.contains(handler)) {
// current is head
if (pre == null) {
head = current.mNext;
current.mNext = null;
current = head;
} else {
pre.mNext = current.mNext;
current.mNext = null;
current = pre.mNext;
}
} else {
pre = current;
current = current.mNext;
}
} while (current != null);
if (head == null) {
head = new HandlerHolder();
}
return head;
}
}