From 2e777532041125b38a25f7ddfa773a690953d8a9 Mon Sep 17 00:00:00 2001 From: sk89q Date: Thu, 2 Dec 2010 09:42:17 -0800 Subject: [PATCH] Fixed the history/queue array lists being iterated in the wrong direction. --- src/EditSession.java | 8 +-- src/com/sk89q/worldedit/DoubleArrayList.java | 57 ++++++++++++++++++-- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/EditSession.java b/src/EditSession.java index b14bbba5a..df99e3bf2 100755 --- a/src/EditSession.java +++ b/src/EditSession.java @@ -49,22 +49,22 @@ public class EditSession { * Stores the original blocks before modification. */ private DoubleArrayList original = - new DoubleArrayList(); + new DoubleArrayList(true); /** * Stores the current blocks. */ private DoubleArrayList current = - new DoubleArrayList(); + new DoubleArrayList(false); /** * Blocks that should be placed before last. */ private DoubleArrayList queueAfter = - new DoubleArrayList(); + new DoubleArrayList(false); /** * Blocks that should be placed last. */ private DoubleArrayList queueLast = - new DoubleArrayList(); + new DoubleArrayList(false); /** * The maximum number of blocks to change at a time. If this number is * exceeded, a MaxChangedBlocksException exception will be diff --git a/src/com/sk89q/worldedit/DoubleArrayList.java b/src/com/sk89q/worldedit/DoubleArrayList.java index 9da3df4e8..afbd0e6e9 100644 --- a/src/com/sk89q/worldedit/DoubleArrayList.java +++ b/src/com/sk89q/worldedit/DoubleArrayList.java @@ -40,6 +40,19 @@ public class DoubleArrayList implements Iterable> { * Second list. */ private List listB = new ArrayList(); + /** + * Is reversed when iterating. + */ + private boolean isReversed = false; + + /** + * Construct the object. + * + * @param isReversed + */ + public DoubleArrayList(boolean isReversed) { + this.isReversed = isReversed; + } /** * Add an item. @@ -74,9 +87,43 @@ public class DoubleArrayList implements Iterable> { * @return */ public Iterator> iterator() { - return new EntryIterator>( - listA.listIterator(listA.size()), - listB.listIterator(listB.size())); + if (isReversed) { + return new ReverseEntryIterator>( + listA.listIterator(listA.size()), + listB.listIterator(listB.size())); + } else { + return new ForwardEntryIterator>( + listA.iterator(), + listB.iterator()); + } + } + + /** + * Entry iterator. + * + * @param + * @param + */ + public class ForwardEntryIterator implements Iterator> { + private Iterator keyIterator; + private Iterator valueIterator; + + public ForwardEntryIterator(Iterator keyIterator, Iterator valueIterator) { + this.keyIterator = keyIterator; + this.valueIterator = valueIterator; + } + + public boolean hasNext() { + return keyIterator.hasNext(); + } + + public Map.Entry next() throws NoSuchElementException { + return new Entry(keyIterator.next(), valueIterator.next()); + } + + public void remove() { + throw new UnsupportedOperationException(); + } } /** @@ -85,11 +132,11 @@ public class DoubleArrayList implements Iterable> { * @param * @param */ - public class EntryIterator implements Iterator> { + public class ReverseEntryIterator implements Iterator> { private ListIterator keyIterator; private ListIterator valueIterator; - public EntryIterator(ListIterator keyIterator, ListIterator valueIterator) { + public ReverseEntryIterator(ListIterator keyIterator, ListIterator valueIterator) { this.keyIterator = keyIterator; this.valueIterator = valueIterator; }