Lua light userdata
У меня проблема с Луа, и я не знаю, пойду ли я в правильном направлении. В C++ у меня есть словарь, который я использую для передачи параметров в менеджер ресурсов. Этот словарь действительно похож на карту хеша и строки.
В Lua я хочу получить доступ к этим ресурсам, поэтому мне нужно представление хэшей. Также хэши должны быть уникальными, потому что они используются в качестве индекса в таблице. Наша хеш-функция является 64-битной, и я работаю над 32-битной средой (PS3).
C++ У меня есть что-то вроде этого:
paramMap.insert(std::make_pair(hash64("vehicleId"), std::string("004")));
resourceManager.createResource(ResourceType("Car"), paramMap);
В Lua хотят использовать эти ресурсы для создания фабрики для других пользовательских данных. Я делаю такие вещи, как:
function findBike(carId)
bikeParam = { vehicleId = carId }
return ResourceManager.findResource('car', bikeParam)
end
Итак, параметр sometime создается Lua, параметр sometime создается C++. Потому что мой hashkey ('vehicleId')
это индекс таблицы, он должен быть уникальным. Я использовал lightuserdata для реализации uint64_t, но, поскольку я нахожусь в 32-битной среде, я не могу просто сохранить int64
в указателе.:(
Я должен создать таблицу для хранения всех int64
используется программой и сохраняет ссылку в userdata.
void pushUInt64(lua_State *L, GEM::GUInt64 v)
{
Int64Ref::Handle handle = Int64Ref::getInstance().allocateSlot(v);
lua_pushlightuserdata(L, reinterpret_cast<void*>(handle));
luaL_setmetatable(L, s_UInt64LuaName);
}
но userdata никогда не собирает мусор. Тогда мои int64 никогда не будут выпущены, и моя таблица будет расти вечно. Также lightuserdata не сохраняет ссылки на метаданные, поэтому они мешают другим легким userdata. При проверке реализации таблица метаданных добавляется в L->G_->mt_[2]. делая это
a = createLightUserDataType1()
b = createLightUserDataType2()
a:someFunction()
будет использовать метатаблицу b
,
Я думал, что метатабельно, где ограничено печатать. Я довольно смущен, с текущей реализацией у lightuserdata действительно ограниченный вариант использования.
В Python у вас есть хэш- метафункция, которая вызывается каждый раз, когда тип используется в качестве индекса для словаря. Можно ли сделать что-то подобное?
Извините за мой английский, я из Италии.:-/