]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/collection.h
Refactor exceptions
[libs/datafile.git] / source / collection.h
index f293428c8cdd0fc046019531335ccf6d28b525fc..0bbc9fc34203aa10c8aa4d9ddec467fddd24ea78 100644 (file)
@@ -1,13 +1,14 @@
 /* $Id$
 
 This file is part of libmspdatafile
-Copyright © 2006  Mikko Rasa, Mikkosoft Productions
+Copyright © 2006-2008  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
 #ifndef MSP_DATAFILE_COLLECTION_H_
 #define MSP_DATAFILE_COLLECTION_H_
 
+#include <msp/core/meta.h>
 #include <msp/core/refptr.h>
 #include "loader.h"
 
@@ -31,14 +32,6 @@ struct NeedsCollection
        enum { result=(sizeof(f<T>(0))==sizeof(Yes)) };
 };
 
-template<typename T>
-struct RemoveConst
-{ typedef T Type; };
-
-template<typename T>
-struct RemoveConst<const T>
-{ 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 +65,7 @@ private:
        */
        struct ItemKeywordBase
        {
+               virtual ~ItemKeywordBase() { }
                virtual void add_to_loader(Loader &) const { };
        };
 
@@ -283,6 +277,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.