X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.cpp;h=f86adf65c71ace3370e7a57537eaa4fe6cd8243a;hb=fbf76ed98dbd2cca6785efe2dd489d717fa5dce6;hp=9f135f0c0ed8eab31c6ffe730b23fd683b69e98e;hpb=5e677b2b3eeb2b3c41216a329f7b1363aade0aed;p=libs%2Fdatafile.git diff --git a/source/collection.cpp b/source/collection.cpp index 9f135f0..f86adf6 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -16,11 +16,27 @@ Collection::~Collection() delete *i; } +void Collection::add_var(const string &name, const CollectionItemTypeBase *type, const Variant &var) +{ + insert_unique(items, name, var); + if(type) + type->notify_item(*this, name, var); +} + const Variant &Collection::get_var(const string &name, const CollectionItemTypeBase *type) +{ + const Variant *var = find_var(name, type); + if(var) + return *var; + + throw key_error(name); +} + +const Variant *Collection::find_var(const string &name, const CollectionItemTypeBase *type) { ItemMap::iterator i = items.find(name); if(i!=items.end()) - return i->second; + return &i->second; if(type) { @@ -38,13 +54,14 @@ const Variant &Collection::get_var(const string &name, const CollectionItemTypeB if(!loaded && fallback) if(CollectionItemTypeBase *fb_type = fallback->get_type(*type)) if(fallback->get_status(name, *fb_type)) - return fallback->get_var(name, fb_type); + return fallback->find_var(name, fb_type); } - return get_item(items, name); + i = items.find(name); + return (i!=items.end() ? &i->second : 0); } -void Collection::gather_items(list *vars, list *names, const CollectionItemTypeBase &type, bool include_sources) const +void Collection::gather_items(vector *vars, list *names, const CollectionItemTypeBase &type, bool include_sources) const { for(ItemMap::const_iterator i=items.begin(); i!=items.end(); ++i) if(type.check_item_type(i->second))