From f4490f6918a1b481c535b1b63179edb78382e02e Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 10 Jan 2014 21:27:36 +0100 Subject: db/upnp/Directory: eliminate the "attributes" std::map Look up attributes in the "atts" array. Reduce bloat. --- src/Expat.cxx | 11 +++++++++++ src/Expat.hxx | 10 ++++++++++ src/db/upnp/Directory.cxx | 30 +++++++++++++++++++----------- 3 files changed, 40 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/Expat.cxx b/src/Expat.cxx index 82dce7682..5cee45912 100644 --- a/src/Expat.cxx +++ b/src/Expat.cxx @@ -69,6 +69,17 @@ ExpatParser::Parse(InputStream &is, Error &error) return Parse("", 0, true, error); } +const char * +ExpatParser::GetAttribute(const XML_Char **atts, + const char *name) +{ + for (unsigned i = 0; atts[i] != nullptr; i += 2) + if (strcmp(atts[i], name) == 0) + return atts[i + 1]; + + return nullptr; +} + const char * ExpatParser::GetAttributeCase(const XML_Char **atts, const char *name) diff --git a/src/Expat.hxx b/src/Expat.hxx index 9fcdf61d4..d57a85533 100644 --- a/src/Expat.hxx +++ b/src/Expat.hxx @@ -55,6 +55,10 @@ public: bool Parse(InputStream &is, Error &error); + gcc_pure + static const char *GetAttribute(const XML_Char **atts, + const char *name); + gcc_pure static const char *GetAttributeCase(const XML_Char **atts, const char *name); @@ -85,6 +89,12 @@ public: return parser.Parse(is, error); } + gcc_pure + static const char *GetAttribute(const XML_Char **atts, + const char *name) { + return ExpatParser::GetAttribute(atts, name); + } + gcc_pure static const char *GetAttributeCase(const XML_Char **atts, const char *name) { diff --git a/src/db/upnp/Directory.cxx b/src/db/upnp/Directory.cxx index ed08eb022..fb57cdad7 100644 --- a/src/db/upnp/Directory.cxx +++ b/src/db/upnp/Directory.cxx @@ -24,7 +24,6 @@ #include #include -#include #include @@ -78,17 +77,19 @@ protected: { m_path.push_back(name); - std::map attributes; - for (int i = 0; attrs[i] != 0; i += 2) - attributes[attrs[i]] = attrs[i+1]; - switch (name[0]) { case 'c': if (!strcmp(name, "container")) { m_tobj.clear(); m_tobj.type = UPnPDirObject::Type::CONTAINER; - m_tobj.m_id = attributes["id"]; - m_tobj.m_pid = attributes["parentID"]; + + const char *id = GetAttribute(attrs, "id"); + if (id != nullptr) + m_tobj.m_id = id; + + const char *pid = GetAttribute(attrs, "parentID"); + if (pid != nullptr) + m_tobj.m_pid = pid; } break; @@ -96,8 +97,14 @@ protected: if (!strcmp(name, "item")) { m_tobj.clear(); m_tobj.type = UPnPDirObject::Type::ITEM; - m_tobj.m_id = attributes["id"]; - m_tobj.m_pid = attributes["parentID"]; + + const char *id = GetAttribute(attrs, "id"); + if (id != nullptr) + m_tobj.m_id = id; + + const char *pid = GetAttribute(attrs, "parentID"); + if (pid != nullptr) + m_tobj.m_pid = pid; } break; @@ -108,8 +115,9 @@ protected: // nrAudioChannels="2"> for (auto i = res_attributes; *i != nullptr; ++i) { - const std::string s(*i); - m_tobj.m_props[s] = attributes[s]; + const char *value = GetAttribute(attrs, *i); + if (value != nullptr) + m_tobj.m_props.emplace(*i, value); } } -- cgit v1.2.3