aboutsummaryrefslogtreecommitdiff
path: root/src/lua/common/je_lua_shared.cpp
blob: 076f1763a3d77d0ea9f60c96a79d335f4f2f4df0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "je_lua.h"
#include "je_lua_shared.hpp"

namespace JinEngine
{
    namespace Lua
    {

        SharedBase::SharedBase(lua_State* L, void* obj, const char* t)
            : mCount(0)
            , mObject(obj)
            , mL(L)
            , mType(t)
        {
        }

        SharedBase::~SharedBase()
        {
            clearDependencies();
        }

        void SharedBase::retain()
        {
            ++mCount;
        }

        void SharedBase::release()
        {
            if (--mCount <= 0)
            {
                luax_removereference(mL, this);
                luax_removeobject(mL, this);
                delete this;
            }
        }

        void SharedBase::setDependency(int key, SharedBase* dep)
        {
            removeDependency(key);
            mDependencies.insert(std::pair<int, SharedBase*>(key, dep));
            luax_addreference(mL, this, dep);
        }

        void SharedBase::removeDependency(int key)
        {
            if (!isDependOn(key))
                return;
            DepsMap::iterator it = mDependencies.find(key);
            SharedBase* dep = it->second;
            luax_removereference(mL, this, dep);
            mDependencies.erase(it);
        }

        void SharedBase::removeDependency(SharedBase* dependency)
        {
            for (DepsMap::iterator it = mDependencies.begin(); it != mDependencies.end();)
            {
                SharedBase* dep = it->second;
                if (dep == dependency)
                {
                    luax_removereference(mL, this, dep);
                    mDependencies.erase(it);
                }
                else
                    ++it;
            }
        }

        bool SharedBase::isDependOn(int key)
        {
            return mDependencies.find(key) != mDependencies.end();
        }

        bool SharedBase::isDependOn(SharedBase* shared)
        {
            for (std::pair<int, SharedBase*> dep : mDependencies)
            {
                if (dep.second == shared)
                    return true;
            }
            return false;
        }

        void SharedBase::clearDependencies()
        {
            for (std::pair<int, SharedBase*> dep : mDependencies)
                luax_removereference(mL, this);
            mDependencies.clear();
        }

        SharedBase* SharedBase::getDependency(int key)
        {
            if (!isDependOn(key))
                return nullptr;
            return mDependencies.find(key)->second;
        }

        bool SharedBase::isType(const char* t)
        {
            return strcmp(mType, t) == 0;
        }

        int SharedBase::getDependenciesCount()
        {
            return mDependencies.size();
        }

        const char* SharedBase::getType()
        {
            return mType;
        }

    }
}