[Debtags-commits] [svn] r1600 - in tagcoll/trunk: . tagcoll
Enrico Zini
enrico at costa.debian.org
Tue Feb 21 16:06:47 UTC 2006
Author: enrico
Date: Tue Feb 21 16:06:46 2006
New Revision: 1600
Modified:
tagcoll/trunk/ (props changed)
tagcoll/trunk/tagcoll/StringIndex.h
Log:
r7421 at viaza: enrico | 2006-02-21 17:06:14 +0100
Speedup StringIndex by caching already created std::strings
Modified: tagcoll/trunk/tagcoll/StringIndex.h
==============================================================================
--- tagcoll/trunk/tagcoll/StringIndex.h (original)
+++ tagcoll/trunk/tagcoll/StringIndex.h Tue Feb 21 16:06:46 2006
@@ -47,15 +47,35 @@
{
protected:
int offset(int val) const { return ((const int*)m_buf)[val]; }
-
+ mutable std::vector<std::string> stringCache;
+
public:
- StringIndex(const MasterMMapIndex& master, int idx) : MMapIndex(master, idx) {}
+ StringIndex(const MasterMMapIndex& master, int idx) : MMapIndex(master, idx), stringCache(size()) {}
virtual ~StringIndex() {}
- virtual std::string operator()(const int& item) const { return data(item); }
+ virtual std::string operator()(const int& id) const
+ {
+ if (id < 0)
+ return std::string();
+ if (stringCache.size() <= (unsigned)id)
+ stringCache.resize(id + 1);
+ if (stringCache[id].empty())
+ if (const char* s = data(id))
+ stringCache[id] = std::string(s, size(id));
+ return stringCache[id];
+ }
virtual int operator()(const std::string& item) const { return data(item.c_str()); }
const char* data(int val) const { return (val >= 0 && (unsigned)val < size()) ? m_buf + offset(val) : ""; }
+ size_t size(int val) const
+ {
+ if (val < 0 || (unsigned)val >= size())
+ return 0;
+ if ((unsigned)val == size() - 1)
+ return m_size - offset(val) - 1;
+ else
+ return offset(val + 1) - offset(val) - 1;
+ }
int data(const char* str) const;
size_t size() const { return *(unsigned int*)m_buf / sizeof(int); }
};
More information about the Debtags-commits
mailing list