]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/collection.h
Use the functions from maputils.h in various places
[libs/datafile.git] / source / collection.h
index 69d631fa9dfa59b78362d69e2c830783a86ff725..2d346d9a4557a72325a18ae6f89c232e5f629681 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_DATAFILE_COLLECTION_H_
 
 #include <msp/core/meta.h>
+#include <msp/core/maputils.h>
 #include <msp/core/refptr.h>
 #include "loader.h"
 
@@ -178,10 +179,11 @@ public:
        template<typename T>
        void add(const std::string &name, T *d)
        {
-               if(items.count(name))
-                       throw KeyError("Duplicate key in collection", name);
+               typedef typename RemoveConst<T>::Type NCT;
 
-               items[name]=new Item<typename RemoveConst<T>::Type>(d);
+               RefPtr<Item<NCT> > i=new Item<NCT>(d);
+               insert_unique(items, i.get());
+               i.release();
        }
 
        /**
@@ -192,11 +194,9 @@ public:
        {
                typedef typename RemoveConst<T>::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<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
+               const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i);
                if(!item)
                        throw TypeError("Type mismatch on item '"+name+"'");
 
@@ -213,8 +213,7 @@ public:
        {
                typedef typename RemoveConst<T>::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)
                        {
@@ -226,10 +225,11 @@ public:
                                        return d;
                                }
                        }
-                       throw KeyError("Item not found in collection", name);
                }
 
-               const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
+               ItemBase *i=get_item(items, name);
+
+               const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i);
                if(!item)
                        throw TypeError("Type mismatch on item '"+name+"'");