|
@@ -40,15 +40,16 @@ class Element;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
An element instancer provides a method for allocating
|
|
An element instancer provides a method for allocating
|
|
|
- an deallocating elements.
|
|
|
|
|
-
|
|
|
|
|
- Node handlers are reference counted, so that the same handler
|
|
|
|
|
- can be used for multiple tags.
|
|
|
|
|
|
|
+ and deallocating elements.
|
|
|
|
|
|
|
|
It is important at the same instancer that allocated
|
|
It is important at the same instancer that allocated
|
|
|
the element releases it. This ensures there are no
|
|
the element releases it. This ensures there are no
|
|
|
issues with memory from different DLLs getting mixed up.
|
|
issues with memory from different DLLs getting mixed up.
|
|
|
|
|
|
|
|
|
|
+ The returned element is a unique pointer. When this is
|
|
|
|
|
+ destroyed, it will call ReleaseElement on the instancer
|
|
|
|
|
+ in which it was instanced.
|
|
|
|
|
+
|
|
|
@author Lloyd Weehuizen
|
|
@author Lloyd Weehuizen
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
@@ -61,12 +62,66 @@ public:
|
|
|
/// @param[in] parent The element the new element is destined to be parented to.
|
|
/// @param[in] parent The element the new element is destined to be parented to.
|
|
|
/// @param[in] tag The tag of the element to instance.
|
|
/// @param[in] tag The tag of the element to instance.
|
|
|
/// @param[in] attributes Dictionary of attributes.
|
|
/// @param[in] attributes Dictionary of attributes.
|
|
|
|
|
+ /// @return A unique pointer to the instanced element.
|
|
|
virtual ElementPtr InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) = 0;
|
|
virtual ElementPtr InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) = 0;
|
|
|
/// Releases an element instanced by this instancer.
|
|
/// Releases an element instanced by this instancer.
|
|
|
/// @param[in] element The element to release.
|
|
/// @param[in] element The element to release.
|
|
|
virtual void ReleaseElement(Element* element) = 0;
|
|
virtual void ReleaseElement(Element* element) = 0;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ The element instancer constructs a plain Element, and is used for most elements.
|
|
|
|
|
+ This is a slightly faster version of the generic instancer, making use of a memory
|
|
|
|
|
+ pool for allocations.
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+class RMLUICORE_API ElementInstancerElement : public ElementInstancer
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ ElementPtr InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) override;
|
|
|
|
|
+ void ReleaseElement(Element* element) override;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ The element text default instancer constructs ElementTextDefault.
|
|
|
|
|
+ This is a slightly faster version of the generic instancer, making use of a memory
|
|
|
|
|
+ pool for allocations.
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+class RMLUICORE_API ElementInstancerTextDefault : public ElementInstancer
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ ElementPtr InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) override;
|
|
|
|
|
+ void ReleaseElement(Element* element) override;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ Generic Instancer that creates the provided element type using new and delete. This instancer
|
|
|
|
|
+ is typically used specialized element types.
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+class ElementInstancerGeneric : public ElementInstancer
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ virtual ~ElementInstancerGeneric() {}
|
|
|
|
|
+
|
|
|
|
|
+ ElementPtr InstanceElement(Element* parent, const String& tag, const XMLAttributes& attributes) override
|
|
|
|
|
+ {
|
|
|
|
|
+ RMLUI_ZoneScopedN("ElementGenericInstance");
|
|
|
|
|
+ return ElementPtr(new T(tag));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void ReleaseElement(Element* element) override
|
|
|
|
|
+ {
|
|
|
|
|
+ RMLUI_ZoneScopedN("ElementGenericRelease");
|
|
|
|
|
+ delete element;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|