]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/collection.h
Bugfixes
[libs/datafile.git] / source / collection.h
index 6ddbe6ed65c980d035b30160ad1eca18c0390f1f..5fcaab34f35345406de07e372a70cb972efc2a67 100644 (file)
@@ -105,12 +105,15 @@ private:
                virtual ~ItemCreatorBase() { }
 
                template<typename S>
-               S *create(Collection &coll, const std::string &name)
+               bool create(Collection &coll, const std::string &name, S *&ptr)
                {
                        ItemCreatorBridge<S> *creator=dynamic_cast<ItemCreatorBridge<S> *>(this);
                        if(creator)
-                               return creator->create(coll, name);
-                       return 0;
+                       {
+                               ptr=creator->create(coll, name);
+                               return true;
+                       }
+                       return false;
                }
        };
 
@@ -198,7 +201,7 @@ public:
        Gets an object of a specific type from the collection.
        */
        template<typename T>
-       T &get(const std::string &name) const
+       T *get(const std::string &name) const
        {
                typedef typename RemoveConst<T>::Type NCT;
 
@@ -210,7 +213,7 @@ public:
                if(!item)
                        throw TypeError("Item '"+name+"' is not of correct type");
 
-               return *item->data;
+               return item->data;
        }
 
        /**
@@ -219,7 +222,7 @@ public:
        invoked.
        */
        template<typename T>
-       T &get(const std::string &name)
+       T *get(const std::string &name)
        {
                typedef typename RemoveConst<T>::Type NCT;
 
@@ -227,12 +230,15 @@ public:
                if(i==items.end())
                {
                        for(ItemCreatorSeq::iterator j=creators.begin(); j!=creators.end(); ++j)
-                               if(NCT *d=(*j)->create<NCT>(*this, name))
+                       {
+                               NCT *d=0;
+                               if((*j)->create(*this, name, d))
                                {
                                        // We already know that the item didn't exist yet
                                        items[name]=new Item<NCT>(d);
-                                       return *d;
+                                       return d;
                                }
+                       }
                        throw KeyError("Item '"+name+"' not found in collection");
                }
 
@@ -240,7 +246,7 @@ public:
                if(!item)
                        throw TypeError("Item '"+name+"' is not of correct type");
 
-               return *item->data;
+               return item->data;
        }
 
        /**