summaryrefslogtreecommitdiff
path: root/src/core/dom/Node.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/dom/Node.hpp')
-rw-r--r--src/core/dom/Node.hpp92
1 files changed, 56 insertions, 36 deletions
diff --git a/src/core/dom/Node.hpp b/src/core/dom/Node.hpp
index ce1e7f1..6869253 100644
--- a/src/core/dom/Node.hpp
+++ b/src/core/dom/Node.hpp
@@ -280,19 +280,19 @@ public:
template <class T>
Handle<T> acquire(const BaseHandle<T> &h)
{
- return Handle<T>(h, this);
+ return Handle<T>{h, this};
}
template <class T>
Handle<T> acquire(BaseHandle<T> &&h)
{
- return Handle<T>(h, this);
+ return Handle<T>{h, this};
}
template <class T>
Handle<T> acquire(T *t)
{
- return Handle<T>(t, this);
+ return Handle<T>{t, this};
}
};
@@ -318,6 +318,11 @@ public:
BaseHandle(T *ptr) : ptr(ptr) {}
/**
+ * Returns the underlying pointer.
+ */
+ T *get() const { return ptr; }
+
+ /**
* Provides access to the underlying node.
*/
T *operator->() { return ptr; }
@@ -398,6 +403,25 @@ public:
}
/**
+ * Constructor of the handle class.
+ *
+ * @param ptr is the node the handle should represent.
+ */
+ RootedHandle(T *ptr) : BaseHandle<T>(ptr) { addRef(); }
+
+ /**
+ * Constructor of the handle class.
+ *
+ * @param h is another handle whose Node should be used.
+ */
+ template <class T2>
+ RootedHandle(const BaseHandle<T2> &h)
+ : BaseHandle<T>(h.get())
+ {
+ addRef();
+ }
+
+ /**
* Assignment operator. Assigns the given handle to this handle instance.
* Both handles are indistinguishable after the operation.
*
@@ -454,20 +478,6 @@ public:
}
/**
- * Constructor of the handle class.
- *
- * @param ptr is the node the handle should represent.
- */
- RootedHandle(T *ptr) : BaseHandle<T>(ptr) { addRef(); }
-
- /**
- * Constructor of the handle class.
- *
- * @param h is another handle whose Node should be used.
- */
- RootedHandle(BaseHandle<T> h) : BaseHandle<T>(h.ptr) { addRef(); }
-
- /**
* Destructor of the RootedHandle class, deletes all refrences the class is
* still holding.
*/
@@ -511,7 +521,20 @@ public:
*
* @param h is the handle that should be asigned to this instance.
*/
- Handle(const Handle<T> &h) : BaseHandle<T>(h.ptr), owner(h.owner)
+ Handle(const Handle<T> &h) : BaseHandle<T>(h.get()), owner(h.getOwner())
+ {
+ addRef();
+ }
+
+ /**
+ * Copies the given handle of another derived type to this handle instance.
+ * Both handles are indistinguishable after the operation (except for the
+ * type). Note that especially the handle owner is copied.
+ *
+ * @param h is the handle that should be asigned to this instance.
+ */
+ template<class T2>
+ Handle(const Handle<T2> &h) : BaseHandle<T>(h.get()), owner(h.getOwner())
{
addRef();
}
@@ -521,7 +544,7 @@ public:
*
* @param h is the handle to be moved to this instance.
*/
- Handle(Handle<T> &&h) : BaseHandle<T>(h.ptr), owner(h.owner)
+ Handle(Handle<T> &&h) : BaseHandle<T>(h.get()), owner(h.getOwner())
{
h.ptr = nullptr;
}
@@ -537,7 +560,7 @@ public:
{
deleteRef();
this->ptr = h.ptr;
- this->owner = h.owner;
+ this->owner = h.getOwner();
addRef();
return *this;
}
@@ -552,7 +575,7 @@ public:
{
deleteRef();
this->ptr = h.ptr;
- this->owner = h.owner;
+ this->owner = h.getOwner();
h.ptr = nullptr;
return *this;
}
@@ -573,34 +596,31 @@ public:
* @param owner is the node which owns this handle instance. The ptr node
* is guaranteed to live at least as long as the owner.
*/
- Handle(const BaseHandle<T> &h, Node *owner)
- : BaseHandle<T>(h.ptr), owner(owner)
+ template <class T2>
+ Handle(const BaseHandle<T2> &h, Node *owner)
+ : BaseHandle<T>(h.get()), owner(owner)
{
addRef();
}
/**
- * Constructor of the handle class.
- *
- * @param h is another handle whose Node should be used.
- * @param owner is the node which owns this handle instance. The ptr node
- * is guaranteed to live at least as long as the owner.
- */
- Handle(BaseHandle<T> &&h, Node *owner) : BaseHandle<T>(h.ptr), owner(owner)
- {
- h.ptr = nullptr;
- }
-
- /**
* Destructor of the Handle class, deletes all refrences the class is still
* holding.
*/
~Handle() { deleteRef(); }
+
+ /**
+ * Returns the reference to the owner of the handle.
+ *
+ * @return the handle owner.
+ */
+ Node* getOwner() const {
+ return owner;
+ }
};
using RootedNode = RootedHandle<Node>;
using NodeHandle = Handle<Node>;
-
}
}