X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=6ddbe6ed65c980d035b30160ad1eca18c0390f1f;hb=9c0da3059eed8470325477d99a0d56f0948534fd;hp=e7d173d061ed7947750702d8fe1681cd2e44bcb5;hpb=1d9c21a8a301007fb242e05b69cc6390ec566273;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index e7d173d..6ddbe6e 100644 --- a/source/collection.h +++ b/source/collection.h @@ -9,7 +9,6 @@ Distributed under the LGPL #define MSP_DATAFILE_COLLECTION_H_ #include -#include "item.h" #include "loader.h" namespace Msp { @@ -32,6 +31,14 @@ struct NeedsCollection enum { result=(sizeof(f(0))==sizeof(Yes)) }; }; +template +struct RemoveConst +{ typedef T Type; }; + +template +struct RemoveConst +{ typedef T Type; }; + /** A collection of objects that can be loaded from a datafile. Each object is identified by a name, which must be unique across the entire collection. @@ -168,7 +175,10 @@ private: ItemKeywordSeq keywords; ItemCreatorSeq creators; + Collection(const Collection &); + Collection &operator=(const Collection &); public: + Collection() { } virtual ~Collection(); /** @@ -181,7 +191,7 @@ public: if(items.count(name)) throw KeyError("Duplicate key '"+name+"' in collection"); - items[name]=new Item(d); + items[name]=new Item::Type>(d); } /** @@ -190,11 +200,13 @@ public: template T &get(const std::string &name) const { + typedef typename RemoveConst::Type NCT; + ItemMap::const_iterator i=items.find(name); if(i==items.end()) throw KeyError("Item '"+name+"' not found in collection"); - const Item *item=dynamic_cast *>(i->second); + const Item *item=dynamic_cast *>(i->second); if(!item) throw TypeError("Item '"+name+"' is not of correct type"); @@ -209,20 +221,22 @@ public: template T &get(const std::string &name) { + typedef typename RemoveConst::Type NCT; + ItemMap::const_iterator i=items.find(name); if(i==items.end()) { for(ItemCreatorSeq::iterator j=creators.begin(); j!=creators.end(); ++j) - if(T *d=(*j)->create(*this, name)) + if(NCT *d=(*j)->create(*this, name)) { // We already know that the item didn't exist yet - items[name]=new Item(d); + items[name]=new Item(d); return *d; } throw KeyError("Item '"+name+"' not found in collection"); } - const Item *item=dynamic_cast *>(i->second); + const Item *item=dynamic_cast *>(i->second); if(!item) throw TypeError("Item '"+name+"' is not of correct type"); @@ -237,11 +251,26 @@ public: { std::list result; for(ItemMap::const_iterator i=items.begin(); i!=items.end(); ++i) - if(dynamic_cast *>(i->second)) + if(dynamic_cast::Type> *>(i->second)) result.push_back(i->first); return result; } + /** + Returns a list of objects of a specific type in the collection. + */ + template + std::list get_list() const + { + typedef typename RemoveConst::Type NCT; + + std::list result; + for(ItemMap::const_iterator i=items.begin(); i!=items.end(); ++i) + if(Item *item=dynamic_cast *>(i->second)) + result.push_back(item->data); + return result; + } + /** Checks whether a name exists in the collection. Does not care about the type of the object.