2016-10-16 12 views
3

Мне нужно знать, что было бы правильным способом реализовать Карты с 64-битными ключами. В них будет не так много элементов, мне просто нужно использовать различные биты ключа для разных вещей с достаточно большим адресным пространством, и мне нужно, чтобы это было очень быстро, поэтому клавиши String, вероятно, были бы слишком медленными. До сих пор я пытался:Haxe - Правильный способ реализации карты с ключами Int64, которые могут быть сериализованы (основная цель)

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 работает, потому что по какой-то причине возвращается к 32-битовому целому в моем коде cpp, и я не знаю, что я делаю неправильно. Как я могу заставить его «остановиться» 64 бит, или я должен сделать это по-другому?

ответ

1

EDIT: Это в настоящее время не работает на родных цели из-за ошибки/текущую реализацию в 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

+0

Вы сказали, что будет небольшое количество ключей, но линейный поиск хорошо для вашего случая использования? Разве не улучшилось бы «haxe.ds.BalancedTree» или пользовательская карта (которая с низкой вероятностью выполняет линейный поиск)? –

+0

@jonasmalacofilho Это, вероятно, было бы, спасибо за предложение. – wildfireheart