delete *i;
}
+const Variant &Collection::get_var(const string &name, const CollectionItemTypeBase *type)
+{
+ ItemMap::iterator i = items.find(name);
+ if(i!=items.end())
+ return i->second;
+
+ if(type)
+ {
+ bool loaded = false;
+ if(type->can_create())
+ {
+ type->create_item(*this, name);
+ loaded = items.count(name);
+ }
+ for(SourceList::iterator j=sources.begin(); (!loaded && j!=sources.end()); ++j)
+ {
+ (*j)->load(*this, *type, name);
+ loaded = items.count(name);
+ }
+ }
+
+ return get_item(items, name);
+}
+
void Collection::add_source(CollectionSource &s)
{
sources.push_back(&s);
template<typename T>
T &get(const std::string &name) const
{
- return *get_item(items, name).value<RefPtr<typename RemoveConst<T>::Type> >();
+ return extract<T>(get_item(items, name));
}
/** Gets a typed object from the collection. If the name is not found,
automatic creation with the type's creator function (if defined) or from
sources (if present) is attempted. */
template<typename T>
- T &get(const std::string &);
+ T &get(const std::string &name)
+ {
+ return extract<T>(get_var(name, get_type<T>()));
+ }
private:
+ const Variant &get_var(const std::string &, const CollectionItemTypeBase *);
+
+ template<typename T>
+ T &extract(const Variant &var) const
+ {
+ return *var.value<RefPtr<typename RemoveConst<T>::Type> >();
+ }
+
template<typename T>
void collect_items(std::list<T *> *objects, std::list<std::string> *names, std::list<std::string> *future_names) const
{
};
-template<typename T>
-T &Collection::get(const std::string &name)
-{
- typedef RefPtr<typename RemoveConst<T>::Type> RPNCT;
-
- ItemMap::iterator i = items.find(name);
- if(i!=items.end())
- return *i->second.value<RPNCT>();
-
- if(CollectionItemTypeBase *type = get_type<T>())
- {
- bool loaded = false;
- if(type->can_create())
- {
- type->create_item(*this, name);
- loaded = items.count(name);
- }
- for(SourceList::iterator j=sources.begin(); (!loaded && j!=sources.end()); ++j)
- {
- (*j)->load(*this, *type, name);
- loaded = items.count(name);
- }
- }
-
- return *get_item(items, name).value<RPNCT>();
-}
-
template<typename T>
CollectionItemType<T> &Collection::add_type()
{