X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=24be69dd2f70cd07d425453b3121788b2ff60086;hb=6678cf025ca97dd398a9304b0578f146d1f7af80;hp=85ca843f5e1aba552ab2c2ed26a7241d30675d0b;hpb=92644bf892df1220c8df67e1fc3da85dd02c53c5;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index 85ca843..24be69d 100644 --- a/source/collection.h +++ b/source/collection.h @@ -105,19 +105,22 @@ private: virtual ~ItemCreatorBase() { } template - S *create(Collection &coll, const std::string &name) + bool create(Collection &coll, const std::string &name, S *&ptr) { ItemCreatorBridge *creator=dynamic_cast *>(this); if(creator) - return creator->create(coll, name); - return 0; + { + creator->create(coll, name, ptr); + return true; + } + return false; } }; template struct ItemCreatorBridge: public ItemCreatorBase { - virtual S *create(Collection &, const std::string &) const =0; + virtual bool create(Collection &, const std::string &, S *&) const =0; }; template @@ -198,7 +201,7 @@ public: Gets an object of a specific type from the collection. */ template - T &get(const std::string &name) const + T *get(const std::string &name) const { typedef typename RemoveConst::Type NCT; @@ -219,7 +222,7 @@ public: invoked. */ template - T &get(const std::string &name) + T *get(const std::string &name) { typedef typename RemoveConst::Type NCT; @@ -227,12 +230,15 @@ public: if(i==items.end()) { for(ItemCreatorSeq::iterator j=creators.begin(); j!=creators.end(); ++j) - if(NCT *d=(*j)->create(*this, name)) + { + NCT *d=0; + if((*j)->create(*this, name, d)) { // We already know that the item didn't exist yet items[name]=new Item(d); return *d; } + } throw KeyError("Item '"+name+"' not found in collection"); } @@ -251,11 +257,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.