00001 #ifndef TAGCOLL_PATCHCOLLECTION_H
00002 #define TAGCOLL_PATCHCOLLECTION_H
00003
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <tagcoll/Collection.h>
00027 #include <tagcoll/Patches.h>
00028
00029 namespace Tagcoll
00030 {
00031
00036 template<class ITEM, class TAG>
00037 class PatchCollection : public Collection<ITEM, TAG>
00038 {
00039 protected:
00040 const ReadonlyCollection<ITEM, TAG>& coll;
00041 PatchList<ITEM, TAG> changes;
00042
00043 virtual void consumeItem(const ITEM& item, const OpSet<TAG>& tags);
00044
00045 virtual OpSet<ITEM> getItemsHavingTag(const TAG& tag) const;
00046 virtual OpSet<TAG> getTagsOfItem(const ITEM& item) const;
00047
00048 public:
00049 PatchCollection(const ReadonlyCollection<ITEM, TAG>& coll) : coll(coll) {}
00050 virtual ~PatchCollection() {}
00051
00055 const PatchList<ITEM, TAG>& getChanges() const { return changes; }
00056
00060 void resetChanges() { changes.clear(); }
00061
00065 void setChanges(const PatchList<ITEM, TAG>& changes);
00066
00070 void addChanges(const PatchList<ITEM, TAG>& changes);
00071
00072 virtual bool hasTag(const TAG& tag) const;
00073
00074 virtual OpSet<ITEM> getTaggedItems() const;
00075 virtual OpSet<TAG> getAllTags() const;
00076
00077 virtual int getCardinality(const TAG& tag) const;
00078
00079 virtual void applyChange(const PatchList<ITEM, TAG>& change);
00080
00081 virtual void output(Consumer<ITEM, TAG>& consumer) const;
00082 };
00083
00084 };
00085
00086
00087 #endif