eris 1.4.0
A WorldForge client library.
EntityRef.cpp
1#ifdef HAVE_CONFIG_H
2 #include "config.h"
3#endif
4
5#include "EntityRef.h"
6#include "Entity.h"
7#include "View.h"
8#include "Log.h"
9
10#include <sigc++/slot.h>
11
12#include <cassert>
13
14namespace Eris
15{
16
17EntityRef::EntityRef(View& v, const std::string& eid) :
18 m_inner(nullptr)
19{
20 if (eid.empty()) return;
21
22 m_inner = v.getEntity(eid);
23 if (m_inner)
24 {
25 m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
26 } else {
27 // retrieve from the server, tell us when that happens
28 v.notifyWhenEntitySeen(eid, sigc::mem_fun(this, &EntityRef::onEntitySeen));
29 }
30}
31
32EntityRef::EntityRef(Entity* e) :
33 m_inner(e)
34{
35 if (m_inner)
36 {
37 m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
38 }
39}
40
41EntityRef::EntityRef(const EntityRef& ref) :
42 sigc::trackable(), m_inner(ref.m_inner)
43{
44 if (m_inner)
45 {
46 m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
47 }
48}
49
50EntityRef::EntityRef(EntityRef&& ref) noexcept :
51 sigc::trackable(std::move(ref)), m_inner(ref.m_inner)
52{
53}
54
55
56EntityRef& EntityRef::operator=(const EntityRef& ref)
57{
58 bool changed = (m_inner != ref.m_inner);
59 auto oldInner = m_inner;
60 m_inner = ref.m_inner;
61
62 if (m_inner)
63 {
64 m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
65 }
66
67 if (changed) {
68 Changed.emit(m_inner, oldInner);
69 }
70 return *this;
71}
72
73void EntityRef::onEntityDeleted()
74{
75 auto oldInner = m_inner;
76 m_inner = nullptr;
77 Changed(m_inner, oldInner);
78}
79
80void EntityRef::onEntitySeen(Entity* e)
81{
82 assert(e);
83 auto oldInner = m_inner;
84 m_inner = e;
85 m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
86 Changed(m_inner, oldInner);
87}
88
89} // of namespace Eris
90
Definition: Account.cpp:33