X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.cpp;h=2333aaf2726082a6214d2b950aa4570ebc1ea64b;hb=2f73f948cd2f4bb0bdcc0f5f81816fb169819879;hp=e60b2009a4fc2c2cebf723ba700e5ab59967a00f;hpb=9f2a99f61887a71a31afb4c56558fcc76be532d1;p=libs%2Fdatafile.git diff --git a/source/collection.cpp b/source/collection.cpp index e60b200..2333aaf 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -1,5 +1,7 @@ #include "collection.h" +using namespace std; + namespace Msp { namespace DataFile { @@ -9,9 +11,41 @@ Collection::~Collection() delete *i; } -bool Collection::contains(const std::string &n) const +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); +} + +CollectionItemTypeBase *Collection::get_type_for_item(const Variant &var) const { - return items.count(n); + 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); } @@ -22,5 +56,32 @@ Collection::Loader::Loader(Collection &c): (*i)->add_to_loader(*this); } + +CollectionItemTypeBase::~CollectionItemTypeBase() +{ + for(vector::iterator i=extractors.begin(); i!=extractors.end(); ++i) + delete *i; +} + +void CollectionItemTypeBase::set_keyword(const string &k) +{ + kwd = k; + if(suffixes.empty()) + add_suffix("."+kwd); +} + +void CollectionItemTypeBase::add_suffix(const string &s) +{ + suffixes.push_back(s); +} + +bool CollectionItemTypeBase::match_name(const string &name) const +{ + for(vector::const_iterator i=suffixes.begin(); i!=suffixes.end(); ++i) + if(name.size()>i->size() && !name.compare(name.size()-i->size(), string::npos, *i)) + return true; + return false; +} + } // namespace DataFile } // namespace Msp