Преглед изворни кода

Make all code compatible with std containers also.

Michael Ragazzon пре 6 година
родитељ
комит
f4c8e4b095

+ 1 - 1
Include/RmlUi/Core/BaseXMLParser.h

@@ -111,7 +111,7 @@ class RMLUICORE_API BaseXMLParser
 		// The loose data being read.
 		String data;
 
-		std::unordered_set< String > cdata_tags;
+		SmallUnorderedSet< String > cdata_tags;
 };
 
 }

+ 1 - 1
Samples/basic/treeview/src/FileSystem.cpp

@@ -38,7 +38,7 @@
 
 struct FileSystemNode;
 
-typedef std::map< Rml::Core::String, FileSystemNode* > NodeMap;
+typedef Rml::Core::UnorderedMap< Rml::Core::String, FileSystemNode* > NodeMap;
 
 FileSystemNode* file_system_root = nullptr;
 NodeMap node_map;

+ 1 - 2
Samples/invaders/src/EventManager.cpp

@@ -33,7 +33,6 @@
 #include <Shell.h>
 #include "EventHandler.h"
 #include "GameDetails.h"
-#include <map>
 
 // The game's element context (declared in main.cpp).
 extern Rml::Core::Context* context;
@@ -42,7 +41,7 @@ extern Rml::Core::Context* context;
 static EventHandler* event_handler = nullptr;
 
 // The event handlers registered with the manager.
-typedef std::map< Rml::Core::String, EventHandler* > EventHandlerMap;
+typedef Rml::Core::SmallUnorderedMap< Rml::Core::String, EventHandler* > EventHandlerMap;
 EventHandlerMap event_handlers;
 
 EventManager::EventManager()

+ 1 - 1
Source/Controls/DataFormatter.cpp

@@ -31,7 +31,7 @@
 namespace Rml {
 namespace Controls {
 
-typedef std::map< Rml::Core::String, DataFormatter* > DataFormatterMap;
+typedef Core::UnorderedMap< Rml::Core::String, DataFormatter* > DataFormatterMap;
 static DataFormatterMap data_formatters;
 
 DataFormatter::DataFormatter(const Rml::Core::String& _name)

+ 1 - 1
Source/Controls/DataSource.cpp

@@ -39,7 +39,7 @@ const Rml::Core::String DataSource::CHILD_SOURCE("#child_data_source");
 const Rml::Core::String DataSource::DEPTH("#depth");
 const Rml::Core::String DataSource::NUM_CHILDREN("#num_children");
 
-typedef std::map< Rml::Core::String, DataSource* > DataSourceMap;
+typedef Core::UnorderedMap< Rml::Core::String, DataSource* > DataSourceMap;
 static DataSourceMap data_sources;
 
 DataSource::DataSource(const Rml::Core::String& _name)

+ 9 - 6
Source/Core/Lua/ElementAttributesProxy.cpp

@@ -66,15 +66,18 @@ int ElementAttributesProxy__pairs(lua_State* L)
 {
     ElementAttributesProxy* obj = LuaType<ElementAttributesProxy>::check(L,1);
     LUACHECKOBJ(obj);
-    int* pindex = (int*)lua_touserdata(L,3);
-    if((*pindex) == -1) 
-        *pindex = 0;
+    int& pindex = *(int*)lua_touserdata(L,3);
+    if((pindex) == -1) 
+        pindex = 0;
 	const ElementAttributes& attributes = obj->owner->GetAttributes();
 
-    if(*pindex >= 0 && *pindex < (int)attributes.size())
+    if(pindex >= 0 && pindex < (int)attributes.size())
     {
-		const String& key = attributes.container()[*pindex].first;
-		const Variant* value = &attributes.container()[*pindex].second;
+		auto it = attributes.begin();
+		for (int i = 0; i < pindex; ++i)
+			++it;
+		const String& key = it->first;
+		const Variant* value = &it->second;
         lua_pushstring(L,key.c_str());
         PushVariant(L,value);
     }

+ 9 - 6
Source/Core/Lua/EventParametersProxy.cpp

@@ -71,14 +71,17 @@ int EventParametersProxy__pairs(lua_State* L)
 {
     EventParametersProxy* obj = LuaType<EventParametersProxy>::check(L,1);
     LUACHECKOBJ(obj);
-    int* pindex = (int*)lua_touserdata(L,3);
-    if((*pindex) == -1)
-        *pindex = 0;
+    int& pindex = *(int*)lua_touserdata(L,3);
+    if((pindex) == -1)
+        pindex = 0;
 	const Dictionary& attributes = *obj->owner->GetParameters();
-    if(*pindex >= 0 && *pindex < (int)attributes.size())
+    if(pindex >= 0 && pindex < (int)attributes.size())
     {
-		const String& key = attributes.container()[*pindex].first;
-		const Variant* value = &attributes.container()[*pindex].second;
+		auto it = attributes.begin();
+		for (int i = 0; i < pindex; ++i)
+			++it;
+		const String& key = it->first;
+		const Variant* value = &it->second;
         lua_pushstring(L,key.c_str());
         PushVariant(L,value);
     }

+ 0 - 24
Source/Core/StyleSheetNode.cpp

@@ -281,14 +281,6 @@ const PropertyDictionary& StyleSheetNode::GetProperties() const
 	return properties;
 }
 
-// Builds the properties of all of the pseudo-classes of this style sheet node into a single map.
-void StyleSheetNode::GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties) const
-{
-	PseudoClassList pseudo_class_list;
-	for (NodeMap::const_iterator i = children[PSEUDO_CLASS].begin(); i != children[PSEUDO_CLASS].end(); ++i)
-		(*i).second->GetPseudoClassProperties(pseudo_class_properties, pseudo_class_list);
-}
-
 // Adds to a list the names of this node's pseudo-classes which are deemed volatile.
 bool StyleSheetNode::GetVolatilePseudoClasses(PseudoClassList& volatile_pseudo_classes) const
 {
@@ -581,22 +573,6 @@ StyleSheetNode* StyleSheetNode::CreateStructuralChild(const String& child_name)
 	return new StyleSheetNode(child_name, this, child_selector, child_a, child_b);
 }
 
-// Recursively builds up a list of all pseudo-classes branching from a single node.
-void StyleSheetNode::GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties, const PseudoClassList& ancestor_pseudo_classes)
-{
-	PseudoClassList pseudo_classes(ancestor_pseudo_classes);
-	pseudo_classes.insert(name);
-
-	if (properties.GetNumProperties() > 0)
-	{
-		RMLUI_ASSERT(pseudo_class_properties.count(pseudo_classes) == 0);
-		pseudo_class_properties[pseudo_classes] = properties;
-	}
-
-	for (NodeMap::const_iterator i = children[PSEUDO_CLASS].begin(); i != children[PSEUDO_CLASS].end(); ++i)
-		(*i).second->GetPseudoClassProperties(pseudo_class_properties, pseudo_classes);
-}
-
 int StyleSheetNode::CalculateSpecificity()
 {
 	// Calculate the specificity of just this node; tags are worth 10,000, IDs 1,000,000 and other specifiers (classes

+ 0 - 7
Source/Core/StyleSheetNode.h

@@ -38,8 +38,6 @@ namespace Core {
 
 class StyleSheetNodeSelector;
 
-typedef std::map< PseudoClassList, PropertyDictionary > PseudoClassPropertyMap;
-
 /**
 	A style sheet is composed of a tree of nodes.
 
@@ -96,9 +94,6 @@ public:
 	/// Returns the node's default properties.
 	const PropertyDictionary& GetProperties() const;
 
-	/// Merges the properties of all of the pseudo-classes of this style sheet node into a single map.
-	/// @param pseudo_class_properties[out] The dictionary to fill with the pseudo-class properties.
-	void GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties) const;
 	/// Adds to a list the names of this node's pseudo-classes which are deemed volatile; that is, which will
 	/// potentially affect child node's element definition if set or unset.
 	/// @param volatile_pseudo_classes[out] The list of volatile pseudo-classes.
@@ -125,8 +120,6 @@ public:
 private:
 	// Constructs a structural pseudo-class child node.
 	StyleSheetNode* CreateStructuralChild(const String& child_name);
-	// Recursively builds up a list of all pseudo-classes branching from a single node.
-	void GetPseudoClassProperties(PseudoClassPropertyMap& pseudo_class_properties, const PseudoClassList& ancestor_pseudo_classes);
 
 	int CalculateSpecificity();
 

+ 15 - 6
Source/Debugger/ElementInfo.cpp

@@ -499,9 +499,13 @@ void ElementInfo::BuildElementPropertiesRML(Core::String& property_rml, Core::El
 		if (primary_element->GetProperty(property_id) != property)
 			continue;
 
-		NamedPropertyMap::iterator i = property_map.find(property_pseudo_classes);
+		NamedPropertyMap::iterator i = std::find_if(property_map.begin(), property_map.end(),
+			[&property_pseudo_classes](const NamedPropertyPair& pair) { return pair.first == property_pseudo_classes; }
+		);
 		if (i == property_map.end())
-			property_map[property_pseudo_classes] = NamedPropertyList(1, NamedProperty(property_name, property));
+		{
+			property_map.emplace_back(property_pseudo_classes, NamedPropertyList(1, NamedProperty(property_name, property)));
+		}
 		else
 		{
 			// Find a place in this list of properties to insert the new one.
@@ -527,14 +531,19 @@ void ElementInfo::BuildElementPropertiesRML(Core::String& property_rml, Core::El
 		if (element != primary_element)
 			property_rml += Core::CreateString(element->GetTagName().size() + 32, "<h3>inherited from %s</h3>", element->GetTagName().c_str());
 
-		NamedPropertyMap::iterator base_properties = property_map.find(Core::PseudoClassList());
-		if (base_properties != property_map.end())
-			BuildPropertiesRML(property_rml, (*base_properties).second);
+		for (const NamedPropertyPair& pair : property_map)
+		{
+			if (pair.first.empty())
+			{
+				BuildPropertiesRML(property_rml, pair.second);
+				break;
+			}
+		}
 
 		for (NamedPropertyMap::iterator i = property_map.begin(); i != property_map.end(); ++i)
 		{
 			// Skip the base property list, we've already printed it.
-			if (i == base_properties)
+			if (i->first.empty())
 				continue;
 
 			// Print the pseudo-class header.

+ 2 - 1
Source/Debugger/ElementInfo.h

@@ -37,7 +37,8 @@ namespace Debugger {
 
 typedef std::pair< Core::String, const Core::Property* > NamedProperty;
 typedef std::vector< NamedProperty > NamedPropertyList;
-typedef std::map< Core::PseudoClassList, NamedPropertyList > NamedPropertyMap;
+typedef std::pair<Core::PseudoClassList, NamedPropertyList> NamedPropertyPair;
+typedef std::vector< NamedPropertyPair > NamedPropertyMap;
 
 /**
 	@author Robert Curry