------------------------------------------------
--作者: 何健
--日期: 2019-05-29
--文件: LuaDelegateManager.lua
--模块: LuaDelegateManager
--描述: Lua端委托管理器
------------------------------------------------
local L_DelegateHander = require("Common.CustomLib.LuaDelegateManager.LuaDelegateHander")
local LuaDelegateManager = {
    -- 委托列表
    DelegateList = List:New(),
}

function LuaDelegateManager.Add(delegateClass, delegateName, func, caller)
    local _hander = LuaDelegateManager.FindOrCreate(func, caller)
    if delegateClass[delegateName] == nil then
        delegateClass[delegateName] = _hander.Handler
    else
        delegateClass[delegateName] = delegateClass[delegateName] + _hander.Handler
    end
    return  _hander.Handler
end

function LuaDelegateManager.Remove(delegateClass, delegateName, func, caller)
    local _hander, _index = LuaDelegateManager.Find(func, caller)
    if _hander ~= nil then
        _hander:DecRef()
        if delegateClass[delegateName] ~= nil then
            delegateClass[delegateName] = delegateClass[delegateName] - _hander.Handler
        end
        if _hander.Ref == 0 then
            LuaDelegateManager.DelegateList:RemoveAt(_index)
        end
        return _hander.Handler
    end
end

function LuaDelegateManager.FindOrCreate(func, caller)
    local _hander = nil
    for i = 1, #LuaDelegateManager.DelegateList do
        if LuaDelegateManager.DelegateList[i].Func == func and LuaDelegateManager.DelegateList[i].Caller == caller then
            _hander = LuaDelegateManager.DelegateList[i]
            _hander:IncRef()
        end
    end
    if _hander == nil then 
        _hander = L_DelegateHander:New(func, caller)
        LuaDelegateManager.DelegateList:Add(_hander)
    end
    return _hander
end

function LuaDelegateManager.Find(func, caller)
    for i = 1, #LuaDelegateManager.DelegateList do
        if LuaDelegateManager.DelegateList[i].Func == func and LuaDelegateManager.DelegateList[i].Caller == caller then
            return LuaDelegateManager.DelegateList[i], i
        end
    end
end
return LuaDelegateManager