Browse Source

Use static strings for often needed element & attribute names in XML serialization to reduce redundant string object construction and dynamic memory allocation.

Lasse Öörni 14 years ago
parent
commit
ab35cefde9

+ 0 - 1
Engine/IO/FileSystem.cpp

@@ -63,7 +63,6 @@ FileSystem::~FileSystem()
 {
 }
 
-
 bool FileSystem::SetCurrentDir(const String& pathName)
 {
     if (!CheckAccess(pathName))

+ 29 - 22
Engine/Resource/XMLElement.cpp

@@ -29,6 +29,13 @@
 
 #include <pugixml.hpp>
 
+static const String hashStr("hash");
+static const String maxStr("max");
+static const String minStr("min");
+static const String typeStr("type");
+static const String valueStr("value");
+static const String variantStr("variant");
+
 XMLElement::XMLElement() :
     node_(0)
 {
@@ -129,9 +136,9 @@ bool XMLElement::SetBool(const String& name, bool value)
 
 bool XMLElement::SetBoundingBox(const BoundingBox& value)
 {
-    if (!SetVector3("min", value.min_))
+    if (!SetVector3(minStr, value.min_))
         return false;
-    return SetVector3("max", value.max_);
+    return SetVector3(maxStr, value.max_);
 }
 
 bool XMLElement::SetBuffer(const String& name, const void* data, unsigned size)
@@ -195,7 +202,7 @@ bool XMLElement::SetString(const String& name, const String& value)
 
 bool XMLElement::SetVariant(const Variant& value)
 {
-    if (!SetAttribute("type", value.GetTypeName()))
+    if (!SetAttribute(typeStr, value.GetTypeName()))
         return false;
     
     return SetVariantValue(value);
@@ -218,7 +225,7 @@ bool XMLElement::SetVariantValue(const Variant& value)
         return SetVariantMap(value.GetVariantMap());
         
     default:
-        return SetAttribute("value", value.ToString());
+        return SetAttribute(valueStr, value.ToString());
     }
 }
 
@@ -231,7 +238,7 @@ bool XMLElement::SetResourceRef(const ResourceRef& value)
     Context* context = file_->GetContext();
     ResourceCache* cache = file_->GetSubsystem<ResourceCache>();
     
-    SetAttribute("value", String(context->GetTypeName(value.type_)) + ";" + cache->GetResourceName(value.id_));
+    SetAttribute(valueStr, String(context->GetTypeName(value.type_)) + ";" + cache->GetResourceName(value.id_));
     return true;
 }
 
@@ -251,19 +258,19 @@ bool XMLElement::SetResourceRefList(const ResourceRefList& value)
         str += cache->GetResourceName(value.ids_[i]);
     }
     
-    SetAttribute("value", str);
+    SetAttribute(valueStr, str);
     return true;
 }
 
 bool XMLElement::SetVariantVector(const VariantVector& value)
 {
     // Must remove all existing variant child elements (if they exist) to not cause confusion
-    if (!RemoveChildren("variant"))
+    if (!RemoveChildren(variantStr))
         return false;
     
     for (VariantVector::ConstIterator i = value.Begin(); i != value.End(); ++i)
     {
-        XMLElement variantElem = CreateChild("variant");
+        XMLElement variantElem = CreateChild(variantStr);
         if (!variantElem)
             return false;
         variantElem.SetVariant(*i);
@@ -274,15 +281,15 @@ bool XMLElement::SetVariantVector(const VariantVector& value)
 
 bool XMLElement::SetVariantMap(const VariantMap& value)
 {
-    if (!RemoveChildren("variant"))
+    if (!RemoveChildren(variantStr))
         return false;
     
     for (VariantMap::ConstIterator i = value.Begin(); i != value.End(); ++i)
     {
-        XMLElement variantElem = CreateChild("variant");
+        XMLElement variantElem = CreateChild(variantStr);
         if (!variantElem)
             return false;
-        variantElem.SetInt("hash", i->first_.GetValue());
+        variantElem.SetInt(hashStr, i->first_.GetValue());
         variantElem.SetVariant(i->second_);
     }
     
@@ -418,8 +425,8 @@ BoundingBox XMLElement::GetBoundingBox() const
 {
     BoundingBox ret;
     
-    ret.min_ = GetVector3("min");
-    ret.max_ = GetVector3("max");
+    ret.min_ = GetVector3(minStr);
+    ret.max_ = GetVector3(maxStr);
     ret.defined_ = true;
     return ret;
 }
@@ -500,7 +507,7 @@ String XMLElement::GetStringUpper(const String& name) const
 
 Variant XMLElement::GetVariant() const
 {
-    VariantType type = Variant::GetTypeFromName(GetAttribute("type"));  
+    VariantType type = Variant::GetTypeFromName(GetAttribute(typeStr));
     return GetVariantValue(type);
 }
 
@@ -517,7 +524,7 @@ Variant XMLElement::GetVariantValue(VariantType type) const
     else if (type == VAR_VARIANTMAP)
         ret = GetVariantMap();
     else
-        ret.FromString(type, GetAttribute("value"));
+        ret.FromString(type, GetAttribute(valueStr));
     
     return ret;
 }
@@ -526,7 +533,7 @@ ResourceRef XMLElement::GetResourceRef() const
 {
     ResourceRef ret;
     
-    Vector<String> values = GetAttribute("value").Split(';');
+    Vector<String> values = GetAttribute(valueStr).Split(';');
     if (values.Size() == 2)
     {
         ret.type_ = ShortStringHash(values[0]);
@@ -545,7 +552,7 @@ ResourceRefList XMLElement::GetResourceRefList() const
 {
     ResourceRefList ret;
     
-    Vector<String> values = GetAttribute("value").Split(';');
+    Vector<String> values = GetAttribute(valueStr).Split(';');
     if (values.Size() >= 1)
     {
         // Whenever we encounter resource names read from a ResourceRefList XML element, store the reverse mapping to
@@ -569,11 +576,11 @@ VariantVector XMLElement::GetVariantVector() const
 {
     VariantVector ret;
     
-    XMLElement variantElem = GetChild("variant");
+    XMLElement variantElem = GetChild(variantStr);
     while (variantElem)
     {
         ret.Push(variantElem.GetVariant());
-        variantElem = variantElem.GetNext("variant");
+        variantElem = variantElem.GetNext(variantStr);
     }
     
     return ret;
@@ -583,12 +590,12 @@ VariantMap XMLElement::GetVariantMap() const
 {
     VariantMap ret;
     
-    XMLElement variantElem = GetChild("variant");
+    XMLElement variantElem = GetChild(variantStr);
     while (variantElem)
     {
-        ShortStringHash key(variantElem.GetInt("hash"));
+        ShortStringHash key(variantElem.GetInt(hashStr));
         ret[key] = variantElem.GetVariant();
-        variantElem = variantElem.GetNext("variant");
+        variantElem = variantElem.GetNext(variantStr);
     }
     
     return ret;

+ 8 - 5
Engine/Scene/Node.cpp

@@ -34,6 +34,9 @@
 
 // Normalize rotation quaternion after this many incremental updates to prevent distortion
 static const int NORMALIZE_ROTATION_EVERY = 32;
+static const String componentStr("component");
+static const String idStr("id");
+static const String nodeStr("node");
 
 OBJECTTYPESTATIC(Node);
 
@@ -157,7 +160,7 @@ bool Node::LoadXML(const XMLElement& source)
     SceneResolver resolver;
     
     // Read own ID. Will not be applied, only stored for resolving possible references
-    unsigned nodeID = source.GetInt("id");
+    unsigned nodeID = source.GetInt(idStr);
     resolver.AddNode(nodeID, this);
     
     // Read attributes, components and child nodes
@@ -174,7 +177,7 @@ bool Node::LoadXML(const XMLElement& source)
 bool Node::SaveXML(XMLElement& dest)
 {
     // Write node ID
-    if (!dest.SetInt("id", id_))
+    if (!dest.SetInt(idStr, id_))
         return false;
     
     // Write attributes
@@ -185,7 +188,7 @@ bool Node::SaveXML(XMLElement& dest)
     for (unsigned i = 0; i < components_.Size(); ++i)
     {
         Component* component = components_[i];
-        XMLElement compElem = dest.CreateChild("component");
+        XMLElement compElem = dest.CreateChild(componentStr);
         if (!component->SaveXML(compElem))
             return false;
     }
@@ -194,7 +197,7 @@ bool Node::SaveXML(XMLElement& dest)
     for (unsigned i = 0; i < children_.Size(); ++i)
     {
         Node* node = children_[i];
-        XMLElement childElem = dest.CreateChild("node");
+        XMLElement childElem = dest.CreateChild(nodeStr);
         if (!node->SaveXML(childElem))
             return false;
     }
@@ -214,7 +217,7 @@ void Node::ApplyAttributes()
 bool Node::SaveXML(Serializer& dest)
 {
     SharedPtr<XMLFile> xml(new XMLFile(context_));
-    XMLElement rootElem = xml->CreateRoot("node");
+    XMLElement rootElem = xml->CreateRoot(nodeStr);
     if (!SaveXML(rootElem))
         return false;
     

+ 2 - 1
Engine/Scene/Scene.cpp

@@ -39,6 +39,7 @@ static const int ASYNC_LOAD_MAX_MSEC = (int)(1000.0f / ASYNC_LOAD_MIN_FPS);
 static const float DEFAULT_SMOOTHING_CONSTANT = 50.0f;
 static const float DEFAULT_SNAP_THRESHOLD = 1.0f;
 static const String emptyVarName;
+static const String sceneStr("scene");
 
 OBJECTTYPESTATIC(Scene);
 
@@ -177,7 +178,7 @@ bool Scene::SaveXML(Serializer& dest)
     PROFILE(SaveSceneXML);
     
     SharedPtr<XMLFile> xml(new XMLFile(context_));
-    XMLElement rootElem = xml->CreateRoot("scene");
+    XMLElement rootElem = xml->CreateRoot(sceneStr);
     if (!SaveXML(rootElem))
         return false;
     

+ 11 - 7
Engine/Scene/Serializable.cpp

@@ -31,6 +31,10 @@
 
 #include "DebugNew.h"
 
+static const String attributeStr("attribute");
+static const String nameStr("name");
+static const String valueStr("value");
+
 OBJECTTYPESTATIC(Serializable);
 
 Serializable::Serializable(Context* context) :
@@ -262,12 +266,12 @@ bool Serializable::LoadXML(const XMLElement& source)
     
     loading_ = true;
     
-    XMLElement attrElem = source.GetChild("attribute");
+    XMLElement attrElem = source.GetChild(attributeStr);
     unsigned startIndex = 0;
     
     while (attrElem)
     {
-        String name = attrElem.GetString("name");
+        String name = attrElem.GetString(nameStr);
         
         unsigned i = startIndex;
         unsigned attempts = attributes->Size();
@@ -280,7 +284,7 @@ bool Serializable::LoadXML(const XMLElement& source)
                 // If enums specified, do enum lookup and int assignment. Otherwise assign the variant directly
                 if (attr.enumNames_)
                 {
-                    String value = attrElem.GetString("value");
+                    String value = attrElem.GetString(valueStr);
                     const String* enumPtr = attr.enumNames_;
                     int enumValue = 0;
                     bool enumFound = false;
@@ -315,7 +319,7 @@ bool Serializable::LoadXML(const XMLElement& source)
         if (!attempts)
             LOGWARNING("Unknown attribute " + name + " in XML data");
         
-        attrElem = attrElem.GetNext("attribute");
+        attrElem = attrElem.GetNext(attributeStr);
     }
     
     loading_ = false;
@@ -342,14 +346,14 @@ bool Serializable::SaveXML(XMLElement& dest)
         if (!(attr.mode_ & AM_FILE))
             continue;
         
-        XMLElement attrElem = dest.CreateChild("attribute");
-        attrElem.SetString("name", String(attr.name_));
+        XMLElement attrElem = dest.CreateChild(attributeStr);
+        attrElem.SetString(nameStr, String(attr.name_));
         OnGetAttribute(attr, value);
         // If enums specified, set as an enum string. Otherwise set directly as a Variant
         if (attr.enumNames_)
         {
             int enumValue = value.GetInt();
-            attrElem.SetString("value", String(attr.enumNames_[enumValue]));
+            attrElem.SetString(valueStr, String(attr.enumNames_[enumValue]));
         }
         else
             attrElem.SetVariantValue(value);