]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/collection.cpp
More flexible system for handling base classes in Collection
[libs/datafile.git] / source / collection.cpp
index c1d72ca8e3b82e2f3b24b2d550d089efc8e2967c..2333aaf2726082a6214d2b950aa4570ebc1ea64b 100644 (file)
@@ -1,30 +1,87 @@
 #include "collection.h"
 
+using namespace std;
+
 namespace Msp {
 namespace DataFile {
 
 Collection::~Collection()
 {
-       for(ItemMap::iterator i = items.begin(); i!=items.end(); ++i)
-               delete i->second;
-       for(ItemKeywordSeq::iterator i = keywords.begin(); i!=keywords.end(); ++i)
-               delete *i;
-       for(ItemCreatorSeq::iterator i = creators.begin(); i!=creators.end(); ++i)
+       for(TypeList::iterator i = types.begin(); i!=types.end(); ++i)
                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
+{
+       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)
 {
-       return items.count(n);
+       sources.push_back(&s);
 }
 
 
 Collection::Loader::Loader(Collection &c):
        coll(c)
 {      
-       for(ItemKeywordSeq::const_iterator i = coll.keywords.begin(); i!=coll.keywords.end(); ++i)
+       for(TypeList::const_iterator i = coll.types.begin(); i!=coll.types.end(); ++i)
                (*i)->add_to_loader(*this);
 }
 
+
+CollectionItemTypeBase::~CollectionItemTypeBase()
+{
+       for(vector<ExtractorBase *>::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<string>::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