X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=5fcaab34f35345406de07e372a70cb972efc2a67;hb=0812e7601e9ef6081d01b243ba0365aed652d773;hp=6ddbe6ed65c980d035b30160ad1eca18c0390f1f;hpb=9c0da3059eed8470325477d99a0d56f0948534fd;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index 6ddbe6e..5fcaab3 100644 --- a/source/collection.h +++ b/source/collection.h @@ -105,12 +105,15 @@ 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; + { + ptr=creator->create(coll, name); + return true; + } + return false; } }; @@ -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; @@ -210,7 +213,7 @@ public: if(!item) throw TypeError("Item '"+name+"' is not of correct type"); - return *item->data; + return item->data; } /** @@ -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; + return d; } + } throw KeyError("Item '"+name+"' not found in collection"); } @@ -240,7 +246,7 @@ public: if(!item) throw TypeError("Item '"+name+"' is not of correct type"); - return *item->data; + return item->data; } /**