[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