00001 #ifndef TAGCOLL_CONSUMER_H
00002 #define TAGCOLL_CONSUMER_H
00003
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <tagcoll/OpSet.h>
00027
00028 namespace Tagcoll
00029 {
00030
00034 template< typename ITEM, typename TAG >
00035 class Consumer
00036 {
00037 protected:
00038
00039
00040
00041
00042
00043
00044
00046 virtual void consumeItemUntagged(const ITEM& item) = 0;
00047
00049 virtual void consumeItem(const ITEM& item, const OpSet<TAG>& tags) = 0;
00050
00052 virtual void consumeItemsUntagged(const OpSet<ITEM>& items)
00053 {
00054
00055
00056 for (typename OpSet<ITEM>::const_iterator i = items.begin();
00057 i != items.end(); i++)
00058 consume(*i);
00059 }
00060
00062 virtual void consumeItems(const OpSet<ITEM>& items, const OpSet<TAG>& tags)
00063 {
00064
00065
00066 for (typename OpSet<ITEM>::const_iterator i = items.begin();
00067 i != items.end(); i++)
00068 consume(*i, tags);
00069 }
00070
00071 public:
00072 virtual ~Consumer() {}
00073
00075 void consume(const ITEM& item) { consumeItemUntagged(item); }
00076
00078 void consume(const ITEM& item, const OpSet<TAG>& tags) { consumeItem(item, tags); }
00079
00081 void consume(const OpSet<ITEM>& items) { consumeItemsUntagged(items); }
00082
00084 void consume(const OpSet<ITEM>& items, const OpSet<TAG>& tags) { consumeItems(items, tags); }
00085 };
00086
00087
00091 template<class ITEM, class TAG>
00092 class Sink : public Consumer<ITEM, TAG>
00093 {
00094 protected:
00095 virtual void consumeItemUntagged(const ITEM& item) {}
00096 virtual void consumeItem(const ITEM& item, const OpSet<TAG>& tags) {}
00097 virtual void consumeItemsUntagged(const OpSet<ITEM>& items) {}
00098 virtual void consumeItems(const OpSet<ITEM>& items, const OpSet<TAG>& tags) {}
00099 public:
00100 };
00101
00102 };
00103
00104
00105 #endif