X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=2d346d9a4557a72325a18ae6f89c232e5f629681;hb=35d0da96bad97214376f18d15078e6d731e6f219;hp=0bbc9fc34203aa10c8aa4d9ddec467fddd24ea78;hpb=256f7238bc60d6dcc31a564988f5cc02a60c4537;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index 0bbc9fc..2d346d9 100644 --- a/source/collection.h +++ b/source/collection.h @@ -1,14 +1,8 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2006-2008 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_DATAFILE_COLLECTION_H_ #define MSP_DATAFILE_COLLECTION_H_ #include +#include #include #include "loader.h" @@ -114,7 +108,7 @@ private: template struct ItemCreatorBridge: public ItemCreatorBase { - virtual S *create(Collection &, const std::string &) const =0; + virtual S *create(Collection &, const std::string &) const = 0; }; template @@ -185,10 +179,11 @@ public: template void add(const std::string &name, T *d) { - if(items.count(name)) - throw KeyError("Duplicate key in collection", name); + typedef typename RemoveConst::Type NCT; - items[name]=new Item::Type>(d); + RefPtr > i=new Item(d); + insert_unique(items, i.get()); + i.release(); } /** @@ -199,11 +194,9 @@ public: { typedef typename RemoveConst::Type NCT; - ItemMap::const_iterator i=items.find(name); - if(i==items.end()) - throw KeyError("Item not found in collection", name); + ItemBase *i=get_item(items, name); - const Item *item=dynamic_cast *>(i->second); + const Item *item=dynamic_cast *>(i); if(!item) throw TypeError("Type mismatch on item '"+name+"'"); @@ -220,8 +213,7 @@ public: { typedef typename RemoveConst::Type NCT; - ItemMap::const_iterator i=items.find(name); - if(i==items.end()) + if(!items.count(name)) { for(ItemCreatorSeq::iterator j=creators.begin(); j!=creators.end(); ++j) { @@ -233,10 +225,11 @@ public: return d; } } - throw KeyError("Item not found in collection", name); } - const Item *item=dynamic_cast *>(i->second); + ItemBase *i=get_item(items, name); + + const Item *item=dynamic_cast *>(i); if(!item) throw TypeError("Type mismatch on item '"+name+"'");