blob: 86b30bed0f8df92868065e9e5bcebe1b2917f27c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004-2008 Akos Horvath, Gergely Varro and Daniel Varro
* 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:
* Akos Horvath, Gergely Varro - initial API and implementation
*******************************************************************************/
package org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.rgg;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.IKeyGenerator;
public class HistoryList<KeyType, ValueType> extends LinkedList<ValueType> {
private static final long serialVersionUID = 4033836249907829630L;
private IKeyGenerator<KeyType, ValueType> keyGenerator;
private Map<KeyType, List<ValueType>> map;
public HistoryList(IKeyGenerator<KeyType, ValueType> keyGenerator) {
this.keyGenerator = keyGenerator;
this.map = new HashMap<KeyType, List<ValueType>>();
}
public List<ValueType> get(KeyType key) {
return map.get(key);
}
public void init() {
clear();
map.clear();
}
public Iterator<ValueType> iterator() {
return new Itr(super.iterator());
}
private class Itr implements Iterator<ValueType> {
private Iterator<ValueType> backingIterator;
private ValueType lastReturned;
private Itr(Iterator<ValueType> i) {
backingIterator = i;
lastReturned = null;
}
public boolean hasNext() {
return backingIterator.hasNext();
}
public ValueType next() {
try {
lastReturned = backingIterator.next();
return lastReturned;
} catch (NoSuchElementException e) {
lastReturned = null;
throw e;
}
}
public void remove() {
if (lastReturned != null) {
KeyType key = keyGenerator.calculateKey(lastReturned);
List<ValueType> list = map.get(key);
if (list == null) {
list = new LinkedList<ValueType>();
}
list.add(lastReturned);
map.put(key, list);
backingIterator.remove();
lastReturned = null;
} else {
throw new IllegalStateException();
}
}
}
}