Haxe — правильный способ реализации карты с ключами Int64, которые можно сериализовать (собственная цель)

Мне нужно знать, как правильно реализовать Карты с 64-битными ключами. В них будет не так много элементов, мне просто нужно использовать разные биты ключа для разных вещей с достаточно большим адресным пространством и мне нужно, чтобы это было очень быстро, поэтому 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-битным, или я должен сделать это как-то иначе?


person wildfireheart    schedule 16.10.2016    source источник


Ответы (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

person wildfireheart    schedule 18.10.2016
comment
Вы сказали, что будет небольшое количество ключей, но подходит ли линейный поиск для вашего варианта использования? Разве haxe.ds.BalancedTree или пользовательская карта (с низкой вероятностью выполнения линейного поиска) не будут работать лучше? - person Jonas Malaco; 26.10.2016
comment
@jonasmalacofilho Скорее всего, спасибо за предложение. - person wildfireheart; 31.10.2016