mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-23 19:43:09 +00:00
add sharemap , an example of stm
This commit is contained in:
69
lualib/sharemap.lua
Normal file
69
lualib/sharemap.lua
Normal file
@@ -0,0 +1,69 @@
|
||||
local stm = require "stm"
|
||||
local sprotoloader = require "sprotoloader"
|
||||
local sproto = require "sproto"
|
||||
local setmetatable = setmetatable
|
||||
|
||||
local sharemap = {}
|
||||
|
||||
function sharemap.register(protofile)
|
||||
-- use global slot 0 for type define
|
||||
sprotoloader.register(protofile, 0)
|
||||
end
|
||||
|
||||
local sprotoobj
|
||||
local function loadsp()
|
||||
if sprotoobj == nil then
|
||||
sprotoobj = sprotoloader.load(0)
|
||||
end
|
||||
return sprotoobj
|
||||
end
|
||||
|
||||
function sharemap:commit()
|
||||
self.__obj(sprotoobj:encode(self.__typename, self.__data))
|
||||
end
|
||||
|
||||
function sharemap:copy()
|
||||
return stm.copy(self.__obj)
|
||||
end
|
||||
|
||||
function sharemap.writer(typename, obj)
|
||||
local sp = loadsp()
|
||||
obj = obj or {}
|
||||
local stmobj = stm.new(sp:encode(typename,obj))
|
||||
obj.__typename = typename
|
||||
obj.__obj = stmobj
|
||||
obj.__data = obj
|
||||
obj.commit = sharemap.commit
|
||||
obj.copy = sharemap.copy
|
||||
return setmetatable(obj, { __index = obj.__data, __newindex = obj.__data })
|
||||
end
|
||||
|
||||
local function decode(msg, sz, self)
|
||||
local data = self.__data
|
||||
for k in pairs(data) do
|
||||
data[k] = nil
|
||||
end
|
||||
return sprotoobj:decode(self.__typename, msg, sz, data)
|
||||
end
|
||||
|
||||
function sharemap:update()
|
||||
return self.__obj(decode, self)
|
||||
end
|
||||
|
||||
function sharemap.reader(typename, stmcpy)
|
||||
local sp = loadsp()
|
||||
local stmobj = stm.newcopy(stmcpy)
|
||||
local _, data = stmobj(function(msg, sz)
|
||||
return sp:decode(typename, msg, sz)
|
||||
end)
|
||||
|
||||
local obj = {
|
||||
__typename = typename,
|
||||
__obj = stmobj,
|
||||
__data = data,
|
||||
update = sharemap.update,
|
||||
}
|
||||
return setmetatable(obj, { __index = obj.__data, __newindex = error })
|
||||
end
|
||||
|
||||
return sharemap
|
||||
Reference in New Issue
Block a user