]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/collection.h
Support const types with Collection properly
[libs/datafile.git] / source / collection.h
index 3a3b90e57398ec3ff99221b09f85143a37330f02..85ca843f5e1aba552ab2c2ed26a7241d30675d0b 100644 (file)
@@ -31,6 +31,14 @@ 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.
@@ -167,7 +175,10 @@ private:
        ItemKeywordSeq keywords;
        ItemCreatorSeq creators;
 
+       Collection(const Collection &);
+       Collection &operator=(const Collection &);
 public:
+       Collection() { }
        virtual ~Collection();
 
        /**
@@ -180,7 +191,7 @@ public:
                if(items.count(name))
                        throw KeyError("Duplicate key '"+name+"' in collection");
 
-               items[name]=new Item<T>(d);
+               items[name]=new Item<typename RemoveConst<T>::Type>(d);
        }
 
        /**
@@ -189,11 +200,13 @@ public:
        template<typename T>
        T &get(const std::string &name) const
        {
+               typedef typename RemoveConst<T>::Type NCT;
+
                ItemMap::const_iterator i=items.find(name);
                if(i==items.end())
                        throw KeyError("Item '"+name+"' not found in collection");
 
-               const Item<T> *item=dynamic_cast<const Item<T> *>(i->second);
+               const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
                if(!item)
                        throw TypeError("Item '"+name+"' is not of correct type");
 
@@ -208,20 +221,22 @@ public:
        template<typename T>
        T &get(const std::string &name)
        {
+               typedef typename RemoveConst<T>::Type NCT;
+
                ItemMap::const_iterator i=items.find(name);
                if(i==items.end())
                {
                        for(ItemCreatorSeq::iterator j=creators.begin(); j!=creators.end(); ++j)
-                               if(T *d=(*j)->create<T>(*this, name))
+                               if(NCT *d=(*j)->create<NCT>(*this, name))
                                {
                                        // We already know that the item didn't exist yet
-                                       items[name]=new Item<T>(d);
+                                       items[name]=new Item<NCT>(d);
                                        return *d;
                                }
                        throw KeyError("Item '"+name+"' not found in collection");
                }
 
-               const Item<T> *item=dynamic_cast<const Item<T> *>(i->second);
+               const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
                if(!item)
                        throw TypeError("Item '"+name+"' is not of correct type");