diff options
Diffstat (limited to 'testplugins/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/reftracker/FIFOQueue.java')
-rw-r--r-- | testplugins/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/reftracker/FIFOQueue.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/testplugins/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/reftracker/FIFOQueue.java b/testplugins/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/reftracker/FIFOQueue.java new file mode 100644 index 000000000..e7280bf7c --- /dev/null +++ b/testplugins/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/reftracker/FIFOQueue.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.jdt.ui.leaktest.reftracker; + +import java.util.Arrays; + + +public class FIFOQueue { + + private Object[] fStore; + private int fReadIndex; + private int fWriteIndex; + + public FIFOQueue(int initialSize) { + fStore= new Object[initialSize]; + fReadIndex= 0; + fWriteIndex= 0; + } + + public void add(Object object) { + int pos= fWriteIndex; + int next= nextIndex(pos, fStore.length); + if (next == fReadIndex) { + pos= increaseCapacity(); + next= pos + 1; + } + fStore[pos]= object; + fWriteIndex= next; + } + + private int increaseCapacity() { + Object[] oldStore= fStore; + int oldLen= oldStore.length; + Object[] newStore= new Object[oldLen * 2]; + int k= 0; + for (int i= fReadIndex, end= fWriteIndex; i != end; i= nextIndex(i, oldLen), k++) { + newStore[k]= oldStore[i]; + oldStore[i]= null; + } + fStore= newStore; + fReadIndex= 0; + fWriteIndex= k; + return k; + } + + public Object poll() { + if (isEmpty()) { + return null; + } + int index= fReadIndex; + Object element= fStore[index]; + fStore[index]= null; // avoid unnecessary references + fReadIndex= nextIndex(index, fStore.length); + return element; + } + + private static int nextIndex(int index, int max) { + int next= index + 1; + if (next == max) { + return 0; + } + return next; + } + + public boolean isEmpty() { + return fReadIndex == fWriteIndex; + } + + public int getSize() { + if (fReadIndex <= fWriteIndex) { + return fWriteIndex - fReadIndex; + } else { + return fStore.length - fReadIndex + fWriteIndex; + } + } + + public void clear() { + Arrays.fill(fStore, null); + fReadIndex= 0; + fWriteIndex= 0; + } +} |