diff --git a/std/jvm/_std/haxe/ds/IntMap.hx b/std/jvm/_std/haxe/ds/IntMap.hx new file mode 100644 index 00000000000..9ae196cb388 --- /dev/null +++ b/std/jvm/_std/haxe/ds/IntMap.hx @@ -0,0 +1,91 @@ +/* + * Copyright (C)2005-2019 Haxe Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +package haxe.ds; + +@:coreApi +class IntMap implements haxe.Constraints.IMap { + var hashMap:java.util.HashMap; + + @:overload + public function new():Void { + hashMap = new java.util.HashMap(); + } + + @:overload + function new(hashMap:java.util.HashMap):Void { + this.hashMap = hashMap; + } + + public function set(key:Int, value:T):Void { + hashMap.put(key, value); + } + + public function get(key:Int):Null { + return hashMap.get(key); + } + + public function exists(key:Int):Bool { + return hashMap.containsKey(key); + } + + public function remove(key:Int):Bool { + var has = exists(key); + hashMap.remove(key); + return has; + } + + public inline function keys():Iterator { + return hashMap.keySet().iterator(); + } + + @:runtime public inline function keyValueIterator():KeyValueIterator { + return new haxe.iterators.MapKeyValueIterator(this); + } + + public inline function iterator():Iterator { + return hashMap.values().iterator(); + } + + public function copy():IntMap { + return new IntMap(hashMap.clone()); + } + + public function toString():String { + var s = new StringBuf(); + s.add("["); + var it = keys(); + for (i in it) { + s.add(Std.string(i)); + s.add(" => "); + s.add(Std.string(get(i))); + if (it.hasNext()) + s.add(", "); + } + s.add("]"); + return s.toString(); + } + + public function clear():Void { + hashMap.clear(); + } +} diff --git a/tests/unit/src/unit/issues/Issue5862.hx b/tests/unit/src/unit/issues/Issue5862.hx index 1ff8e731372..5638da7465f 100644 --- a/tests/unit/src/unit/issues/Issue5862.hx +++ b/tests/unit/src/unit/issues/Issue5862.hx @@ -1,4 +1,5 @@ package unit.issues; + import haxe.ds.*; #if java import java.NativeArray; @@ -7,105 +8,109 @@ import cs.NativeArray; #end class Issue5862 extends Test { -#if (java || cs) - public function test() { - var imap = new IntMap(); - imap.set(0, "val1"); - imap.set(1, "val2"); - imap.set(2, "val3"); - imap.set(2, "changed_val3"); + #if (java || cs) + public function test() { + var imap = new IntMap(); + imap.set(0, "val1"); + imap.set(1, "val2"); + imap.set(2, "val3"); + imap.set(2, "changed_val3"); - var v:Vector = cast @:privateAccess imap.vals; - for (i in 0...v.length) { - t(v[i] != "val3"); - } + #if !jvm + var v:Vector = cast @:privateAccess imap.vals; + for (i in 0...v.length) { + t(v[i] != "val3"); + } + #end - var smap = new StringMap(); - smap.set("v1", "val1"); - smap.set("v2", "val2"); - smap.set("v3", "val3"); - smap.set("v3", "changed_val3"); + var smap = new StringMap(); + smap.set("v1", "val1"); + smap.set("v2", "val2"); + smap.set("v3", "val3"); + smap.set("v3", "changed_val3"); - #if !jvm - var v:Vector = cast @:privateAccess smap.vals; - for (i in 0...v.length) { - t(v[i] != "val3"); - } - #end + #if !jvm + var v:Vector = cast @:privateAccess smap.vals; + for (i in 0...v.length) { + t(v[i] != "val3"); + } + #end - var omap = new ObjectMap<{}, String>(); - omap.set(imap, "val1"); - omap.set(smap, "val2"); - omap.set(omap, "val3"); - omap.set(omap, "changed_val3"); + var omap = new ObjectMap<{}, String>(); + omap.set(imap, "val1"); + omap.set(smap, "val2"); + omap.set(omap, "val3"); + omap.set(omap, "changed_val3"); - var v:Vector = cast @:privateAccess omap.vals; - for (i in 0...v.length) { - t(v[i] != "val3"); - } -#if java - var wmap = new WeakMap<{}, String>(); - wmap.set(imap, "val1"); - wmap.set(smap, "val2"); - wmap.set(omap, "val3"); - wmap.set(omap, "changed_val3"); + var v:Vector = cast @:privateAccess omap.vals; + for (i in 0...v.length) { + t(v[i] != "val3"); + } + #if java + var wmap = new WeakMap<{}, String>(); + wmap.set(imap, "val1"); + wmap.set(smap, "val2"); + wmap.set(omap, "val3"); + wmap.set(omap, "changed_val3"); - var v = @:privateAccess wmap.entries; - for (i in 0...v.length) { - t(v[i] == null || v[i].value != "val3"); - } -#end + var v = @:privateAccess wmap.entries; + for (i in 0...v.length) { + t(v[i] == null || v[i].value != "val3"); + } + #end - var imap = new IntMap(); - imap.set(0, "val1"); - imap.set(1, "val2"); - imap.set(2, "val3"); - imap.set(2, "changed_val3"); - imap.set(1, "changed_val2"); + var imap = new IntMap(); + imap.set(0, "val1"); + imap.set(1, "val2"); + imap.set(2, "val3"); + imap.set(2, "changed_val3"); + imap.set(1, "changed_val2"); - var v:Vector = cast @:privateAccess imap.vals; - for (i in 0...v.length) { - t(v[i] != "val2"); - } + #if !jvm + var v:Vector = cast @:privateAccess imap.vals; + for (i in 0...v.length) { + t(v[i] != "val2"); + } + #end - var smap = new StringMap(); - smap.set("v1", "val1"); - smap.set("v2", "val2"); - smap.set("v3", "val3"); - smap.set("v3", "changed_val3"); - smap.set("v2", "changed_val2"); + var smap = new StringMap(); + smap.set("v1", "val1"); + smap.set("v2", "val2"); + smap.set("v3", "val3"); + smap.set("v3", "changed_val3"); + smap.set("v2", "changed_val2"); - #if !jvm - var v:Vector = cast @:privateAccess smap.vals; - for (i in 0...v.length) { - t(v[i] != "val2"); - } - #end + #if !jvm + var v:Vector = cast @:privateAccess smap.vals; + for (i in 0...v.length) { + t(v[i] != "val2"); + } + #end - var omap = new ObjectMap<{}, String>(); - omap.set(imap, "val1"); - omap.set(smap, "val2"); - omap.set(omap, "val3"); - omap.set(omap, "changed_val3"); - omap.set(smap, "changed_val2"); + var omap = new ObjectMap<{}, String>(); + omap.set(imap, "val1"); + omap.set(smap, "val2"); + omap.set(omap, "val3"); + omap.set(omap, "changed_val3"); + omap.set(smap, "changed_val2"); - var v:Vector = cast @:privateAccess omap.vals; - for (i in 0...v.length) { - t(v[i] != "val2"); - } -#if java - var wmap = new WeakMap<{}, String>(); - wmap.set(imap, "val1"); - wmap.set(smap, "val2"); - wmap.set(omap, "val3"); - wmap.set(omap, "changed_val3"); - wmap.set(smap, "changed_val2"); + var v:Vector = cast @:privateAccess omap.vals; + for (i in 0...v.length) { + t(v[i] != "val2"); + } + #if java + var wmap = new WeakMap<{}, String>(); + wmap.set(imap, "val1"); + wmap.set(smap, "val2"); + wmap.set(omap, "val3"); + wmap.set(omap, "changed_val3"); + wmap.set(smap, "changed_val2"); - var v = @:privateAccess wmap.entries; - for (i in 0...v.length) { - t(v[i] == null || v[i].value != "val2"); - } -#end - } -#end + var v = @:privateAccess wmap.entries; + for (i in 0...v.length) { + t(v[i] == null || v[i].value != "val2"); + } + #end + } + #end }