From 869700d839a1695fe00734592bd504d59386e4b9 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Fri, 8 Jan 2016 01:27:01 +0100 Subject: pkgCacheGenerator::StoreString: Get rid of std::string Instead of storing a string -> map_stringitem_t mapping, create our own data type that can point to either a normal string or a string inside the cache. This avoids the creation of any string and improves performance slightly (about 4%). --- apt-pkg/pkgcachegen.h | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'apt-pkg/pkgcachegen.h') diff --git a/apt-pkg/pkgcachegen.h b/apt-pkg/pkgcachegen.h index e4760d44d..d83ea6a25 100644 --- a/apt-pkg/pkgcachegen.h +++ b/apt-pkg/pkgcachegen.h @@ -27,7 +27,7 @@ #include #include #if __cplusplus >= 201103L -#include +#include #endif #ifdef APT_PKG_EXPOSE_STRING_VIEW #include @@ -48,10 +48,34 @@ class APT_HIDDEN pkgCacheGenerator /*{{{*/ // Dirty hack for public users that do not use C++11 yet #if __cplusplus >= 201103L - std::unordered_map strMixed; - std::unordered_map strSections; - std::unordered_map strPkgNames; - std::unordered_map strVersions; + struct string_pointer { + const char *data_; + size_t size; + pkgCacheGenerator *generator; + map_stringitem_t item; + + const char *data() const { + return data_ != nullptr ? data_ : static_cast(generator->Map.Data()) + item; + } + + bool operator ==(string_pointer const &other) const { + return size == other.size && memcmp(data(), other.data(), size) == 0; + } + }; + struct hash { + uint32_t operator()(string_pointer const &that) const { + uint32_t Hash = 5381; + const char * const end = that.data() + that.size; + for (const char *I = that.data(); I != end; ++I) + Hash = 33 * Hash + tolower_ascii((signed char)*I); + return Hash; + } + }; + + std::unordered_set strMixed; + std::unordered_set strPkgNames; + std::unordered_set strVersions; + std::unordered_set strSections; #endif friend class pkgCacheListParser; -- cgit v1.2.3