Browse Source

Remove ReferenceCountable from XmlNodeHandler

Michael Ragazzon 6 years ago
parent
commit
ae6f186d45

+ 1 - 7
Include/RmlUi/Core/XMLNodeHandler.h

@@ -45,7 +45,7 @@ class XMLParser;
 	@author Lloyd Weehuizen
  */
 
-class RMLUICORE_API XMLNodeHandler : public ReferenceCountable
+class RMLUICORE_API XMLNodeHandler : public NonCopyMoveable
 {
 public:
 	virtual ~XMLNodeHandler();
@@ -66,12 +66,6 @@ public:
 	/// @param parser The parser executing the parse.
 	/// @param data The element data.
 	virtual bool ElementData(XMLParser* parser, const String& data) = 0;
-
-	/// Called to release the node handler.
-	virtual void Release() = 0;
-
-protected:
-	virtual void OnReferenceDeactivate();
 };
 
 }

+ 4 - 4
Include/RmlUi/Core/XMLParser.h

@@ -56,7 +56,7 @@ public:
 	/// @param[in] tag The tag the custom parser will handle.
 	/// @param[in] handler The custom handler.
 	/// @return The registered XML node handler.
-	static XMLNodeHandler* RegisterNodeHandler(const String& tag, XMLNodeHandler* handler);
+	static XMLNodeHandler* RegisterNodeHandler(const String& tag, SharedPtr<XMLNodeHandler> handler);
 	/// Releases all registered node handlers. This is called internally.
 	static void ReleaseHandlers();
 
@@ -96,11 +96,11 @@ public:
 
 protected:
 	/// Called when the parser finds the beginning of an element tag.
-	virtual void HandleElementStart(const String& name, const XMLAttributes& attributes);
+	void HandleElementStart(const String& name, const XMLAttributes& attributes) override;
 	/// Called when the parser finds the end of an element tag.
-	virtual void HandleElementEnd(const String& name);
+	void HandleElementEnd(const String& name) override;
 	/// Called when the parser encounters data.
-	virtual void HandleData(const String& data);
+	void HandleData(const String& data) override;
 
 private:
 	// The header of the document being parsed.

+ 3 - 19
Source/Controls/Controls.cpp

@@ -46,41 +46,25 @@ namespace Controls {
 void RegisterElementInstancers()
 {
 	Core::Factory::RegisterElementInstancer("form", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementForm >));
-
 	Core::Factory::RegisterElementInstancer("input", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementFormControlInput >));
-
 	Core::Factory::RegisterElementInstancer("dataselect", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementFormControlDataSelect >));
-
 	Core::Factory::RegisterElementInstancer("select", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementFormControlSelect >));
 
 	Core::Factory::RegisterElementInstancer("textarea", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementFormControlTextArea >));
-
 	Core::Factory::RegisterElementInstancer("#selection", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementTextSelection >));
-
 	Core::Factory::RegisterElementInstancer("tabset", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementTabSet >));
 
 	Core::Factory::RegisterElementInstancer("datagrid", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementDataGrid >));
-
 	Core::Factory::RegisterElementInstancer("datagridexpand", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementDataGridExpandButton >));
-
 	Core::Factory::RegisterElementInstancer("#rmlctl_datagridcell", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementDataGridCell >));
-
 	Core::Factory::RegisterElementInstancer("#rmlctl_datagridrow", Core::ElementInstancerPtr(new Core::ElementInstancerGeneric< ElementDataGridRow >));
 }
 
 void RegisterXMLNodeHandlers()
 {
-	Core::XMLNodeHandler* node_handler = new XMLNodeHandlerDataGrid();
-	Core::XMLParser::RegisterNodeHandler("datagrid", node_handler);
-	node_handler->RemoveReference();
-
-	node_handler = new XMLNodeHandlerTabSet();
-	Core::XMLParser::RegisterNodeHandler("tabset", node_handler);
-	node_handler->RemoveReference();
-
-	node_handler = new XMLNodeHandlerTextArea();
-	Core::XMLParser::RegisterNodeHandler("textarea", node_handler);
-	node_handler->RemoveReference();
+	Core::XMLParser::RegisterNodeHandler("datagrid", std::make_shared<XMLNodeHandlerDataGrid>());
+	Core::XMLParser::RegisterNodeHandler("tabset", std::make_shared<XMLNodeHandlerTabSet>());
+	Core::XMLParser::RegisterNodeHandler("textarea", std::make_shared<XMLNodeHandlerTextArea>());
 }
 
 static bool initialised = false;

+ 4 - 4
Source/Core/Factory.cpp

@@ -114,10 +114,10 @@ bool Factory::Initialise()
 	RegisterFontEffectInstancer("outline", std::make_unique<FontEffectOutlineInstancer>());
 
 	// Register the core XML node handlers.
-	XMLParser::RegisterNodeHandler("", new XMLNodeHandlerDefault())->RemoveReference();
-	XMLParser::RegisterNodeHandler("body", new XMLNodeHandlerBody())->RemoveReference();
-	XMLParser::RegisterNodeHandler("head", new XMLNodeHandlerHead())->RemoveReference();
-	XMLParser::RegisterNodeHandler("template", new XMLNodeHandlerTemplate())->RemoveReference();
+	XMLParser::RegisterNodeHandler("", std::make_shared<XMLNodeHandlerDefault>());
+	XMLParser::RegisterNodeHandler("body", std::make_shared<XMLNodeHandlerBody>());
+	XMLParser::RegisterNodeHandler("head", std::make_shared<XMLNodeHandlerHead>());
+	XMLParser::RegisterNodeHandler("template", std::make_shared<XMLNodeHandlerTemplate>());
 
 	return true;
 }

+ 0 - 5
Source/Core/XMLNodeHandler.cpp

@@ -36,10 +36,5 @@ XMLNodeHandler::~XMLNodeHandler()
 {
 }
 
-void XMLNodeHandler::OnReferenceDeactivate()
-{
-	Release();
-}
-
 }
 }

+ 0 - 5
Source/Core/XMLNodeHandlerBody.cpp

@@ -80,10 +80,5 @@ bool XMLNodeHandlerBody::ElementData(XMLParser* parser, const String& data)
 	return Factory::InstanceElementText(parser->GetParseFrame()->element, data);
 }
 
-void XMLNodeHandlerBody::Release()
-{
-	delete this;
-}
-
 }
 }

+ 3 - 5
Source/Core/XMLNodeHandlerBody.h

@@ -47,13 +47,11 @@ public:
 	~XMLNodeHandlerBody();
 
 	/// Called when a new element start is opened
-	virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes);
+	Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) override;
 	/// Called when an element is closed
-	virtual bool ElementEnd(XMLParser* parser, const String& name);
+	bool ElementEnd(XMLParser* parser, const String& name) override;
 	/// Called for element data
-	virtual bool ElementData(XMLParser* parser, const String& data);
-
-	virtual void Release();
+	bool ElementData(XMLParser* parser, const String& data) override;
 };
 
 }

+ 0 - 4
Source/Core/XMLNodeHandlerDefault.cpp

@@ -81,10 +81,6 @@ bool XMLNodeHandlerDefault::ElementData(XMLParser* parser, const String& data)
 	return Factory::InstanceElementText(parent, data);
 }
 
-void XMLNodeHandlerDefault::Release()
-{
-	delete this;
-}
 
 }
 }

+ 3 - 5
Source/Core/XMLNodeHandlerDefault.h

@@ -48,13 +48,11 @@ public:
 	~XMLNodeHandlerDefault();
 	
 	/// Called when a new element start is opened
-	virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes);
+	Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) override;
 	/// Called when an element is closed
-	virtual bool ElementEnd(XMLParser* parser, const String& name);	
+	bool ElementEnd(XMLParser* parser, const String& name) override;	
 	/// Called for element data
-	virtual bool ElementData(XMLParser* parser, const String& data);
-
-	virtual void Release();
+	bool ElementData(XMLParser* parser, const String& data) override;
 };
 
 }

+ 0 - 5
Source/Core/XMLNodeHandlerHead.cpp

@@ -138,10 +138,5 @@ bool XMLNodeHandlerHead::ElementData(XMLParser* parser, const String& data)
 	return true;
 }
 
-void XMLNodeHandlerHead::Release()
-{
-	delete this;
-}
-
 }
 }

+ 3 - 5
Source/Core/XMLNodeHandlerHead.h

@@ -48,13 +48,11 @@ public:
 	~XMLNodeHandlerHead();
 
 	/// Called when a new element start is opened
-	virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes);
+	Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) override;
 	/// Called when an element is closed
-	virtual bool ElementEnd(XMLParser* parser, const String& name);
+	bool ElementEnd(XMLParser* parser, const String& name) override;
 	/// Called for element data
-	virtual bool ElementData(XMLParser* parser, const String& data);
-
-	virtual void Release();
+	bool ElementData(XMLParser* parser, const String& data) override;
 };
 
 }

+ 0 - 5
Source/Core/XMLNodeHandlerTemplate.cpp

@@ -70,10 +70,5 @@ bool XMLNodeHandlerTemplate::ElementData(XMLParser* parser, const String& data)
 	return Factory::InstanceElementText(parser->GetParseFrame()->element, data);
 }
 
-void XMLNodeHandlerTemplate::Release()
-{
-	delete this;
-}
-
 }
 }

+ 4 - 6
Source/Core/XMLNodeHandlerTemplate.h

@@ -44,16 +44,14 @@ class XMLNodeHandlerTemplate : public XMLNodeHandler
 {
 public:
 	XMLNodeHandlerTemplate();
-	virtual ~XMLNodeHandlerTemplate();
+	~XMLNodeHandlerTemplate();
 
 	/// Called when a new element start is opened
-	virtual Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes);
+	Element* ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) override;
 	/// Called when an element is closed
-	virtual bool ElementEnd(XMLParser* parser, const String& name);
+	bool ElementEnd(XMLParser* parser, const String& name) override;
 	/// Called for element data
-	virtual bool ElementData(XMLParser* parser, const String& data);
-
-	virtual void Release();
+	bool ElementData(XMLParser* parser, const String& data) override;
 };
 
 }

+ 14 - 31
Source/Core/XMLParser.cpp

@@ -35,9 +35,9 @@
 namespace Rml {
 namespace Core {
 
-typedef UnorderedMap< String, XMLNodeHandler* > NodeHandlers;
+typedef UnorderedMap< String, SharedPtr<XMLNodeHandler> > NodeHandlers;
 static NodeHandlers node_handlers;
-static XMLNodeHandler* default_node_handler = NULL;
+static SharedPtr<XMLNodeHandler> default_node_handler;
 
 XMLParser::XMLParser(Element* root)
 {
@@ -62,43 +62,26 @@ XMLParser::~XMLParser()
 }
 
 // Registers a custom node handler to be used to a given tag.
-XMLNodeHandler* XMLParser::RegisterNodeHandler(const String& _tag, XMLNodeHandler* handler)
+XMLNodeHandler* XMLParser::RegisterNodeHandler(const String& _tag, SharedPtr<XMLNodeHandler> handler)
 {
 	String tag = ToLower(_tag);
 
 	// Check for a default node registration.
 	if (tag.empty())
 	{
-		if (default_node_handler != NULL)
-			default_node_handler->RemoveReference();
-
-		default_node_handler = handler;
-		default_node_handler->AddReference();
-		return default_node_handler;
+		default_node_handler = std::move(handler);
+		return default_node_handler.get();
 	}
 
-	NodeHandlers::iterator i = node_handlers.find(tag);
-	if (i != node_handlers.end())
-		(*i).second->RemoveReference();
-
-	node_handlers[tag] = handler;
-	handler->AddReference();
-
-	return handler;
+	XMLNodeHandler* result = handler.get();
+	node_handlers[tag] = std::move(handler);
+	return result;
 }
 
 // Releases all registered node handlers. This is called internally.
 void XMLParser::ReleaseHandlers()
 {
-	if (default_node_handler != NULL)
-	{
-		default_node_handler->RemoveReference();
-		default_node_handler = NULL;
-	}
-
-	for (NodeHandlers::iterator i = node_handlers.begin(); i != node_handlers.end(); ++i)
-		(*i).second->RemoveReference();
-
+	default_node_handler.reset();
 	node_handlers.clear();
 }
 
@@ -115,7 +98,7 @@ const URL& XMLParser::GetSourceURL() const
 // Pushes the default element handler onto the parse stack.
 void XMLParser::PushDefaultHandler()
 {
-	active_handler = default_node_handler;
+	active_handler = default_node_handler.get();
 }
 
 bool XMLParser::PushHandler(const String& tag)
@@ -124,7 +107,7 @@ bool XMLParser::PushHandler(const String& tag)
 	if (i == node_handlers.end())
 		return false;
 
-	active_handler = (*i).second;
+	active_handler = i->second.get();
 	return true;
 }
 
@@ -142,12 +125,12 @@ void XMLParser::HandleElementStart(const String& _name, const XMLAttributes& att
 	// Check for a specific handler that will override the child handler.
 	NodeHandlers::iterator itr = node_handlers.find(name);
 	if (itr != node_handlers.end())
-		active_handler = (*itr).second;
+		active_handler = itr->second.get();
 
 	// Store the current active handler, so we can use it through this function (as active handler may change)
 	XMLNodeHandler* node_handler = active_handler;
 
-	Element* element = NULL;
+	Element* element = nullptr;
 
 	// Get the handler to handle the open tag
 	if (node_handler)
@@ -159,7 +142,7 @@ void XMLParser::HandleElementStart(const String& _name, const XMLAttributes& att
 	ParseFrame frame;
 	frame.node_handler = node_handler;
 	frame.child_handler = active_handler;
-	frame.element = element != NULL ? element : stack.top().element;
+	frame.element = (element ? element : stack.top().element);
 	frame.tag = name;
 	stack.push(frame);
 }