summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/xmlreader/span.hxx13
-rw-r--r--include/xmlreader/xmlreader.hxx12
-rw-r--r--xmlreader/source/span.cxx4
-rw-r--r--xmlreader/source/xmlreader.cxx6
4 files changed, 25 insertions, 10 deletions
diff --git a/include/xmlreader/span.hxx b/include/xmlreader/span.hxx
index 038241ef1133..f56059b96274 100644
--- a/include/xmlreader/span.hxx
+++ b/include/xmlreader/span.hxx
@@ -77,6 +77,19 @@ struct SAL_WARN_UNUSED OOO_DLLPUBLIC_XMLREADER Span {
}
rtl::OUString convertFromUtf8() const;
+
+ std::size_t hashCode() const;
+};
+
+}
+
+namespace std {
+
+template<>
+struct hash<::xmlreader::Span>
+{
+ std::size_t operator()(::xmlreader::Span const & s) const
+ { return s.hashCode(); }
};
}
diff --git a/include/xmlreader/xmlreader.hxx b/include/xmlreader/xmlreader.hxx
index a7f7dbb6d1ce..a553baeb6c3a 100644
--- a/include/xmlreader/xmlreader.hxx
+++ b/include/xmlreader/xmlreader.hxx
@@ -77,8 +77,8 @@ private:
// elements_ and attributes_):
struct NamespaceData {
- Span const prefix;
- int const nsId;
+ Span prefix;
+ int nsId;
NamespaceData():
nsId(-1) {}
@@ -90,9 +90,9 @@ private:
typedef std::vector< NamespaceData > NamespaceList;
struct ElementData {
- Span const name;
- NamespaceList::size_type const inheritedNamespaces;
- int const defaultNamespaceId;
+ Span name;
+ NamespaceList::size_type inheritedNamespaces;
+ int defaultNamespaceId;
ElementData(
Span const & theName,
@@ -173,7 +173,7 @@ private:
void * fileAddress_;
NamespaceIris namespaceIris_;
NamespaceList namespaces_;
- mutable std::unordered_map<OUString, int> cacheNSIds_;
+ mutable std::unordered_map<Span, int> cacheNSIds_;
ElementStack elements_;
char const * pos_;
char const * end_;
diff --git a/xmlreader/source/span.cxx b/xmlreader/source/span.cxx
index 29433c561fb7..300c0a2e99b3 100644
--- a/xmlreader/source/span.cxx
+++ b/xmlreader/source/span.cxx
@@ -46,6 +46,10 @@ OUString Span::convertFromUtf8() const {
return OUString(s, SAL_NO_ACQUIRE);
}
+std::size_t Span::hashCode() const {
+ return rtl_str_hashCode_WithLength(begin, length);
+}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlreader/source/xmlreader.cxx b/xmlreader/source/xmlreader.cxx
index 0194f6c695a7..95a27a785b5c 100644
--- a/xmlreader/source/xmlreader.cxx
+++ b/xmlreader/source/xmlreader.cxx
@@ -182,9 +182,7 @@ Span XmlReader::getAttributeValue(bool fullyNormalize) {
}
int XmlReader::getNamespaceId(Span const & prefix) const {
- OUString spanString = prefix.convertFromUtf8();
-
- if (auto it = cacheNSIds_.find(spanString); it != cacheNSIds_.end())
+ if (auto it = cacheNSIds_.find(prefix); it != cacheNSIds_.end())
{
return it->second;
}
@@ -194,7 +192,7 @@ int XmlReader::getNamespaceId(Span const & prefix) const {
if (i != namespaces_.rend())
{
- cacheNSIds_[spanString]= i->nsId;
+ cacheNSIds_[i->prefix]= i->nsId;
return i->nsId;
}