package com.datdo.mobilib.event; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Vector; class MblWeakArrayList<T> { private List<WeakReference<T>> mData = new Vector<WeakReference<T>>(); public MblWeakArrayList() {} public MblWeakArrayList(MblWeakArrayList<T> other) { mData.clear(); mData.addAll(other.mData); } public void add(T item) { if (item == null) return; synchronized (mData) { if (!__contains(item)) { mData.add(new WeakReference<T>(item)); } } } public void remove(T item) { if (item == null) return; synchronized (mData) { int index = __indexOf(item); if (index >= 0) { mData.remove(index); } } } public boolean contains(T item) { synchronized (mData) { return __contains(item); } } public boolean isEmpty() { synchronized (mData) { __flush(); return mData.isEmpty(); } } public void iterateWithCallback(MblWeakArrayListCallback<T> cb) { if (cb == null) return; synchronized (mData) { __flush(); for (WeakReference<T> ref : mData) { T item = ref.get(); if (item != null) cb.onInterate(item); } } } @Deprecated public Iterator<T> iterate() { return null; // not yet used } public static interface MblWeakArrayListCallback<T> { public void onInterate(T item); } private boolean __contains(T item) { return __indexOf(item) >= 0; } private int __indexOf(T item) { if (item == null) return -1; int i = 0; for (WeakReference<T> anItem : mData) { if (anItem.get() == item) { return i; } i++; } return -1; } private void __flush() { List<WeakReference<T>> needToRemove = new ArrayList<WeakReference<T>>(); for (WeakReference<T> anItem : mData) { if (anItem.get() == null) { needToRemove.add(anItem); } } mData.removeAll(needToRemove); } }