aboutsummaryrefslogtreecommitdiff
path: root/tests/object.h
diff options
context:
space:
mode:
Diffstat (limited to 'tests/object.h')
-rw-r--r--tests/object.h112
1 files changed, 71 insertions, 41 deletions
diff --git a/tests/object.h b/tests/object.h
index 9235f19c..564dd4a7 100644
--- a/tests/object.h
+++ b/tests/object.h
@@ -1,8 +1,9 @@
#if !defined(__OBJECT_H)
-#define __OBJECT_H
+# define __OBJECT_H
-#include <atomic>
-#include "constructor_stats.h"
+# include "constructor_stats.h"
+
+# include <atomic>
/// Reference counted object base class
class Object {
@@ -27,20 +28,23 @@ public:
*/
void decRef(bool dealloc = true) const {
--m_refCount;
- if (m_refCount == 0 && dealloc)
+ if (m_refCount == 0 && dealloc) {
delete this;
- else if (m_refCount < 0)
+ } else if (m_refCount < 0) {
throw std::runtime_error("Internal error: reference count < 0!");
+ }
}
virtual std::string toString() const = 0;
+
protected:
/** \brief Virtual protected deconstructor.
* (Will only be called by \ref ref)
*/
virtual ~Object() { print_destroyed(this); }
+
private:
- mutable std::atomic<int> m_refCount { 0 };
+ mutable std::atomic<int> m_refCount{0};
};
// Tag class used to track constructions of ref objects. When we track constructors, below, we
@@ -59,80 +63,105 @@ class ref_tag {};
*
* \ingroup libcore
*/
-template <typename T> class ref {
+template <typename T>
+class ref {
public:
/// Create a nullptr reference
- ref() : m_ptr(nullptr) { print_default_created(this); track_default_created((ref_tag*) this); }
+ ref() : m_ptr(nullptr) {
+ print_default_created(this);
+ track_default_created((ref_tag *) this);
+ }
/// Construct a reference from a pointer
- ref(T *ptr) : m_ptr(ptr) {
- if (m_ptr) ((Object *) m_ptr)->incRef();
-
- print_created(this, "from pointer", m_ptr); track_created((ref_tag*) this, "from pointer");
+ explicit ref(T *ptr) : m_ptr(ptr) {
+ if (m_ptr) {
+ ((Object *) m_ptr)->incRef();
+ }
+ print_created(this, "from pointer", m_ptr);
+ track_created((ref_tag *) this, "from pointer");
}
/// Copy constructor
ref(const ref &r) : m_ptr(r.m_ptr) {
- if (m_ptr)
+ if (m_ptr) {
((Object *) m_ptr)->incRef();
+ }
- print_copy_created(this, "with pointer", m_ptr); track_copy_created((ref_tag*) this);
+ print_copy_created(this, "with pointer", m_ptr);
+ track_copy_created((ref_tag *) this);
}
/// Move constructor
- ref(ref &&r) : m_ptr(r.m_ptr) {
+ ref(ref &&r) noexcept : m_ptr(r.m_ptr) {
r.m_ptr = nullptr;
- print_move_created(this, "with pointer", m_ptr); track_move_created((ref_tag*) this);
+ print_move_created(this, "with pointer", m_ptr);
+ track_move_created((ref_tag *) this);
}
/// Destroy this reference
~ref() {
- if (m_ptr)
+ if (m_ptr) {
((Object *) m_ptr)->decRef();
+ }
- print_destroyed(this); track_destroyed((ref_tag*) this);
+ print_destroyed(this);
+ track_destroyed((ref_tag *) this);
}
/// Move another reference into the current one
- ref& operator=(ref&& r) {
- print_move_assigned(this, "pointer", r.m_ptr); track_move_assigned((ref_tag*) this);
+ ref &operator=(ref &&r) noexcept {
+ print_move_assigned(this, "pointer", r.m_ptr);
+ track_move_assigned((ref_tag *) this);
- if (*this == r)
+ if (*this == r) {
return *this;
- if (m_ptr)
+ }
+ if (m_ptr) {
((Object *) m_ptr)->decRef();
+ }
m_ptr = r.m_ptr;
r.m_ptr = nullptr;
return *this;
}
/// Overwrite this reference with another reference
- ref& operator=(const ref& r) {
- print_copy_assigned(this, "pointer", r.m_ptr); track_copy_assigned((ref_tag*) this);
+ ref &operator=(const ref &r) {
+ if (this == &r) {
+ return *this;
+ }
+ print_copy_assigned(this, "pointer", r.m_ptr);
+ track_copy_assigned((ref_tag *) this);
- if (m_ptr == r.m_ptr)
+ if (m_ptr == r.m_ptr) {
return *this;
- if (m_ptr)
+ }
+ if (m_ptr) {
((Object *) m_ptr)->decRef();
+ }
m_ptr = r.m_ptr;
- if (m_ptr)
+ if (m_ptr) {
((Object *) m_ptr)->incRef();
+ }
return *this;
}
/// Overwrite this reference with a pointer to another object
- ref& operator=(T *ptr) {
- print_values(this, "assigned pointer"); track_values((ref_tag*) this, "assigned pointer");
+ ref &operator=(T *ptr) {
+ print_values(this, "assigned pointer");
+ track_values((ref_tag *) this, "assigned pointer");
- if (m_ptr == ptr)
+ if (m_ptr == ptr) {
return *this;
- if (m_ptr)
+ }
+ if (m_ptr) {
((Object *) m_ptr)->decRef();
+ }
m_ptr = ptr;
- if (m_ptr)
+ if (m_ptr) {
((Object *) m_ptr)->incRef();
+ }
return *this;
}
@@ -143,31 +172,32 @@ public:
bool operator!=(const ref &r) const { return m_ptr != r.m_ptr; }
/// Compare this reference with a pointer
- bool operator==(const T* ptr) const { return m_ptr == ptr; }
+ bool operator==(const T *ptr) const { return m_ptr == ptr; }
/// Compare this reference with a pointer
- bool operator!=(const T* ptr) const { return m_ptr != ptr; }
+ bool operator!=(const T *ptr) const { return m_ptr != ptr; }
/// Access the object referenced by this reference
- T* operator->() { return m_ptr; }
+ T *operator->() { return m_ptr; }
/// Access the object referenced by this reference
- const T* operator->() const { return m_ptr; }
+ const T *operator->() const { return m_ptr; }
/// Return a C++ reference to the referenced object
- T& operator*() { return *m_ptr; }
+ T &operator*() { return *m_ptr; }
/// Return a const C++ reference to the referenced object
- const T& operator*() const { return *m_ptr; }
+ const T &operator*() const { return *m_ptr; }
/// Return a pointer to the referenced object
- operator T* () { return m_ptr; }
+ explicit operator T *() { return m_ptr; }
/// Return a const pointer to the referenced object
- T* get_ptr() { return m_ptr; }
+ T *get_ptr() { return m_ptr; }
/// Return a pointer to the referenced object
- const T* get_ptr() const { return m_ptr; }
+ const T *get_ptr() const { return m_ptr; }
+
private:
T *m_ptr;
};