]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/collection.h
Add reverse name lookup to Collection
[libs/datafile.git] / source / collection.h
index 5fcaab34f35345406de07e372a70cb972efc2a67..fa3a7de9dbe25441417f988fbe16a5235cbf638d 100644 (file)
@@ -72,6 +72,7 @@ private:
        */
        struct ItemKeywordBase
        {
+               virtual ~ItemKeywordBase() { }
                virtual void add_to_loader(Loader &) const { };
        };
 
@@ -192,7 +193,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<typename RemoveConst<T>::Type>(d);
        }
@@ -207,11 +208,11 @@ 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<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
                if(!item)
-                       throw TypeError("Item '"+name+"' is not of correct type");
+                       throw TypeError("Type mismatch on item '"+name+"'");
 
                return item->data;
        }
@@ -239,12 +240,12 @@ public:
                                        return d;
                                }
                        }
-                       throw KeyError("Item '"+name+"' not found in collection");
+                       throw KeyError("Item not found in collection", name);
                }
 
                const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
                if(!item)
-                       throw TypeError("Item '"+name+"' is not of correct type");
+                       throw TypeError("Type mismatch on item '"+name+"'");
 
                return item->data;
        }
@@ -283,6 +284,22 @@ public:
        */
        bool contains(const std::string &n) const;
 
+       /**
+       Returns the name of an item in the collection.
+       */
+       template<typename T>
+       const std::string &get_name(T *d) const
+       {
+               typedef typename RemoveConst<T>::Type NCT;
+
+               for(ItemMap::const_iterator i=items.begin(); i!=items.end(); ++i)
+                       if(Item<NCT> *item=dynamic_cast<Item<NCT> *>(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.