mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Adds java.util.AbstractMap, java.util.AbstractSet, java.util.Objects
This commit is contained in:
parent
5c03e7547f
commit
03d5554e76
|
@ -0,0 +1,275 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.io.TSerializable;
|
||||||
|
import org.teavm.classlib.java.lang.TObject;
|
||||||
|
import org.teavm.classlib.java.lang.TUnsupportedOperationException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
*/
|
||||||
|
public abstract class TAbstractMap<K, V> extends TObject implements TMap<K, V> {
|
||||||
|
public static class SimpleEntry<K, V> implements TMap.Entry<K, V>, TSerializable {
|
||||||
|
private K key;
|
||||||
|
private V value;
|
||||||
|
|
||||||
|
public SimpleEntry(K key, V value) {
|
||||||
|
this.key = key;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleEntry(TMap.Entry<? extends K,? extends V> entry) {
|
||||||
|
this(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V setValue(V value) {
|
||||||
|
V old = this.value;
|
||||||
|
this.value = value;
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public K getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (!(obj instanceof TMap.Entry)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TMap.Entry<?, ?> other = (TMap.Entry<?, ?>)obj;
|
||||||
|
if (getKey() == null ? other.getKey() != null : !getKey().equals(other.getKey())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return getValue() == null ? other.getValue() == null : getValue().equals(other.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return (getKey() == null ? 0 : getKey().hashCode()) ^ (getValue() == null ? 0 : getValue().hashCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.valueOf(getKey()) + "=" + String.valueOf(getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class SimpleImmutableEntry<K, V> implements TMap.Entry<K, V>, TSerializable {
|
||||||
|
private K key;
|
||||||
|
private V value;
|
||||||
|
|
||||||
|
public SimpleImmutableEntry(K key, V value) {
|
||||||
|
this.key = key;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleImmutableEntry(TMap.Entry<? extends K,? extends V> entry) {
|
||||||
|
this(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V setValue(V value) {
|
||||||
|
throw new TUnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public K getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (!(obj instanceof TMap.Entry)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TMap.Entry<?, ?> other = (TMap.Entry<?, ?>)obj;
|
||||||
|
if (getKey() == null ? other.getKey() != null : !getKey().equals(other.getKey())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return getValue() == null ? other.getValue() == null : getValue().equals(other.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return (getKey() == null ? 0 : getKey().hashCode()) ^ (getValue() == null ? 0 : getValue().hashCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.valueOf(getKey()) + "=" + String.valueOf(getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private KeySet cachedKeySet;
|
||||||
|
private Values cachedValues;
|
||||||
|
|
||||||
|
protected TAbstractMap() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return entrySet().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return size() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsValue(Object value) {
|
||||||
|
for (TIterator<TMap.Entry<K, V>> iter = entrySet().iterator(); iter.hasNext();) {
|
||||||
|
V knownValue = iter.next().getValue();
|
||||||
|
if (TObjects.equals(value, knownValue)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsKey(Object key) {
|
||||||
|
for (TIterator<TMap.Entry<K, V>> iter = entrySet().iterator(); iter.hasNext();) {
|
||||||
|
K knownKey = iter.next().getKey();
|
||||||
|
if (TObjects.equals(key, knownKey)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V get(Object key) {
|
||||||
|
for (TIterator<TMap.Entry<K, V>> iter = entrySet().iterator(); iter.hasNext();) {
|
||||||
|
TMap.Entry<K, V> entry = iter.next();
|
||||||
|
if (TObjects.equals(key, entry.getKey())) {
|
||||||
|
return entry.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V put(K key, V value) {
|
||||||
|
throw new TUnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void putAll(TMap<? extends K,? extends V> m) {
|
||||||
|
for (TIterator<? extends TMap.Entry<? extends K, ? extends V>> iter = m.entrySet().iterator();
|
||||||
|
iter.hasNext();) {
|
||||||
|
TMap.Entry<? extends K, ? extends V> entry = iter.next();
|
||||||
|
put(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V remove(Object key) {
|
||||||
|
for (TIterator<TMap.Entry<K, V>> iter = entrySet().iterator(); iter.hasNext();) {
|
||||||
|
TMap.Entry<K, V> entry = iter.next();
|
||||||
|
if (TObjects.equals(key, entry.getKey())) {
|
||||||
|
iter.remove();
|
||||||
|
return entry.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract TSet<TMap.Entry<K,V>> entrySet();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear() {
|
||||||
|
entrySet().clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TSet<K> keySet() {
|
||||||
|
if (cachedKeySet == null) {
|
||||||
|
cachedKeySet = new KeySet();
|
||||||
|
}
|
||||||
|
return cachedKeySet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TCollection<V> values() {
|
||||||
|
if (cachedValues == null) {
|
||||||
|
cachedValues = new Values();
|
||||||
|
}
|
||||||
|
return cachedValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class KeySet extends TAbstractSet<K> {
|
||||||
|
@Override
|
||||||
|
public TIterator<K> iterator() {
|
||||||
|
final TIterator<TMap.Entry<K, V>> iter = TAbstractMap.this.entrySet().iterator();
|
||||||
|
return new TIterator<K>() {
|
||||||
|
@Override public boolean hasNext() {
|
||||||
|
return iter.hasNext();
|
||||||
|
}
|
||||||
|
@Override public K next() {
|
||||||
|
return iter.next().getKey();
|
||||||
|
}
|
||||||
|
@Override public void remove() {
|
||||||
|
iter.remove();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return TAbstractMap.this.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Values extends TAbstractCollection<V> {
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return TAbstractMap.this.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TIterator<V> iterator() {
|
||||||
|
final TIterator<TMap.Entry<K, V>> iter = TAbstractMap.this.entrySet().iterator();
|
||||||
|
return new TIterator<V>() {
|
||||||
|
@Override public boolean hasNext() {
|
||||||
|
return iter.hasNext();
|
||||||
|
}
|
||||||
|
@Override public V next() {
|
||||||
|
return iter.next().getValue();
|
||||||
|
}
|
||||||
|
@Override public void remove() {
|
||||||
|
iter.remove();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
*/
|
||||||
|
public abstract class TAbstractSet<E> extends TAbstractCollection<E> implements TSet<E> {
|
||||||
|
public TAbstractSet() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeAll(TCollection<?> c) {
|
||||||
|
boolean modified = false;
|
||||||
|
if (size() < c.size()) {
|
||||||
|
for (TIterator<E> iter = iterator(); iter.hasNext();) {
|
||||||
|
E elem = iter.next();
|
||||||
|
if (c.contains(elem)) {
|
||||||
|
modified = true;
|
||||||
|
iter.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (TIterator<?> iter = c.iterator(); iter.hasNext();) {
|
||||||
|
if (remove(iter.next())) {
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return modified;
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,8 +15,6 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.util;
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
import org.teavm.classlib.java.lang.TObject;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Alexey Andreev <konsoletyper@gmail.com>
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
@ -34,15 +32,15 @@ public interface TMap<K, V> {
|
||||||
|
|
||||||
boolean isEmpty();
|
boolean isEmpty();
|
||||||
|
|
||||||
boolean containsKey(TObject key);
|
boolean containsKey(Object key);
|
||||||
|
|
||||||
boolean containsValue(TObject value);
|
boolean containsValue(Object value);
|
||||||
|
|
||||||
V get(TObject key);
|
V get(Object key);
|
||||||
|
|
||||||
V put(K key, V value);
|
V put(K key, V value);
|
||||||
|
|
||||||
V remove(TObject key);
|
V remove(Object key);
|
||||||
|
|
||||||
void putAll(TMap<? extends K,? extends V> m);
|
void putAll(TMap<? extends K,? extends V> m);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
*/
|
||||||
|
public final class TObjects extends TObject {
|
||||||
|
public static boolean equals(Object a, Object b) {
|
||||||
|
if (a == b) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return a == null ? b == null : a.equals(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int hashCode(Object o) {
|
||||||
|
return o == null ? 0 : o.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toString(Object o) {
|
||||||
|
return toString(o, "null");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toString(Object o, String nullDefault) {
|
||||||
|
return o != null ? o.toString() : nullDefault;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> int compare(T a, T b, TComparator<? super T> c) {
|
||||||
|
return a == null && b == null ? 0 : c.compare(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T requireNonNull(T obj) {
|
||||||
|
return requireNonNull(obj, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T requireNonNull(T obj, String message) {
|
||||||
|
if (obj == null) {
|
||||||
|
throw new NullPointerException(message);
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user