Haxe - 使用可以序列化的Int64键实现Map的正确方法(本机目标)

时间:2016-10-16 13:54:10

标签: haxe hxcpp

我需要知道,用64位密钥实现Maps的正确方法是什么。其中不会有这么多项目,我只需要使用密钥的各个部分来处理具有足够大地址空间的各种事物,并且我需要它非常快,因此String密钥可能会太慢。到目前为止我试过了:

import haxe.Int64;
import haxe.Unserializer;
import haxe.Serializer;

class Test {
    static function main () {

        var key:Int64 = 1 << 63 | 0x00000001;

        var omap:Map<Int64, String> = new Map<Int64, String>();
        omap.set(key, "test");

        var smap:Map<Int64, String> = Unserializer.run(Serializer.run(omap));

        var key2:Int64 = 1 << 63 | 0x00000001;
        trace(key+" "+smap.get(key2));
    }
}

http://try.haxe.org/#7CDb2

显然不起作用,因为haxe.Int64创建了一个对象实例。使用cpp.Int64有效,因为它由于某种原因在我的cpp代码中回退到32位整数,我不知道我做错了什么。我如何强迫它“保持”64位,或者我应该以其他方式做到这一点?

1 个答案:

答案 0 :(得分:1)

编辑:由于hxcpp中的错误/当前实现,目前这不适用于本机目标:https://github.com/HaxeFoundation/hxcpp/issues/523

我想出了这个变通方法/包装器,它可能不是最有效的解决方案,但似乎有效。

import haxe.Int64;
import haxe.Unserializer;
import haxe.Serializer;

class Test {
    static function main () {

        var key:Int64 = Int64.make(1000,1);

        var omap:Int64Map<String> = new Int64Map();
        omap.set(key, "test");

        var smap:Int64Map<String> = Unserializer.run(Serializer.run(omap));

        var key2:Int64 = Int64.make(1000,1);
        trace(key+" "+smap.get(key2));
    }
}

class Int64Map<V> {

    private var map:Map<Int64,V>;

    public function new() : Void {
        this.map = new Map<Int64,V>();
    }

    public function set(key:Int64, value:V):Void {
        this.map.set(key, value);
    }

    public inline function get(key:Int64):Null<V> {
        var skey:Null<Int64> = getMapKey(key);
        if (skey != null) return this.map.get(skey);
        return null;
    }

    public inline function exists(key:Int64):Bool {
        return (getMapKey(key) != null);
    }

    public function remove( key : Int64 ) : Bool {
        var skey:Null<Int64> = getMapKey(key);
        if (skey != null) return this.map.remove(skey);
        return false;
    }

    public function keys() : Iterator<Int64> {
        return this.map.keys();
    }

    public function toString() : String {
        return this.map.toString();
    }

    public function iterator() : Iterator<V> {
        return this.map.iterator();
    }



    private function getMapKey(key:Int64):Null<Int64> {
        for (ikey in this.map.keys()){
            if (Int64.eq(key, ikey)){
                return ikey;
            }
        }
        return null;
    }

}

http://try.haxe.org/#57686