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

Извините за мой английский, я из Италии.:-/

0 ответов

Другие вопросы по тегам