# MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
#
# Copyright (c) 2014-2021 Megvii Inc. All rights reserved.
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
from typing import Dict

from ..core._imperative_rt import OpDef
from ..core.ops import builtin
from ..version import __version__

OPDEF_PARAM_LOADER = {}


def get_opdef_state(obj: OpDef) -> Dict:
    state = obj.__getstate__()
    state["type"] = type(obj)
    state["version"] = __version__
    return state


def load_opdef_from_state(state: Dict) -> OpDef:
    assert "type" in state and issubclass(state["type"], OpDef)
    assert "version" in state
    opdef_type = state.pop("type")
    if opdef_type in OPDEF_PARAM_LOADER:
        loader = OPDEF_PARAM_LOADER[opdef_type]
        state = loader(state)
    state.pop("version")
    opdef_obj = opdef_type()
    opdef_obj.__setstate__(state)
    return opdef_obj
