object.h
Go to the documentation of this file.
1 #if !defined(__OBJECT_H)
2 #define __OBJECT_H
3 
4 #include <atomic>
5 #include "constructor_stats.h"
6 
8 class Object {
9 public:
12 
14  Object(const Object &) : m_refCount(0) { print_copy_created(this); }
15 
17  int getRefCount() const { return m_refCount; };
18 
20  void incRef() const { ++m_refCount; }
21 
28  void decRef(bool dealloc = true) const {
29  --m_refCount;
30  if (m_refCount == 0 && dealloc)
31  delete this;
32  else if (m_refCount < 0)
33  throw std::runtime_error("Internal error: reference count < 0!");
34  }
35 
36  virtual std::string toString() const = 0;
37 protected:
41  virtual ~Object() { print_destroyed(this); }
42 private:
43  mutable std::atomic<int> m_refCount { 0 };
44 };
45 
46 // Tag class used to track constructions of ref objects. When we track constructors, below, we
47 // track and print out the actual class (e.g. ref<MyObject>), and *also* add a fake tracker for
48 // ref_tag. This lets us check that the total number of ref<Anything> constructors/destructors is
49 // correct without having to check each individual ref<Whatever> type individually.
50 class ref_tag {};
51 
62 template <typename T> class ref {
63 public:
65  ref() : m_ptr(nullptr) { print_default_created(this); track_default_created((ref_tag*) this); }
66 
68  ref(T *ptr) : m_ptr(ptr) {
69  if (m_ptr) ((Object *) m_ptr)->incRef();
70 
71  print_created(this, "from pointer", m_ptr); track_created((ref_tag*) this, "from pointer");
72 
73  }
74 
76  ref(const ref &r) : m_ptr(r.m_ptr) {
77  if (m_ptr)
78  ((Object *) m_ptr)->incRef();
79 
80  print_copy_created(this, "with pointer", m_ptr); track_copy_created((ref_tag*) this);
81  }
82 
84  ref(ref &&r) : m_ptr(r.m_ptr) {
85  r.m_ptr = nullptr;
86 
87  print_move_created(this, "with pointer", m_ptr); track_move_created((ref_tag*) this);
88  }
89 
91  ~ref() {
92  if (m_ptr)
93  ((Object *) m_ptr)->decRef();
94 
95  print_destroyed(this); track_destroyed((ref_tag*) this);
96  }
97 
99  ref& operator=(ref&& r) {
100  print_move_assigned(this, "pointer", r.m_ptr); track_move_assigned((ref_tag*) this);
101 
102  if (*this == r)
103  return *this;
104  if (m_ptr)
105  ((Object *) m_ptr)->decRef();
106  m_ptr = r.m_ptr;
107  r.m_ptr = nullptr;
108  return *this;
109  }
110 
112  ref& operator=(const ref& r) {
113  print_copy_assigned(this, "pointer", r.m_ptr); track_copy_assigned((ref_tag*) this);
114 
115  if (m_ptr == r.m_ptr)
116  return *this;
117  if (m_ptr)
118  ((Object *) m_ptr)->decRef();
119  m_ptr = r.m_ptr;
120  if (m_ptr)
121  ((Object *) m_ptr)->incRef();
122  return *this;
123  }
124 
127  print_values(this, "assigned pointer"); track_values((ref_tag*) this, "assigned pointer");
128 
129  if (m_ptr == ptr)
130  return *this;
131  if (m_ptr)
132  ((Object *) m_ptr)->decRef();
133  m_ptr = ptr;
134  if (m_ptr)
135  ((Object *) m_ptr)->incRef();
136  return *this;
137  }
138 
140  bool operator==(const ref &r) const { return m_ptr == r.m_ptr; }
141 
143  bool operator!=(const ref &r) const { return m_ptr != r.m_ptr; }
144 
146  bool operator==(const T* ptr) const { return m_ptr == ptr; }
147 
149  bool operator!=(const T* ptr) const { return m_ptr != ptr; }
150 
152  T* operator->() { return m_ptr; }
153 
155  const T* operator->() const { return m_ptr; }
156 
158  T& operator*() { return *m_ptr; }
159 
161  const T& operator*() const { return *m_ptr; }
162 
164  operator T* () { return m_ptr; }
165 
167  T* get_ptr() { return m_ptr; }
168 
170  const T* get_ptr() const { return m_ptr; }
171 private:
173 };
174 
175 #endif /* __OBJECT_H */
Reference counted object base class.
Definition: object.h:8
~ref()
Destroy this reference.
Definition: object.h:91
void incRef() const
Increase the object&#39;s reference count by one.
Definition: object.h:20
ref & operator=(const ref &r)
Overwrite this reference with another reference.
Definition: object.h:112
int getRefCount() const
Return the current reference count.
Definition: object.h:17
Definition: object.h:50
void track_copy_assigned(T *, Values &&...values)
bool operator!=(const ref &r) const
Compare this reference with another reference.
Definition: object.h:143
void print_destroyed(T *inst, Values &&...values)
ref & operator=(T *ptr)
Overwrite this reference with a pointer to another object.
Definition: object.h:126
const T * get_ptr() const
Return a pointer to the referenced object.
Definition: object.h:170
void print_copy_assigned(T *inst, Values &&...values)
void print_copy_created(T *inst, Values &&...values)
T & operator*()
Return a C++ reference to the referenced object.
Definition: object.h:158
void track_move_created(T *inst)
bool operator==(const T *ptr) const
Compare this reference with a pointer.
Definition: object.h:146
std::atomic< int > m_refCount
Definition: object.h:43
Object(const Object &)
Copy constructor.
Definition: object.h:14
void print_default_created(T *inst, Values &&...values)
T * operator->()
Access the object referenced by this reference.
Definition: object.h:152
void print_values(T *inst, Values &&...values)
ref()
Create a nullptr reference.
Definition: object.h:65
void print_move_assigned(T *inst, Values &&...values)
bool operator!=(const T *ptr) const
Compare this reference with a pointer.
Definition: object.h:149
float * ptr
T * m_ptr
Definition: object.h:172
const T * operator->() const
Access the object referenced by this reference.
Definition: object.h:155
ref & operator=(ref &&r)
Move another reference into the current one.
Definition: object.h:99
const T & operator*() const
Return a const C++ reference to the referenced object.
Definition: object.h:161
void track_copy_created(T *inst)
void track_destroyed(T *inst)
ref(ref &&r)
Move constructor.
Definition: object.h:84
ref(T *ptr)
Construct a reference from a pointer.
Definition: object.h:68
Object()
Default constructor.
Definition: object.h:11
void track_move_assigned(T *, Values &&...values)
virtual std::string toString() const =0
void decRef(bool dealloc=true) const
Decrease the reference count of the object and possibly deallocate it.
Definition: object.h:28
void print_created(T *inst, Values &&...values)
ref(const ref &r)
Copy constructor.
Definition: object.h:76
bool operator==(const ref &r) const
Compare this reference with another reference.
Definition: object.h:140
virtual ~Object()
Virtual protected deconstructor. (Will only be called by ref)
Definition: object.h:41
void print_move_created(T *inst, Values &&...values)
void track_created(T *inst, Values &&...values)
void track_default_created(T *inst, Values &&...values)
T * get_ptr()
Return a const pointer to the referenced object.
Definition: object.h:167
void track_values(T *, Values &&...values)


gtsam
Author(s):
autogenerated on Sat May 8 2021 02:43:05