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 
14 namespace Eris
15 {
16 
17 EntityRef::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 
32 EntityRef::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 
41 EntityRef::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 
50 EntityRef::EntityRef(EntityRef&& ref) noexcept :
51  sigc::trackable(std::move(ref)), m_inner(ref.m_inner)
52 {
53 }
54 
55 
56 EntityRef& 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 
73 void EntityRef::onEntityDeleted()
74 {
75  auto oldInner = m_inner;
76  m_inner = nullptr;
77  Changed(m_inner, oldInner);
78 }
79 
80 void 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
sigc::signal< void, const std::set< std::string > & > Changed
Definition: Entity.h:304