package jetbrains.mps.internal.collections.runtime;
/*Generated by MPS */
import java.util.Map;
import java.io.Serializable;
import java.util.Set;
import java.util.Collection;
import java.util.Iterator;
public abstract class AbstractMapSequence<U, V> extends AbstractSequence<IMapping<U, V>> implements IMapSequence<U, V>, Map<U, V>, Serializable {
private static final long serialVersionUID = -1214142666318630447L;
private Map<U, V> map;
protected AbstractMapSequence(Map<U, V> map) {
this.map = map;
}
protected AbstractMapSequence() {
}
@Override
public void clear() {
map.clear();
}
@Override
public boolean containsKey(Object key) {
return map.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return map.containsValue(value);
}
@Override
public Set<Map.Entry<U, V>> entrySet() {
return map.entrySet();
}
@Override
public boolean equals(Object o) {
return map.equals(o);
}
@Override
public V get(Object key) {
return map.get(key);
}
@Override
public int hashCode() {
return map.hashCode();
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public Set<U> keySet() {
return map.keySet();
}
@Override
public V put(U key, V value) {
return map.put(key, value);
}
@Override
public void putAll(Map<? extends U, ? extends V> m) {
map.putAll(m);
}
@Override
public V remove(Object key) {
return map.remove(key);
}
@Override
public int size() {
return map.size();
}
@Override
public Collection<V> values() {
return map.values();
}
@Override
public boolean contains(Object o) {
V v = map.get(((IMapping<U, V>) o).key());
return eq(v, ((IMapping<U, V>) o).value());
}
@Override
public int count() {
return map.size();
}
@Override
public ISequence<IMapping<U, V>> distinct() {
return this;
}
@Override
public boolean isNotEmpty() {
return !((map.isEmpty()));
}
@Override
public Iterator<IMapping<U, V>> iterator() {
return new AbstractMapSequence.MappingIterator();
}
@Override
public IMapSequence<U, V> putAll(IMapSequence<? extends U, ? extends V> map) {
getMap().putAll(map);
return this;
}
@Override
public V removeKey(U u) {
return getMap().remove(u);
}
@Override
public V putValue(U key, V value) {
if (Sequence.IGNORE_NULL_VALUES) {
if (value == null) {
return null;
}
}
getMap().put(key, value);
return value;
}
@Override
public Map<U, V> toMap() {
return this;
}
@SuppressWarnings(value = "unchecked")
@Override
public ISetSequence<IMapping<U, V>> mappingsSet() {
return (ISetSequence<IMapping<U, V>>) new AbstractMapSequence.MappingsSetSequence();
}
protected Map<U, V> getMap() {
return map;
}
private boolean eq(Object a, Object b) {
return (a == b) || (((a != null) ? a.equals(b) : false));
}
private class MappingIterator implements Iterator<IMapping<U, V>> {
private Iterator<Map.Entry<U, V>> entriesIt;
public MappingIterator() {
entriesIt = entrySet().iterator();
}
@Override
public boolean hasNext() {
return entriesIt.hasNext();
}
@Override
public IMapping<U, V> next() {
return new AbstractMapSequence.EntryMapping<U, V>(entriesIt.next());
}
@Override
public void remove() {
entriesIt.remove();
}
}
private static class EntryMapping<F, S> implements IMapping<F, S> {
private final Map.Entry<F, S> entry;
public EntryMapping(Map.Entry<F, S> entry) {
this.entry = entry;
}
@Override
public F key() {
return entry.getKey();
}
@Override
public S value() {
return entry.getValue();
}
@Override
public S value(S newValue) {
return entry.setValue(newValue);
}
@Override
public Map.Entry<F, S> toEntry() {
return entry;
}
@Override
public int hashCode() {
return entry.hashCode();
}
@SuppressWarnings(value = "unchecked")
@Override
public boolean equals(Object that) {
if (that == null) {
return false;
}
if (getClass() == that.getClass()) {
return entry.equals(((AbstractMapSequence.EntryMapping<F, S>) that).entry);
}
if (that instanceof IMapping) {
return eq(key(), ((IMapping) that).key()) && eq(value(), ((IMapping) that).value());
}
return false;
}
@Override
public String toString() {
return key() + "=" + value();
}
private boolean eq(Object a, Object b) {
return (a == b) || (((a != null) ? a.equals(b) : false));
}
}
@SuppressWarnings(value = "unchecked")
private class MappingsSetSequence extends AbstractCollectionSequence<IMapping<U, V>> implements ISetSequence<IMapping<U, V>>, Set<IMapping<U, V>> {
private MappingsSetSequence() {
}
@Override
public IMapping<U, V> addElement(IMapping<U, V> t) {
throw new UnsupportedOperationException();
}
@Override
public ISetSequence<IMapping<U, V>> addSequence(ISequence<? extends IMapping<U, V>> seq) {
throw new UnsupportedOperationException();
}
@Override
public IMapping<U, V> removeElement(IMapping<U, V> t) {
if (map.entrySet().remove(((IMapping<U, V>) t).toEntry())) {
return t;
}
return null;
}
@Override
public ISetSequence<IMapping<U, V>> removeSequence(ISequence<? extends IMapping<U, V>> seq) {
if (Sequence.USE_NULL_SEQUENCE) {
if (seq == null) {
return this;
}
}
for (IMapping<U, V> t : seq.toIterable()) {
map.entrySet().remove(t.toEntry());
}
return this;
}
@Override
public boolean contains(Object o) {
return map.entrySet().contains(((IMapping<U, V>) o).toEntry());
}
@Override
public IMapping<U, V>[] toGenericArray() {
IMapping<U, V>[] result = (IMapping<U, V>[]) ArrayUtils.newArrayInstance(IMapping.class, size());
Iterator<IMapping<U, V>> it = AbstractMapSequence.this.iterator();
for (int i = 0; it.hasNext(); i++) {
result[i] = it.next();
}
return result;
}
@Override
public IMapping<U, V>[] toGenericArray(Class runtimeClass) {
IMapping<U, V>[] arr = (IMapping<U, V>[]) ArrayUtils.newArrayInstance(runtimeClass, size());
return toArray(arr);
}
@Override
public Set toSet() {
return this;
}
@Override
public Iterator iterator() {
return AbstractMapSequence.this.iterator();
}
@Override
public boolean add(IMapping<U, V> o) {
throw new UnsupportedOperationException();
}
@Override
public boolean addAll(Collection c) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
map.entrySet().clear();
}
@Override
public boolean containsAll(Collection c) {
for (Iterator it = c.iterator(); it.hasNext();) {
if (!(map.entrySet().contains((IMapping<U, V>) it.next()))) {
return false;
}
}
return true;
}
@Override
public boolean remove(Object o) {
return map.entrySet().remove((IMapping<U, V>) o);
}
@Override
public boolean removeAll(Collection c) {
boolean modified = false;
for (Iterator it = iterator(); it.hasNext();) {
if (c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}
@Override
public boolean retainAll(Collection c) {
boolean modified = false;
for (Iterator it = iterator(); it.hasNext();) {
if (!(c.contains(it.next()))) {
it.remove();
modified = true;
}
}
return modified;
}
@Override
public int size() {
return map.entrySet().size();
}
@Override
public Object[] toArray() {
return toGenericArray();
}
public IMapping<U, V>[] toArray(IMapping<U, V>[] arr) {
int size = size();
if (arr.length < size) {
arr = (IMapping<U, V>[]) ArrayUtils.newArrayInstance(arr.getClass().getComponentType(), size);
}
Iterator<IMapping<U, V>> it = iterator();
for (int i = 0; i < size; i++) {
arr[i] = it.next();
}
if (arr.length > size) {
arr[size] = null;
}
return arr;
}
@Override
public ISetSequence<IMapping<U, V>> asUnmodifiable() {
throw new UnsupportedOperationException();
}
@Override
public ISetSequence<IMapping<U, V>> asSynchronized() {
throw new UnsupportedOperationException();
}
@Override
protected Collection getCollection() {
return map.entrySet();
}
}
}