// $Id$ /* * WorldEdit * Copyright (C) 2010 sk89q and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.sk89q.worldedit; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.Iterator; import java.util.ListIterator; import java.util.NoSuchElementException; /** * Double array lists to work like a Map, but not really. * * @author sk89q * @param * @param */ public class DoubleArrayList implements Iterable> { /** * First list. */ private List listA = new ArrayList(); /** * 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. * * @param a * @param b */ public void put(A a, B b) { listA.add(a); listB.add(b); } /** * Get size. * @return */ public int size() { return listA.size(); } /** * Clear the list. */ public void clear() { listA.clear(); listB.clear(); } /** * Get an entry set. * * @return */ public Iterator> iterator() { if (isReversed) { return new ReverseEntryIterator>( listA.listIterator(listA.size()), listB.listIterator(listB.size())); } else { return new ForwardEntryIterator>( listA.iterator(), listB.iterator()); } } /** * Entry iterator. * * @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(); } } /** * Entry iterator. * * @param */ public class ReverseEntryIterator> implements Iterator> { private ListIterator keyIterator; private ListIterator valueIterator; public ReverseEntryIterator(ListIterator keyIterator, ListIterator valueIterator) { this.keyIterator = keyIterator; this.valueIterator = valueIterator; } public boolean hasNext() { return keyIterator.hasPrevious(); } public Map.Entry next() throws NoSuchElementException { return new Entry(keyIterator.previous(), valueIterator.previous()); } public void remove() { throw new UnsupportedOperationException(); } } /** * Class to masquerade as Map.Entry. * * @param * @param */ public class Entry implements Map.Entry { private A key; private B value; private Entry(A key, B value) { this.key = key; this.value = value; } public A getKey() { return key; } public B getValue() { return value; } public B setValue(B value) { throw new UnsupportedOperationException(); } } }