[Debtags-commits] [svn] r1598 - in tagcoll/trunk: . tagcoll tests

Enrico Zini enrico at costa.debian.org
Tue Feb 21 13:35:09 UTC 2006


Author: enrico
Date: Tue Feb 21 13:35:08 2006
New Revision: 1598

Modified:
   tagcoll/trunk/   (props changed)
   tagcoll/trunk/tagcoll/DerivedTags.cc
   tagcoll/trunk/tagcoll/Expression.cc
   tagcoll/trunk/tagcoll/Filter.cc
   tagcoll/trunk/tagcoll/Filters.cc
   tagcoll/trunk/tagcoll/Implications.cc
   tagcoll/trunk/tagcoll/IntDiskIndex.cc
   tagcoll/trunk/tagcoll/IntDiskIndex.h
   tagcoll/trunk/tagcoll/Patches.cc
   tagcoll/trunk/tagcoll/Patches.h
   tagcoll/trunk/tagcoll/TDBDiskIndex.cc
   tagcoll/trunk/tagcoll/TDBIndexer.cc
   tagcoll/trunk/tagcoll/test-utils.cc
   tagcoll/trunk/tests/test-utils.h
Log:
 r7416 at viaza:  enrico | 2006-02-21 13:31:35 +0100
 More optimizations obtained by constructing OpSets with sorted sequences of items
 Renamed *ensure_coll_equal in *ensure_coll_equals


Modified: tagcoll/trunk/tagcoll/DerivedTags.cc
==============================================================================
--- tagcoll/trunk/tagcoll/DerivedTags.cc	(original)
+++ tagcoll/trunk/tagcoll/DerivedTags.cc	Tue Feb 21 13:35:08 2006
@@ -74,7 +74,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 template<> template<>
@@ -103,7 +103,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 }

Modified: tagcoll/trunk/tagcoll/Expression.cc
==============================================================================
--- tagcoll/trunk/tagcoll/Expression.cc	(original)
+++ tagcoll/trunk/tagcoll/Expression.cc	Tue Feb 21 13:35:08 2006
@@ -287,7 +287,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 template<> template<>
@@ -311,7 +311,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 }

Modified: tagcoll/trunk/tagcoll/Filter.cc
==============================================================================
--- tagcoll/trunk/tagcoll/Filter.cc	(original)
+++ tagcoll/trunk/tagcoll/Filter.cc	Tue Feb 21 13:35:08 2006
@@ -120,7 +120,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 template<> template<>
@@ -160,7 +160,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 }

Modified: tagcoll/trunk/tagcoll/Filters.cc
==============================================================================
--- tagcoll/trunk/tagcoll/Filters.cc	(original)
+++ tagcoll/trunk/tagcoll/Filters.cc	Tue Feb 21 13:35:08 2006
@@ -120,7 +120,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 template<> template<>
@@ -143,7 +143,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 template<> template<>
@@ -166,7 +166,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 }

Modified: tagcoll/trunk/tagcoll/Implications.cc
==============================================================================
--- tagcoll/trunk/tagcoll/Implications.cc	(original)
+++ tagcoll/trunk/tagcoll/Implications.cc	Tue Feb 21 13:35:08 2006
@@ -186,7 +186,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 template<> template<>
@@ -218,7 +218,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference); 
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 }

Modified: tagcoll/trunk/tagcoll/IntDiskIndex.cc
==============================================================================
--- tagcoll/trunk/tagcoll/IntDiskIndex.cc	(original)
+++ tagcoll/trunk/tagcoll/IntDiskIndex.cc	Tue Feb 21 13:35:08 2006
@@ -30,6 +30,79 @@
 #include <iostream>
 #endif
 
+template<typename T>
+class IntSetIterator
+{
+	const int* vals;
+	size_t size;
+	const Converter<int, T>& conv;
+
+public:
+	// End iterator
+	IntSetIterator(const Converter<int, T>& conv)
+		: vals(0), size(0), conv(conv) {}
+
+	IntSetIterator(const int* vals, size_t size, const Converter<int, T>& conv)
+		: vals(vals), size(size), conv(conv) { if (size == 0) this->vals = 0; }
+
+	IntSetIterator<T>& operator++()
+	{
+		if (size > 0)
+		{
+			++vals;
+			if (--size == 0)
+				vals = 0;
+		}
+		return *this;
+	}
+	T operator*() { return conv(*vals); }
+
+	bool operator!=(const IntSetIterator<T>& mi) { return vals != mi.vals; }
+};
+
+template<typename T>
+class IntSeqIterator
+{
+	int val;
+	const Converter<int, T>& conv;
+
+public:
+	IntSeqIterator(int val, const Converter<int, T>& conv)
+		: val(val), conv(conv) {}
+
+	IntSeqIterator<T>& operator++()
+	{
+		++val;
+		return *this;
+	}
+	T operator*() { return conv(val); }
+
+	bool operator!=(const IntSeqIterator<T>& mi) { return val != mi.val; }
+};
+
+template<typename T>
+class NonemptyIntSeqIterator
+{
+	const IntIndex& idx;
+	unsigned int val;
+	const Converter<int, T>& conv;
+
+public:
+	NonemptyIntSeqIterator(const IntIndex& idx, int val, const Converter<int, T>& conv)
+		: idx(idx), val(val), conv(conv) {}
+
+	NonemptyIntSeqIterator<T>& operator++()
+	{
+		for (++val; idx.size(val) == 0 && val < idx.size(); ++val)
+			;
+		return *this;
+	}
+	T operator*() { return conv(val); }
+
+	bool operator!=(const NonemptyIntSeqIterator<T>& mi) { return val != mi.val; }
+};
+
+
 class IntSets : public std::list< std::pair<size_t, const int*> >
 {
 #ifdef TRACE_IS
@@ -245,18 +318,8 @@
 				val = is.extractmin();
 			return *this;
 		}
-		MergeIterator operator++(int)
-		{
-			int oval = val;
-			if (is.empty())
-				val = -1;
-			else
-				val = is.extractmin();
-			return MergeIterator(is, oval);
-		}
 		T operator*() { return conv(val); }
 
-		bool operator==(const MergeIterator& mi) { return val == -1 && mi.val == -1; }
 		bool operator!=(const MergeIterator& mi) { return val != -1 || mi.val != -1; }
 	};
 	
@@ -286,6 +349,13 @@
 };
 
 template<typename ITEM, typename TAG>
+OpSet<ITEM> IntDiskIndex<ITEM, TAG>::getItemsHavingTag(const TAG& tag) const
+{
+	int id = fromtag(tag);
+	return OpSet<ITEM>(IntSetIterator<ITEM>(tagidx.data(id), tagidx.size(id), *m_toitem), IntSetIterator<ITEM>(*m_toitem));
+}
+
+template<typename ITEM, typename TAG>
 OpSet<ITEM> IntDiskIndex<ITEM, TAG>::getItemsHavingTags(const OpSet<TAG>& tags) const
 {
 	if (tags.empty())
@@ -304,6 +374,13 @@
 }
 
 template<typename ITEM, typename TAG>
+OpSet<TAG> IntDiskIndex<ITEM, TAG>::getTagsOfItem(const ITEM& item) const
+{
+	int id = fromitem(item);
+	return OpSet<TAG>(IntSetIterator<TAG>(pkgidx.data(id), pkgidx.size(id), *m_totag), IntSetIterator<TAG>(*m_totag));
+}
+
+template<typename ITEM, typename TAG>
 OpSet<TAG> IntDiskIndex<ITEM, TAG>::getTagsOfItems(const OpSet<ITEM>& items) const
 {
 	if (items.empty())
@@ -320,6 +397,20 @@
 }
 
 template<typename ITEM, typename TAG>
+OpSet<ITEM> IntDiskIndex<ITEM, TAG>::getTaggedItems() const
+{
+	return OpSet<ITEM>(
+			NonemptyIntSeqIterator<ITEM>(pkgidx, 0, *m_toitem),
+			NonemptyIntSeqIterator<ITEM>(pkgidx, pkgidx.size(), *m_toitem));
+}
+
+template<typename ITEM, typename TAG>
+OpSet<TAG> IntDiskIndex<ITEM, TAG>::getAllTags() const
+{
+	return OpSet<TAG>(IntSeqIterator<TAG>(0, *m_totag), IntSeqIterator<TAG>(tagidx.size(), *m_totag));
+}
+
+template<typename ITEM, typename TAG>
 OpSet<TAG> IntDiskIndex<ITEM, TAG>::getCompanionTags(const OpSet<TAG>& tags) const
 {
 	// This is basically a reimplementation of:
@@ -355,6 +446,13 @@
 	return merge.merge<TAG>(*m_totag);
 }
 
+template<typename ITEM, typename TAG>
+void IntDiskIndex<ITEM, TAG>::output(Consumer<ITEM, TAG>& consumer) const
+{
+	for (unsigned int i = 0; i < pkgidx.size(); i++)
+		if (pkgidx.size(i) > 0)
+			consumer.consume(toitem(i), OpSet<TAG>(IntSetIterator<TAG>(pkgidx.data(i), pkgidx.size(i), *m_totag), IntSetIterator<TAG>(*m_totag)));
+}
 
 
 template<class ITEM, class TAG>

Modified: tagcoll/trunk/tagcoll/IntDiskIndex.h
==============================================================================
--- tagcoll/trunk/tagcoll/IntDiskIndex.h	(original)
+++ tagcoll/trunk/tagcoll/IntDiskIndex.h	Tue Feb 21 13:35:08 2006
@@ -54,36 +54,14 @@
 	const Converter<int, ITEM>* m_toitem;
 	const Converter<int, TAG>* m_totag;
 
-	int fromitem(const ITEM& tag) const { return (*m_fromitem)(tag); }
-	int fromtag(const TAG& tag) const { return (*m_fromtag)(tag); }
-	ITEM toitem(const int& tag) const { return (*m_toitem)(tag); }
-	TAG totag(const int& tag) const { return (*m_totag)(tag); }
-
-	virtual OpSet<ITEM> getItemsHavingTag(const TAG& tag) const
-	{
-		OpSet<ITEM> res;
-		int itag = fromtag(tag);
-		for (unsigned int i = 0; i < tagidx.size(itag); i++)
-			res += toitem(tagidx.data(itag)[i]);
-		return res;
-	}
+	inline int fromitem(const ITEM& tag) const { return (*m_fromitem)(tag); }
+	inline int fromtag(const TAG& tag) const { return (*m_fromtag)(tag); }
+	inline ITEM toitem(const int& tag) const { return (*m_toitem)(tag); }
+	inline TAG totag(const int& tag) const { return (*m_totag)(tag); }
 
+	virtual OpSet<ITEM> getItemsHavingTag(const TAG& tag) const;
 	virtual OpSet<ITEM> getItemsHavingTags(const OpSet<TAG>& tags) const;
-
-	virtual OpSet<TAG> getTagsOfItem(const ITEM& item) const
-	{
-		if (item != ITEM())
-		{
-			OpSet<TAG> res;
-			int iitem = fromitem(item);
-			for (unsigned int i = 0; i < pkgidx.size(iitem); i++)
-				res += totag(pkgidx.data(iitem)[i]);
-			return res;
-		}
-		else
-			return OpSet<TAG>();
-	}
-
+	virtual OpSet<TAG> getTagsOfItem(const ITEM& item) const;
 	virtual OpSet<TAG> getTagsOfItems(const OpSet<ITEM>& items) const;
 
 public:
@@ -143,22 +121,9 @@
 		return tagidx.size(fromtag(tag)) > 0;
 	}
 
-	virtual OpSet<ITEM> getTaggedItems() const
-	{
-		OpSet<ITEM> res;
-		for (unsigned int i = 0; i < pkgidx.size(); i++)
-			if (pkgidx.size(i) > 0)
-				res += toitem(i);
-		return res;
-	}
+	virtual OpSet<ITEM> getTaggedItems() const;
 
-	virtual OpSet<TAG> getAllTags() const
-	{
-		OpSet<TAG> res;
-		for (unsigned int i = 0; i < tagidx.size(); i++)
-			res += totag(i);
-		return res;
-	}
+	virtual OpSet<TAG> getAllTags() const;
 
 	virtual int getCardinality(const TAG& tag) const
 	{
@@ -167,17 +132,7 @@
 
 	virtual OpSet<TAG> getCompanionTags(const OpSet<TAG>& tags) const;
 
-	virtual void output(Consumer<ITEM, TAG>& consumer) const
-	{
-		for (unsigned int i = 0; i < pkgidx.size(); i++)
-			if (pkgidx.size(i) > 0)
-			{
-				OpSet<TAG> tags;
-				for (unsigned int j = 0; j < pkgidx.size(i); j++)
-					tags += totag(pkgidx.data(i)[j]);
-				consumer.consume(toitem(i), tags);
-			}
-	}
+	virtual void output(Consumer<ITEM, TAG>& consumer) const;
 };
 
 template<class ITEM, class TAG>

Modified: tagcoll/trunk/tagcoll/Patches.cc
==============================================================================
--- tagcoll/trunk/tagcoll/Patches.cc	(original)
+++ tagcoll/trunk/tagcoll/Patches.cc	Tue Feb 21 13:35:08 2006
@@ -33,7 +33,7 @@
 {
 protected:
 	PatchList<ITEM, TAG>& target;
-	const Collection<ITEM, TAG>& second;
+	const ReadonlyCollection<ITEM, TAG>& second;
 
 	// Process an untagged item
 	virtual void consumeItemUntagged(const ITEM& item)
@@ -53,7 +53,7 @@
 			target.addPatch(Patch<ITEM, TAG>(item, added, removed));
 	}
 public:
-	PatchGenerator(PatchList<ITEM, TAG>& target, const Collection<ITEM, TAG>& second) throw ()
+	PatchGenerator(PatchList<ITEM, TAG>& target, const ReadonlyCollection<ITEM, TAG>& second) throw ()
 		: target(target), second(second) {}
 };
 
@@ -81,7 +81,7 @@
 
 template <class ITEM, class TAG>
 void PatchList<ITEM, TAG>::addPatch(
-		const Collection<ITEM, TAG>& im1, const Collection<ITEM, TAG>& im2) throw ()
+		const ReadonlyCollection<ITEM, TAG>& im1, const ReadonlyCollection<ITEM, TAG>& im2) throw ()
 {
 	PatchGenerator<ITEM, TAG> patchgen(*this, im2);
 	im1.output(patchgen);
@@ -213,7 +213,7 @@
 	InputMerger<string, string> reference;
 	outputCollection(output_coll, reference);
 
-	gen_ensure_coll_equal(reference, result);
+	gen_ensure_coll_equals(reference, result);
 }
 
 }

Modified: tagcoll/trunk/tagcoll/Patches.h
==============================================================================
--- tagcoll/trunk/tagcoll/Patches.h	(original)
+++ tagcoll/trunk/tagcoll/Patches.h	Tue Feb 21 13:35:08 2006
@@ -113,7 +113,7 @@
 	/**
 	 * Add to this patchlist the patches needed to transform `im1' in `im2'
 	 */
-	void addPatch(const Collection<ITEM, TAG>& im1, const Collection<ITEM, TAG>& im2) throw ();
+	void addPatch(const ReadonlyCollection<ITEM, TAG>& im1, const ReadonlyCollection<ITEM, TAG>& im2) throw ();
 
 	/**
 	 * Add `patch' to this PatchList

Modified: tagcoll/trunk/tagcoll/TDBDiskIndex.cc
==============================================================================
--- tagcoll/trunk/tagcoll/TDBDiskIndex.cc	(original)
+++ tagcoll/trunk/tagcoll/TDBDiskIndex.cc	Tue Feb 21 13:35:08 2006
@@ -19,6 +19,7 @@
  */
 
 #include <tagcoll/TDBDiskIndex.h>
+#include <tagcoll/Patches.h>
 
 #include <tdb.h>
 #include <fcntl.h>	// O_RDONLY

Modified: tagcoll/trunk/tagcoll/TDBIndexer.cc
==============================================================================
--- tagcoll/trunk/tagcoll/TDBIndexer.cc	(original)
+++ tagcoll/trunk/tagcoll/TDBIndexer.cc	Tue Feb 21 13:35:08 2006
@@ -19,6 +19,7 @@
  */
 
 #include <tagcoll/TDBIndexer.h>
+#include <tagcoll/Patches.h>
 
 #include <tdb.h>
 #include <fcntl.h>	// O_RDONLY

Modified: tagcoll/trunk/tagcoll/test-utils.cc
==============================================================================
--- tagcoll/trunk/tagcoll/test-utils.cc	(original)
+++ tagcoll/trunk/tagcoll/test-utils.cc	Tue Feb 21 13:35:08 2006
@@ -32,6 +32,8 @@
 #include <tests/test-utils.h>
 #include <tagcoll/StringParserInput.h>
 #include <tagcoll/TextFormat.h>
+#include <tagcoll/InputMerger.h>
+#include <tagcoll/Patches.h>
 
 namespace tut_tagcoll {
 
@@ -52,8 +54,8 @@
 	TextFormat<string, string>::parse(a, a, input, cons);
 }
 
-void __tc_ensure_coll_equal(const Location& loc,
-		const Tagcoll::Collection<string, string>& c1, const Tagcoll::Collection<string, string>& c2)
+void __tc_ensure_coll_equals(const Location& loc,
+		const Tagcoll::ReadonlyCollection<string, string>& c1, const Tagcoll::ReadonlyCollection<string, string>& c2)
 {
 	PatchList<string, string> p;
 	p.addPatch(c1, c2);
@@ -250,6 +252,19 @@
 	inner_ensure_not_contains(s, string("funghi"));
 	inner_ensure_not_contains(s, string("rosmarino"));
 	inner_ensure_not_contains(s, string("marinara"));
+
+	// TODO:    virtual OpSet<ITEM> getTaggedItems() const = 0;
+	// TODO:    virtual OpSet<TAG> getAllTags() const = 0;
+	// TODO:    virtual int getCardinality(const TAG& tag) const
+	// TODO:    virtual OpSet<TAG> getCompanionTags(const OpSet<TAG>& tags) const
+	// TODO:    virtual OpSet<ITEM> getRelatedItems(const OpSet<TAG>& tags, int maxdistance = 1) const
+
+	// void output(Consumer<ITEM, TAG>& consumer) const
+	InputMerger<string, string> coll1;
+	tc.output(coll1);
+	inner_ensure_coll_equals(tc, coll1);
+
+	// TODO:    virtual void outputHavingTags(const OpSet<TAG>& tags, Consumer<ITEM, TAG>& consumer) const
 }
 
 void __test_collection(const Location& loc, Collection<string, string>& tc)

Modified: tagcoll/trunk/tests/test-utils.h
==============================================================================
--- tagcoll/trunk/tests/test-utils.h	(original)
+++ tagcoll/trunk/tests/test-utils.h	Tue Feb 21 13:35:08 2006
@@ -12,7 +12,6 @@
 
 #ifdef TEST_TAGCOLL
 #include <tagcoll/Collection.h>
-#include <tagcoll/Patches.h>
 #endif
 /*
 #include <apt-front/cache.h>
@@ -103,11 +102,13 @@
 	}
 }
 
-#define gen_ensure_coll_equal(a, b) \
-	__tc_ensure_coll_equal(Location(__FILE__, __LINE__, #a " == " #b), a, b)
-void __tc_ensure_coll_equal(const Location& loc,
-		const Tagcoll::Collection<string, string>& c1,
-		const Tagcoll::Collection<string, string>& c2);
+#define gen_ensure_coll_equals(a, b) \
+	__tc_ensure_coll_equals(Location(__FILE__, __LINE__, #a " == " #b), a, b)
+#define inner_ensure_coll_equals(a, b) \
+	__tc_ensure_coll_equals(Location(loc, __FILE__, __LINE__, #a " == " #b), a, b)
+void __tc_ensure_coll_equals(const Location& loc,
+		const Tagcoll::ReadonlyCollection<string, string>& c1,
+		const Tagcoll::ReadonlyCollection<string, string>& c2);
 
 #define gen_ensure_contains(a, b) \
 	_ensure_contains(Location(__FILE__, __LINE__, #a " contains " #b), a, b)



More information about the Debtags-commits mailing list