-/* $Id$
-
-This file is part of libmspdatafile
-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/maputils.h>
#include <msp/core/refptr.h>
#include "loader.h"
template<typename S>
struct ItemCreatorBridge: public ItemCreatorBase
{
- virtual S *create(Collection &, const std::string &) const =0;
+ virtual S *create(Collection &, const std::string &) const = 0;
};
template<typename T, typename S, typename C>
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();
}
/**
{
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+"'");
{
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)
{
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+"'");