home *** CD-ROM | disk | FTP | other *** search
- package COM.objectspace.jgl;
-
- import java.util.Enumeration;
-
- public class Deque implements Sequence {
- DequeIterator myStart = new DequeIterator(this, 0, 0);
- DequeIterator myFinish = new DequeIterator(this, 0, 0);
- int myLength;
- Object[][] myMap;
- static final int BLOCK_SIZE = Allocator.pageSize() / 8;
-
- public Deque() {
- }
-
- public Deque(int var1) {
- this.insert(this.myStart, var1, (Object)null);
- }
-
- public Deque(int var1, Object var2) {
- this.insert(this.myStart, var1, var2);
- }
-
- public Deque(Deque var1) {
- synchronized(var1){}
-
- try {
- InsertIterator var5 = new InsertIterator(this);
- Copying.copy(var1.start(), var1.finish(), var5);
- } catch (Throwable var7) {
- throw var7;
- }
-
- }
-
- public synchronized Object clone() {
- return new Deque(this);
- }
-
- public boolean equals(Object var1) {
- return var1 instanceof Deque && this.equals((Deque)var1);
- }
-
- public synchronized boolean equals(Deque var1) {
- synchronized(var1){}
-
- boolean var2;
- try {
- var2 = this.size() == var1.size() && Comparing.equal(this.start(), this.finish(), var1.start());
- } catch (Throwable var8) {
- throw var8;
- }
-
- return var2;
- }
-
- public synchronized int hashCode() {
- return Hashing.orderedHash(this.start(), this.finish());
- }
-
- public synchronized String toString() {
- return "Deque" + Printing.toString(this.start(), this.finish());
- }
-
- public synchronized void copy(Deque var1) {
- if (this != var1) {
- synchronized(var1){}
-
- try {
- if (this.myLength >= var1.myLength) {
- DequeIterator var4 = (DequeIterator)Copying.copy(var1.myStart, var1.myFinish, this.myStart);
- this.remove(var4, this.myFinish);
- } else {
- DequeIterator var8 = var1.myStart.copy(this.myLength);
- Copying.copy(var1.myStart, var8, this.myStart);
- DequeIterator var5 = var8;
-
- while(!var5.equals(var5.myDeque.myFinish)) {
- this.add(var5.myDeque.myMap[var5.myMapIndex][var5.myBlockIndex]);
- if (++var5.myBlockIndex == BLOCK_SIZE) {
- ++var5.myMapIndex;
- var5.myBlockIndex = 0;
- }
- }
- }
- } catch (Throwable var7) {
- throw var7;
- }
-
- }
- }
-
- public boolean isEmpty() {
- return this.myLength == 0;
- }
-
- public int size() {
- return this.myLength;
- }
-
- public int maxSize() {
- return Integer.MAX_VALUE;
- }
-
- public synchronized Object add(Object var1) {
- if (this.myLength++ == 0) {
- this.createMap();
- this.myMap[this.myFinish.myMapIndex][this.myFinish.myBlockIndex++] = var1;
- } else {
- this.myMap[this.myFinish.myMapIndex][this.myFinish.myBlockIndex++] = var1;
- if (this.myFinish.myBlockIndex == BLOCK_SIZE) {
- if (this.myFinish.myMapIndex == this.myMap.length - 1) {
- this.growMap();
- }
-
- this.myMap[++this.myFinish.myMapIndex] = new Object[BLOCK_SIZE];
- this.myFinish.myBlockIndex = 0;
- }
- }
-
- return null;
- }
-
- public void pushBack(Object var1) {
- this.add(var1);
- }
-
- public synchronized void pushFront(Object var1) {
- if (this.myLength == 0) {
- this.add(var1);
- } else {
- ++this.myLength;
- if (--this.myStart.myBlockIndex < 0) {
- if (this.myStart.myMapIndex == 0) {
- this.growMap();
- }
-
- this.myMap[--this.myStart.myMapIndex] = new Object[BLOCK_SIZE];
- this.myStart.myBlockIndex = BLOCK_SIZE - 1;
- }
-
- this.myMap[this.myStart.myMapIndex][this.myStart.myBlockIndex] = var1;
- }
- }
-
- public synchronized Object popFront() {
- if (this.myLength == 0) {
- throw new InvalidOperationException("Deque is empty");
- } else {
- Object var1 = this.method_0(0);
- if (--this.myLength == 0) {
- this.clear();
- } else {
- var1 = this.myMap[this.myStart.myMapIndex][this.myStart.myBlockIndex];
- this.myMap[this.myStart.myMapIndex][this.myStart.myBlockIndex++] = null;
- if (this.myStart.myBlockIndex == BLOCK_SIZE) {
- this.myMap[this.myStart.myMapIndex++] = null;
- this.myStart.myBlockIndex = 0;
- }
- }
-
- return var1;
- }
- }
-
- public synchronized Object popBack() {
- if (this.myLength == 0) {
- throw new InvalidOperationException("Deque is empty");
- } else {
- Object var1 = this.method_0(0);
- if (--this.myLength == 0) {
- this.clear();
- } else {
- if (this.myFinish.myBlockIndex-- == 0) {
- this.myMap[this.myFinish.myMapIndex--] = null;
- this.myFinish.myBlockIndex = BLOCK_SIZE - 1;
- }
-
- var1 = this.myMap[this.myFinish.myMapIndex][this.myFinish.myBlockIndex];
- this.myMap[this.myFinish.myMapIndex][this.myFinish.myBlockIndex] = null;
- }
-
- return var1;
- }
- }
-
- public synchronized void clear() {
- this.myMap = null;
- this.myStart.myMapIndex = 0;
- this.myStart.myBlockIndex = 0;
- this.myFinish.myMapIndex = 0;
- this.myFinish.myBlockIndex = 0;
- this.myLength = 0;
- }
-
- public synchronized Enumeration elements() {
- return new DequeIterator(this.myStart);
- }
-
- public synchronized DequeIterator begin() {
- return new DequeIterator(this.myStart);
- }
-
- public synchronized DequeIterator end() {
- return new DequeIterator(this.myFinish);
- }
-
- public ForwardIterator start() {
- return this.begin();
- }
-
- public ForwardIterator finish() {
- return this.end();
- }
-
- public synchronized Object front() {
- if (this.myLength == 0) {
- throw new InvalidOperationException("Deque is empty");
- } else {
- return this.myMap[this.myStart.myMapIndex][this.myStart.myBlockIndex];
- }
- }
-
- public synchronized Object back() {
- if (this.myLength == 0) {
- throw new InvalidOperationException("Deque is empty");
- } else {
- return this.myFinish.myBlockIndex > 0 ? this.myMap[this.myFinish.myMapIndex][this.myFinish.myBlockIndex - 1] : this.myMap[this.myFinish.myMapIndex - 1][BLOCK_SIZE - 1];
- }
- }
-
- // $FF: renamed from: at (int) java.lang.Object
- public synchronized Object method_0(int var1) {
- if (var1 >= 0 && var1 < this.myLength) {
- int var2 = this.myStart.myBlockIndex + var1;
- int var3 = this.myStart.myMapIndex;
- if (var2 >= BLOCK_SIZE) {
- int var4 = var2 / BLOCK_SIZE;
- var3 += var4;
- var2 %= BLOCK_SIZE;
- } else if (var2 < 0) {
- int var5 = (BLOCK_SIZE - 1 - var2) / BLOCK_SIZE;
- var3 -= var5;
- var2 += var5 * BLOCK_SIZE;
- }
-
- return this.myMap[var3][var2];
- } else {
- throw new IndexOutOfBoundsException("Attempt to access index " + var1 + " when valid range is 0.." + (this.myLength - 1));
- }
- }
-
- public synchronized void put(int var1, Object var2) {
- if (var1 >= 0 && var1 < this.myLength) {
- int var3 = this.myStart.myBlockIndex + var1;
- int var4 = this.myStart.myMapIndex;
- if (var3 >= BLOCK_SIZE) {
- int var5 = var3 / BLOCK_SIZE;
- var4 += var5;
- var3 %= BLOCK_SIZE;
- } else if (var3 < 0) {
- int var6 = (BLOCK_SIZE - 1 - var3) / BLOCK_SIZE;
- var4 -= var6;
- var3 += var6 * BLOCK_SIZE;
- }
-
- this.myMap[var4][var3] = var2;
- } else {
- throw new IndexOutOfBoundsException("Attempt to access index " + var1 + " when valid range is 0.." + (this.myLength - 1));
- }
- }
-
- public synchronized void swap(Deque var1) {
- synchronized(var1){}
-
- try {
- DequeIterator var4 = this.myStart;
- this.myStart = var1.myStart;
- this.myStart.myDeque = this;
- var1.myStart = var4;
- var1.myStart.myDeque = var1;
- DequeIterator var5 = this.myFinish;
- this.myFinish = var1.myFinish;
- this.myFinish.myDeque = this;
- var1.myFinish = var5;
- var1.myFinish.myDeque = var1;
- int var6 = this.myLength;
- this.myLength = var1.myLength;
- var1.myLength = var6;
- Object[][] var7 = this.myMap;
- this.myMap = var1.myMap;
- var1.myMap = var7;
- } catch (Throwable var9) {
- throw var9;
- }
-
- }
-
- public synchronized Object remove(int var1) {
- if (var1 >= 0 && var1 < this.myLength) {
- return this.remove((Enumeration)this.myStart.copy(var1));
- } else {
- throw new IndexOutOfBoundsException("Attempt to access index " + var1 + " when valid range is 0.." + (this.myLength - 1));
- }
- }
-
- public synchronized Object remove(Enumeration var1) {
- if (!(var1 instanceof DequeIterator)) {
- throw new IllegalArgumentException("Enumeration not a DequeIterator");
- } else if (((DequeIterator)var1).myDeque != this) {
- throw new IllegalArgumentException("Enumeration not for this Deque");
- } else {
- DequeIterator var2 = (DequeIterator)var1;
- Object var3 = var2.myDeque.myMap[var2.myMapIndex][var2.myBlockIndex];
- DequeIterator var4 = var2.copy(1);
- if (this.myStart.distance(var2) < var2.distance(this.myFinish)) {
- Copying.copy(var4, this.myFinish, var2);
- this.popBack();
- } else {
- Copying.copyBackward(this.myStart, var2, var4);
- this.popFront();
- }
-
- return var3;
- }
- }
-
- public synchronized int remove(int var1, int var2) {
- if (var2 < var1) {
- return 0;
- } else {
- this.checkRange(var1, var2);
- return this.remove(this.myStart.copy(var1), this.myStart.copy(var2 + 1));
- }
- }
-
- public synchronized int remove(Enumeration var1, Enumeration var2) {
- if (var1 instanceof DequeIterator && var2 instanceof DequeIterator) {
- if (((DequeIterator)var1).myDeque == this && ((DequeIterator)var2).myDeque == this) {
- DequeIterator var3 = (DequeIterator)var1;
- DequeIterator var4 = (DequeIterator)var2;
- int var5 = var3.distance(var4);
- int var6 = var5;
- if (var4.distance(this.myFinish) > this.myStart.distance(var3)) {
- Copying.copyBackward(this.myStart, var3, var4);
-
- while(var5-- > 0) {
- this.popFront();
- }
- } else {
- Copying.copy(var4, this.myFinish, var3);
-
- while(var5-- > 0) {
- this.popBack();
- }
- }
-
- return var6;
- } else {
- throw new IllegalArgumentException("Enumeration not for this Deque");
- }
- } else {
- throw new IllegalArgumentException("Enumeration not a DequeIterator");
- }
- }
-
- public synchronized DequeIterator insert(int var1, Object var2) {
- if (var1 >= 0 && var1 <= this.myLength) {
- return this.insert(this.myStart.copy(var1), var2);
- } else {
- throw new IndexOutOfBoundsException("Attempt to insert at index " + var1 + " when valid range is 0.." + this.myLength);
- }
- }
-
- public synchronized DequeIterator insert(DequeIterator var1, Object var2) {
- if (var1.equals(this.myStart)) {
- this.pushFront(var2);
- return new DequeIterator(this.myStart);
- } else if (var1.equals(this.myFinish)) {
- this.pushBack(var2);
- return this.myFinish.copy(-1);
- } else {
- int var3 = this.myStart.distance(var1);
- if (var1.distance(this.myFinish) > var3) {
- DequeIterator var6 = this.myStart;
- this.pushFront(var6.myDeque.myMap[var6.myMapIndex][var6.myBlockIndex]);
- Copying.copy(this.myStart.copy(2), this.myStart.copy(var3 + 1), this.myStart.copy(1));
- var6 = this.myStart.copy(var3);
- var6.myDeque.myMap[var6.myMapIndex][var6.myBlockIndex] = var2;
- return var6;
- } else {
- DequeIterator var4 = this.myFinish.copy(-1);
- this.pushBack(var4.myDeque.myMap[var4.myMapIndex][var4.myBlockIndex]);
- DequeIterator var5 = this.myStart.copy(var3);
- Copying.copyBackward(var5, this.myFinish.copy(-2), this.myFinish.copy(-1));
- var5.myDeque.myMap[var5.myMapIndex][var5.myBlockIndex] = var2;
- return var5;
- }
- }
- }
-
- public synchronized void insert(int var1, int var2, Object var3) {
- if (var2 < 0) {
- throw new IllegalArgumentException("Attempt to insert a negative n1umber of objects.");
- } else if (var1 >= 0 && var1 <= this.myLength) {
- this.insert(this.myStart.copy(var1), var2, var3);
- } else {
- throw new IndexOutOfBoundsException("Attempt to insert at index " + var1 + " when valid range is 0.." + this.myLength);
- }
- }
-
- public synchronized void insert(DequeIterator var1, int var2, Object var3) {
- if (var2 < 0) {
- throw new IllegalArgumentException("Attempt to insert a negative number of objects");
- } else if (var2 != 0) {
- int var4 = this.myStart.distance(var1);
- int var5 = var1.distance(this.myFinish);
- if (var5 > var4) {
- if (var2 > var4) {
- int var11 = var2 - var4;
-
- while(var11-- > 0) {
- this.pushFront(var3);
- }
-
- for(int var14 = 1; var14 <= var4; ++var14) {
- this.pushFront(this.method_0(var2 - 1));
- }
-
- Filling.fill(this.myStart.copy(var2), this.myStart.copy(var2 + var4), var3);
- } else {
- for(int var10 = 1; var10 <= var2; ++var10) {
- this.pushFront(this.method_0(var2 - 1));
- }
-
- DequeIterator var13 = this.myStart.copy(var2 + var4);
- Copying.copy(this.myStart.copy(var2 + var2), var13, this.myStart.copy(var2));
- Filling.fill(this.myStart.copy(var4), var13, var3);
- }
- } else {
- int var6 = this.size();
- if (var2 > var5) {
- int var12 = var2 - var5;
-
- while(var12-- > 0) {
- this.pushBack(var3);
- }
-
- for(int var15 = var4; var15 < var6; ++var15) {
- this.pushBack(this.method_0(var15));
- }
-
- Filling.fill(this.myStart.copy(var4), this.myStart.copy(var6), var3);
- } else {
- int var7 = var6 - var2;
-
- for(int var8 = var7; var8 < var6; ++var8) {
- this.pushBack(this.method_0(var8));
- }
-
- DequeIterator var9 = this.myStart.copy(var4);
- Copying.copyBackward(var9, this.myStart.copy(var7), this.myStart.copy(var6));
- Filling.fill(var9, this.myStart.copy(var4 + var2), var3);
- }
- }
- }
- }
-
- public synchronized void insert(int var1, BidirectionalIterator var2, BidirectionalIterator var3) {
- if (var1 >= 0 && var1 <= this.myLength) {
- this.insert(this.myStart.copy(var1), var2, var3);
- } else {
- throw new IndexOutOfBoundsException("Attempt to insert at index " + var1 + " when valid range is 0.." + this.myLength);
- }
- }
-
- public synchronized void insert(DequeIterator var1, BidirectionalIterator var2, BidirectionalIterator var3) {
- int var4 = var2.distance(var3);
- int var5 = this.myStart.distance(var1);
- int var6 = var1.distance(this.myFinish);
- if (var6 > var5) {
- if (var4 > var5) {
- BidirectionalIterator var12 = (BidirectionalIterator)var3.clone();
- var12.retreat(var5);
- BidirectionalIterator var14 = (BidirectionalIterator)var12.clone();
-
- while(!var12.equals(var2)) {
- var12.retreat();
- this.pushFront(var12.get());
- }
-
- for(int var16 = 1; var16 <= var5; ++var16) {
- this.pushFront(this.method_0(var4 - 1));
- }
-
- Copying.copy(var14, var3, this.myStart.copy(var4));
- } else {
- for(int var11 = 1; var11 <= var4; ++var11) {
- this.pushFront(this.method_0(var4 - 1));
- }
-
- Copying.copy(this.myStart.copy(var4 + var4), this.myStart.copy(var4 + var5), this.myStart.copy(var4));
- Copying.copy(var2, var3, this.myStart.copy(var5));
- }
- } else {
- int var7 = this.size();
- if (var4 > var6) {
- BidirectionalIterator var13 = (BidirectionalIterator)var2.clone();
- var13.advance(var6);
- BidirectionalIterator var15 = (BidirectionalIterator)var13.clone();
-
- while(!var13.equals(var3)) {
- this.pushBack(var13.nextElement());
- }
-
- for(int var17 = var5; var17 < var7; ++var17) {
- this.pushBack(this.method_0(var17));
- }
-
- Copying.copy(var2, var15, this.myStart.copy(var5));
- } else {
- int var8 = var7 - var4;
-
- for(int var9 = var8; var9 < var7; ++var9) {
- this.pushBack(this.method_0(var9));
- }
-
- DequeIterator var10 = this.myStart.copy(var5);
- Copying.copyBackward(var10, this.myStart.copy(var8), this.myStart.copy(var7));
- Copying.copy(var2, var3, this.myStart.copy(var5));
- }
- }
- }
-
- public int remove(Object var1) {
- return this.remove(0, this.myLength - 1, var1);
- }
-
- public synchronized int remove(Object var1, int var2) {
- int var3 = 0;
-
- while(var2 > 0) {
- int var4 = this.indexOf(var1);
- if (var4 >= 0) {
- --var2;
- ++var3;
- this.remove(var4);
- }
- }
-
- return var3;
- }
-
- public synchronized int remove(int var1, int var2, Object var3) {
- if (var2 < var1) {
- return 0;
- } else {
- this.checkRange(var1, var2);
- DequeIterator var4 = this.myStart.copy(var1);
- DequeIterator var5 = this.myStart.copy(var2 + 1);
- DequeIterator var6 = (DequeIterator)Removing.remove(var4, var5, var3);
- int var7 = var6.distance(var5);
- this.remove(var6, var5);
- return var7;
- }
- }
-
- public synchronized int replace(Object var1, Object var2) {
- return Replacing.replace(this.start(), this.finish(), var1, var2);
- }
-
- public synchronized int replace(int var1, int var2, Object var3, Object var4) {
- if (var2 < var1) {
- return 0;
- } else {
- this.checkRange(var1, var2);
- return Replacing.replace(this.myStart.copy(var1), this.myStart.copy(var2 + 1), var3, var4);
- }
- }
-
- public synchronized int count(Object var1) {
- return Counting.count(this.start(), this.finish(), var1);
- }
-
- public synchronized int count(int var1, int var2, Object var3) {
- if (var2 < var1) {
- return 0;
- } else {
- this.checkRange(var1, var2);
- return Counting.count(this.myStart.copy(var1), this.myStart.copy(var2 + 1), var3);
- }
- }
-
- public synchronized int indexOf(Object var1) {
- DequeIterator var2 = (DequeIterator)Finding.find(this.myStart, this.myFinish, var1);
- return var2.equals(var2.myDeque.myFinish) ? -1 : this.myStart.distance(var2);
- }
-
- public synchronized int indexOf(int var1, int var2, Object var3) {
- if (var2 < var1) {
- return -1;
- } else {
- this.checkRange(var1, var2);
- DequeIterator var4 = this.myStart.copy(var2 + 1);
- DequeIterator var5 = (DequeIterator)Finding.find(this.myStart.copy(var1), var4, var3);
- return var5.equals(var4) ? -1 : this.myStart.distance(var5);
- }
- }
-
- public boolean contains(Object var1) {
- return this.indexOf(var1) != -1;
- }
-
- private void growMap() {
- int var1 = this.myMap.length * 2;
- Object[][] var2 = new Object[var1][];
- int var3 = var1 / 4;
- int var4 = this.myFinish.myMapIndex - this.myStart.myMapIndex + 1;
- System.arraycopy(this.myMap, this.myStart.myMapIndex, var2, var3, var4);
- this.myFinish.myMapIndex = var3;
- this.myStart.myMapIndex = var3 + var4 - 1;
- this.myMap = var2;
- }
-
- private void createMap() {
- this.myMap = new Object[1024][];
- int var1 = this.myMap.length / 2;
- this.myMap[var1] = new Object[BLOCK_SIZE];
- int var2 = BLOCK_SIZE / 2;
- this.myStart.myBlockIndex = var2;
- this.myStart.myMapIndex = var1;
- this.myFinish.myBlockIndex = var2;
- this.myFinish.myMapIndex = var1;
- }
-
- private void checkRange(int var1, int var2) {
- if (var1 >= 0 && var1 < this.myLength) {
- if (var2 < 0 || var2 >= this.myLength) {
- throw new IndexOutOfBoundsException("Attempt to access index " + var2 + " when valid range is 0.." + (this.myLength - 1));
- }
- } else {
- throw new IndexOutOfBoundsException("Attempt to access index " + var1 + " when valid range is 0.." + (this.myLength - 1));
- }
- }
- }
-