X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fcollection.h;h=be9ae88c491595f925db46e30aeff2daa67deb5f;hp=ec7cde31786adda2049631226231d75731757346;hb=698d4ae13da87b7c53aa96bca99c3deaff397eec;hpb=e93ac3d7eb94842161f0669cf78b4e2173dc0488 diff --git a/source/collection.h b/source/collection.h index ec7cde3..be9ae88 100644 --- a/source/collection.h +++ b/source/collection.h @@ -109,16 +109,27 @@ public: template T &get(const std::string &name) const { - return *get_item(items, name).value::Type> >(); + return extract(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 - T &get(const std::string &); + T &get(const std::string &name) + { + return extract(get_var(name, get_type())); + } private: + const Variant &get_var(const std::string &, const CollectionItemTypeBase *); + + template + T &extract(const Variant &var) const + { + return *var.value::Type> >(); + } + template void collect_items(std::list *objects, std::list *names, std::list *future_names) const { @@ -450,33 +461,6 @@ public: }; -template -T &Collection::get(const std::string &name) -{ - typedef RefPtr::Type> RPNCT; - - ItemMap::iterator i = items.find(name); - if(i!=items.end()) - return *i->second.value(); - - if(CollectionItemTypeBase *type = get_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).value(); -} - template CollectionItemType &Collection::add_type() {