[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