/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* This file is part of SableCC. *
* See the file "LICENSE" for copyright information and the *
* terms and conditions for copying, distribution and *
* modification of SableCC. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
package org.sablecc.sablecc;
import java.util.*;
@SuppressWarnings({"rawtypes", "unchecked"})
public class TypedHashMap extends HashMap {
private Cast keyCast;
private Cast valueCast;
private Set entries;
public TypedHashMap() {
super();
keyCast = NoCast.instance;
valueCast = NoCast.instance;
}
public TypedHashMap(int initialCapacity, Cast keyCast, Cast valueCast) {
super(initialCapacity);
this.keyCast = keyCast;
this.valueCast = valueCast;
}
public TypedHashMap(Map map) {
super();
keyCast = NoCast.instance;
valueCast = NoCast.instance;
Map.Entry[] entries = (Map.Entry[]) map.entrySet().toArray(new Map.Entry[0]);
for (int i = 0; i < entries.length; i++) {
this.put(entries[i].getKey(), entries[i].getValue());
}
}
public TypedHashMap(Cast keyCast, Cast valueCast) {
super();
this.keyCast = keyCast;
this.valueCast = valueCast;
}
@Override
public Object clone() {
return new TypedHashMap(this, keyCast, valueCast);
}
public TypedHashMap(Map map, Cast keyCast, Cast valueCast) {
super();
this.keyCast = keyCast;
this.valueCast = valueCast;
Map.Entry[] entries = (Map.Entry[]) map.entrySet().toArray(new Map.Entry[0]);
for (int i = 0; i < entries.length; i++) {
this.put(entries[i].getKey(), entries[i].getValue());
}
}
public Cast getKeyCast() {
return keyCast;
}
public Cast getValueCast() {
return valueCast;
}
@Override
public Set entrySet() {
if (entries == null) {
entries = new EntrySet(super.entrySet());
}
return entries;
}
@Override
public Object put(Object key, Object value) {
return super.put(keyCast.cast(key), valueCast.cast(value));
}
private class EntrySet extends AbstractSet {
private Set set;
EntrySet(Set set
) {
this.set = set
;
}
@Override
public int size() {
return set.size();
}
@Override
public Iterator iterator() {
return new EntryIterator(set.iterator());
}
}
private class EntryIterator implements Iterator {
private Iterator iterator;
EntryIterator(Iterator iterator) {
this.iterator = iterator;
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Object next() {
return new TypedEntry((Map.Entry) iterator.next());
}
@Override
public void remove
() {
iterator.remove();
}
}
private class TypedEntry implements Map.Entry {
private Map.Entry entry;
TypedEntry(Map.Entry entry) {
this.entry = entry;
}
@Override
public Object getKey() {
return entry.getKey();
}
@Override
public Object getValue() {
return entry.getValue();
}
@Override
public Object setValue(Object value) {
return entry.setValue(valueCast.cast(value));
}
}
}