X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.cpp;h=fbe894a8bb4b073c0baa227655bd2d3ecf3781e3;hb=bcbe8b90de68e18260313b8f0e8a8dd9c7661903;hp=87982e8f4baa5df80ec1dbe257e33ba4b83af594;hpb=698d4ae13da87b7c53aa96bca99c3deaff397eec;p=libs%2Fdatafile.git diff --git a/source/collection.cpp b/source/collection.cpp index 87982e8..fbe894a 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -35,11 +35,70 @@ const Variant &Collection::get_var(const string &name, const CollectionItemTypeB return get_item(items, name); } +void Collection::gather_items(list *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)) + { + if(vars) + vars->push_back(&i->second); + if(names) + names->push_back(i->first); + } + + if(include_sources && names) + gather_names_from_sources(*names, type); +} + +unsigned Collection::get_status(const string &name, const CollectionItemTypeBase &type) const +{ + ItemMap::const_iterator i = items.find(name); + if(i==items.end()) + { + for(SourceList::const_iterator j=sources.begin(); j!=sources.end(); ++j) + if((*j)->is_loadable(type, name)) + return 2; + return 0; + } + + return type.check_item_type(i->second); +} + +CollectionItemTypeBase *Collection::get_type_for_item(const Variant &var) const +{ + for(TypeList::const_iterator i=types.begin(); i!=types.end(); ++i) + if((*i)->check_item_type(var)) + return *i; + return 0; +} + void Collection::add_source(CollectionSource &s) { sources.push_back(&s); } +void Collection::gather_names_from_sources(list &names, const CollectionItemTypeBase &type) const +{ + for(SourceList::const_iterator i=sources.begin(); i!=sources.end(); ++i) + { + std::list available_names = (*i)->get_names(type); + for(std::list::iterator j=available_names.begin(); j!=available_names.end(); ++j) + if(!items.count(*j)) + names.push_back(*j); + } +} + +void Collection::load_items_from_sources(const CollectionItemTypeBase &type) +{ + for(SourceList::const_iterator i=sources.begin(); i!=sources.end(); ++i) + { + std::list available_names = (*i)->get_names(type); + for(std::list::iterator j=available_names.begin(); j!=available_names.end(); ++j) + if(!items.count(*j)) + (*i)->load(*this, type, *j); + } +} + Collection::Loader::Loader(Collection &c): coll(c) @@ -49,13 +108,10 @@ Collection::Loader::Loader(Collection &c): } -CollectionItemTypeBase::CollectionItemTypeBase(): - tag(0) -{ } - CollectionItemTypeBase::~CollectionItemTypeBase() { - delete tag; + for(vector::iterator i=extractors.begin(); i!=extractors.end(); ++i) + delete *i; } void CollectionItemTypeBase::set_keyword(const string &k)