[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