[Debtags-commits] [svn] r1707 - in tagcoll/2.0: . tagcoll
Enrico Zini
enrico at costa.debian.org
Tue May 9 00:03:47 UTC 2006
Author: enrico
Date: Tue May 9 00:03:45 2006
New Revision: 1707
Modified:
tagcoll/2.0/ (props changed)
tagcoll/2.0/tagcoll/Implications.cc
tagcoll/2.0/tagcoll/Implications.h
Log:
r2594 at viaza: enrico | 2006-05-06 05:31:33 -0500
Converted Implications.h to the new output iterators
Modified: tagcoll/2.0/tagcoll/Implications.cc
==============================================================================
--- tagcoll/2.0/tagcoll/Implications.cc (original)
+++ tagcoll/2.0/tagcoll/Implications.cc Tue May 9 00:03:45 2006
@@ -117,35 +117,6 @@
}
}
-template <class TAG>
-std::set<TAG> Implications<TAG>::compress(const std::set<TAG>& tags) const
-{
- // Create the union of the expansion sets of each single tag, without the tag
- // tags = tags - this union
- std::set<TAG> redundant;
- for (typename std::set<TAG>::const_iterator t = tags.begin();
- t != tags.end(); t++)
- {
- std::set<TAG> expanded = expand(*t);
- for (typename std::set<TAG>::const_iterator i = expanded.begin();
- i != expanded.end(); i++)
- if (*i != *t)
- redundant.insert(*i);
- }
- return tags - redundant;
-}
-
-#ifndef INSTANTIATING_TEMPLATES
-#include <string>
-
-namespace tagcoll {
- template class Implications<std::string>;
- template class AddImplied<std::string, std::string>;
- template class RemoveImplied<std::string, std::string>;
-}
-#endif
-
-
#ifdef COMPILE_TESTSUITE
#include <tests/test-utils.h>
@@ -181,10 +152,10 @@
"d: sugar, sweet\n"
);
InputMerger<string, string> result;
- AddImplied<string, string> filter(result);
+ Implications<string> implications;
- outputCollection(input_impl, filter.implications());
- outputCollection(input_coll, filter);
+ outputCollection(input_impl, implications);
+ parseCollection(input_coll, addImplied(implications, consumer(result)));
InputMerger<string, string> reference;
outputCollection(output_coll, reference);
@@ -213,10 +184,10 @@
"d: sugar\n"
);
InputMerger<string, string> result;
- RemoveImplied<string, string> filter(result);
+ Implications<string> implications;
- outputCollection(input_impl, filter.implications());
- outputCollection(input_coll, filter);
+ outputCollection(input_impl, implications);
+ parseCollection(input_coll, removeImplied(implications, consumer(result)));
InputMerger<string, string> reference;
outputCollection(output_coll, reference);
@@ -226,6 +197,8 @@
}
+#include <tagcoll/TextFormat.tcc>
+
#endif
// vim:set ts=4 sw=4:
Modified: tagcoll/2.0/tagcoll/Implications.h
==============================================================================
--- tagcoll/2.0/tagcoll/Implications.h (original)
+++ tagcoll/2.0/tagcoll/Implications.h Tue May 9 00:03:45 2006
@@ -24,9 +24,9 @@
*/
#include <tagcoll/Consumer.h>
-#include <tagcoll/Filter.h>
#include <wibble/operators.h>
+#include <wibble/mixin.h>
#include <map>
namespace tagcoll
@@ -68,19 +68,43 @@
/// Expand a full tagset
- std::set<TAG> expand(const std::set<TAG>& tags) const
+ template<typename IN>
+ std::set<TAG> expand(const IN& tags) const
{
- std::set<TAG> res = tags;
+ std::set<TAG> res;
- for (typename std::set<TAG>::const_iterator t = tags.begin();
- t != tags.end(); t++)
+ for (typename IN::const_iterator t = tags.begin();
+ t != tags.end(); ++t)
+ {
+ res |= *t;
res |= expand(*t);
+ }
return res;
}
/// Compress a tagset removing implied tags
- std::set<TAG> compress(const std::set<TAG>& tags) const;
+ template<typename IN>
+ std::set<TAG> compress(const IN& tags) const
+ {
+ using namespace wibble::operators;
+
+ // Create the union of the expansion sets of each single tag, without the tag
+ // tags = tags - this union
+ std::set<TAG> initial;
+ std::set<TAG> redundant;
+ for (typename IN::const_iterator t = tags.begin();
+ t != tags.end(); ++t)
+ {
+ initial.insert(*t);
+ std::set<TAG> expanded = expand(*t);
+ for (typename std::set<TAG>::const_iterator i = expanded.begin();
+ i != expanded.end(); i++)
+ if (*i != *t)
+ redundant.insert(*i);
+ }
+ return initial - redundant;
+ }
// Remove unnecessary arcs from the dag
void pack();
@@ -115,81 +139,61 @@
/**
* Add implied tags to a stream of tagged items
*/
-template <class ITEM, class TAG>
-class AddImplied : public Filter<ITEM, TAG>
+template <typename TAG, typename OUT>
+class AddImplied : public wibble::mixin::OutputIterator< AddImplied<TAG, OUT> >
{
protected:
- Implications<TAG> impls;
+ const Implications<TAG>& impls;
+ OUT out;
- virtual void consumeItemUntagged(const ITEM& item) { this->consumer->consume(item); }
- virtual void consumeItem(const ITEM& item, const std::set<TAG>& tags)
- {
- this->consumer->consume(item, impls.expand(tags));
- }
- virtual void consumeItemsUntagged(const std::set<ITEM>& items) { this->consumer->consume(items); }
- virtual void consumeItems(const std::set<ITEM>& items, const std::set<TAG>& tags)
+public:
+ AddImplied(const Implications<TAG>& impls, const OUT& out)
+ : impls(impls), out(out) {}
+
+ template<typename ITEMS, typename TAGS>
+ AddImplied<TAG, OUT>& operator=(const std::pair<ITEMS, TAGS>& data)
{
- this->consumer->consume(items, impls.expand(tags));
+ *out = make_pair(data.first, impls.expand(data.second));
+ ++out;
+ return *this;
}
-
-public:
- AddImplied() {}
- AddImplied(Consumer<ITEM, TAG>& cons) : Filter<ITEM, TAG>(cons) {}
- AddImplied(const Implications<TAG>& impls) : impls(impls) {}
- AddImplied(Consumer<ITEM, TAG>& cons, const Implications<TAG>& impls)
- : Filter<ITEM, TAG>(cons), impls(impls) {}
- virtual ~AddImplied() {}
-
- /**
- * Access the internal Implication list
- */
- Implications<TAG>& implications() { return impls; }
-
- /**
- * Access the internal Implication list (const version)
- */
- const Implications<TAG>& implications() const { return impls; }
};
+template<typename TAG, typename OUT>
+AddImplied<TAG, OUT> addImplied(const Implications<TAG>& impls, const OUT& out)
+{
+ return AddImplied<TAG, OUT>(impls, out);
+}
+
/**
* Remove redundant implied tags to a stream of tagged items
*/
-template <class ITEM, class TAG>
-class RemoveImplied : public Filter<ITEM, TAG>
+template <typename TAG, typename OUT>
+class RemoveImplied : public wibble::mixin::OutputIterator< RemoveImplied<TAG, OUT> >
{
protected:
- Implications<TAG> impls;
+ const Implications<TAG>& impls;
+ OUT out;
- virtual void consumeItemUntagged(const ITEM& item) { this->consumer->consume(item); }
- virtual void consumeItem(const ITEM& item, const std::set<TAG>& tags)
- {
- this->consumer->consume(item, impls.compress(tags));
- }
- virtual void consumeItemsUntagged(const std::set<ITEM>& items) { this->consumer->consume(items); }
- virtual void consumeItems(const std::set<ITEM>& items, const std::set<TAG>& tags)
+public:
+ RemoveImplied(const Implications<TAG>& impls, const OUT& out)
+ : impls(impls), out(out) {}
+
+ template<typename ITEMS, typename TAGS>
+ RemoveImplied<TAG, OUT>& operator=(const std::pair<ITEMS, TAGS>& data)
{
- this->consumer->consume(items, impls.compress(tags));
+ *out = make_pair(data.first, impls.compress(data.second));
+ ++out;
+ return *this;
}
-
-public:
- RemoveImplied() {}
- RemoveImplied(Consumer<ITEM, TAG>& cons) : Filter<ITEM, TAG>(cons) {}
- RemoveImplied(const Implications<TAG>& impls) : impls(impls) {}
- RemoveImplied(Consumer<ITEM, TAG>& cons, const Implications<TAG>& impls)
- : Filter<ITEM, TAG>(cons), impls(impls) {}
- virtual ~RemoveImplied() {}
-
- /**
- * Access the internal Implication list
- */
- Implications<TAG>& implications() { return impls; }
-
- /**
- * Access the internal Implication list (const version)
- */
- const Implications<TAG>& implications() const { return impls; }
};
+template<typename TAG, typename OUT>
+RemoveImplied<TAG, OUT> removeImplied(const Implications<TAG>& impls, const OUT& out)
+{
+ return RemoveImplied<TAG, OUT>(impls, out);
+}
+
};
// vim:set ts=4 sw=4:
More information about the Debtags-commits
mailing list