X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=69d631fa9dfa59b78362d69e2c830783a86ff725;hb=7df5e45c7f414f6a07681dc4ec2abb63b091a309;hp=24be69dd2f70cd07d425453b3121788b2ff60086;hpb=6678cf025ca97dd398a9304b0578f146d1f7af80;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index 24be69d..69d631f 100644 --- a/source/collection.h +++ b/source/collection.h @@ -1,13 +1,7 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_DATAFILE_COLLECTION_H_ #define MSP_DATAFILE_COLLECTION_H_ +#include #include #include "loader.h" @@ -31,14 +25,6 @@ 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. @@ -72,6 +58,7 @@ private: */ struct ItemKeywordBase { + virtual ~ItemKeywordBase() { } virtual void add_to_loader(Loader &) const { }; }; @@ -110,7 +97,7 @@ private: ItemCreatorBridge *creator=dynamic_cast *>(this); if(creator) { - creator->create(coll, name, ptr); + ptr=creator->create(coll, name); return true; } return false; @@ -120,7 +107,7 @@ private: template struct ItemCreatorBridge: public ItemCreatorBase { - virtual bool create(Collection &, const std::string &, S *&) const =0; + virtual S *create(Collection &, const std::string &) const = 0; }; template @@ -192,7 +179,7 @@ public: void add(const std::string &name, T *d) { if(items.count(name)) - throw KeyError("Duplicate key '"+name+"' in collection"); + throw KeyError("Duplicate key in collection", name); items[name]=new Item::Type>(d); } @@ -207,13 +194,13 @@ public: ItemMap::const_iterator i=items.find(name); if(i==items.end()) - throw KeyError("Item '"+name+"' not found in collection"); + throw KeyError("Item not found in collection", name); const Item *item=dynamic_cast *>(i->second); if(!item) - throw TypeError("Item '"+name+"' is not of correct type"); + throw TypeError("Type mismatch on item '"+name+"'"); - return *item->data; + return item->data; } /** @@ -236,17 +223,17 @@ public: { // 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"); + throw KeyError("Item not found in collection", name); } const Item *item=dynamic_cast *>(i->second); if(!item) - throw TypeError("Item '"+name+"' is not of correct type"); + throw TypeError("Type mismatch on item '"+name+"'"); - return *item->data; + return item->data; } /** @@ -283,6 +270,22 @@ public: */ bool contains(const std::string &n) const; + /** + Returns the name of an item in the collection. + */ + template + const std::string &get_name(T *d) const + { + typedef typename RemoveConst::Type NCT; + + for(ItemMap::const_iterator i=items.begin(); i!=items.end(); ++i) + if(Item *item=dynamic_cast *>(i->second)) + if(item->data==d) + return i->first; + + throw KeyError("Item not found in collection"); + } + protected: /** Adds a type that can be loaded from datafiles.