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
|
#include "je_lua.h"
#include "je_lua_shared.hpp"
namespace JinEngine
{
namespace Lua
{
void SharedBase::retain()
{
++mCount;
}
void SharedBase::release()
{
if (--mCount <= 0)
{
// Remove all objects referenced by object.
luax_removereference(mL, this);
// Remove game object reference.
luax_removeobject(mL, this);
delete this;
}
}
void SharedBase::setDependency(int key, SharedBase* shared)
{
removeDependency(key);
shared->retain();
mDependencies.insert(std::pair<int, SharedBase*>(key, shared));
// Set lua reference.
luax_addreference(mL, this, shared);
}
void SharedBase::removeDependency(int key)
{
if (!isDependOn(key))
return;
std::map<int, SharedBase*>::iterator it = mDependencies.find(key);
SharedBase* dep = it->second;
// Remove lua reference.
luax_removereference(mL, this, dep);
dep->release();
mDependencies.erase(it);
}
void SharedBase::removeDependency(SharedBase* dependency)
{
for (std::map<int, SharedBase*>::iterator it = mDependencies.begin(); it != mDependencies.end();)
{
SharedBase* dep = it->second;
if (dep == dependency)
{
dep->release();
// Remove lua reference.
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)
dep.second->release();
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(type, t) == 0;
}
int SharedBase::getDependencyCount()
{
return mDependencies.size();
}
}
}
|