| /* |
| * Copyright 2015 Google Inc. |
| * |
| * 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 java.util; |
| |
| import javaemul.internal.JsUtils; |
| import jsinterop.annotations.JsOverlay; |
| import jsinterop.annotations.JsPackage; |
| import jsinterop.annotations.JsProperty; |
| import jsinterop.annotations.JsType; |
| |
| @JsType(isNative = true, name = "Map", namespace = JsPackage.GLOBAL) |
| interface InternalJsMap<V> { |
| |
| @JsType(isNative = true, name = "IteratorIterable", namespace = JsPackage.GLOBAL) |
| interface Iterator<V> { |
| IteratorEntry<V> next(); |
| } |
| |
| // IteratorEntry<V> is the modeling for IIterableResult<Array<String|V>> as IteratorEntry<V> but |
| // java and jsinterop lack expressibility to represent this abstraction (Java does not have |
| // union types and JsInterop does not allow to map type variables). So IteratorEntry<V> ends up |
| // mapping to IIterableResult<V> which is not an accurate mapping. |
| // It is convenient to model in this way so that users of this internal class don't have to deal |
| // with the internal implementation and the mismatch is handled here with overlay methods. |
| @JsType(isNative = true, name = "IIterableResult", namespace = JsPackage.GLOBAL) |
| interface IteratorEntry<V> { |
| @JsProperty |
| boolean isDone(); |
| @JsProperty(name = "value") |
| Object[] getValueInternal(); |
| @JsOverlay |
| default String getKey() { return JsUtils.uncheckedCast(getValueInternal()[0]); } |
| @JsOverlay |
| default V getValue() { return JsUtils.uncheckedCast(getValueInternal()[1]); } |
| } |
| |
| V get(int key); |
| V get(String key); |
| void set(int key, V value); |
| void set(String key, V value); |
| Iterator<V> entries(); |
| |
| @JsOverlay |
| default void delete(int key) { |
| // Calls delete without map.delete in order to be compatible with old browsers where delete is a |
| // keyword. |
| DeleteFunction fn = JsUtils.getProperty(this, "delete"); |
| fn.call(this, key); |
| } |
| |
| @JsOverlay |
| default void delete(String key) { |
| // Calls delete without map.delete in order to be compatible with old browsers where delete is a |
| // keyword. |
| DeleteFunction fn = JsUtils.getProperty(this, "delete"); |
| fn.call(this, key); |
| } |
| |
| @JsType(isNative = true, name = "Function", namespace = JsPackage.GLOBAL) |
| interface DeleteFunction { |
| void call(InternalJsMap<?> thisArg, String key); |
| void call(InternalJsMap<?> thisArg, int key); |
| } |
| } |