]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/collection.cpp
Improve the API for future objects
[libs/datafile.git] / source / collection.cpp
index 2a567b58ce4af5271f553b58611ee8a43e29dd5c..5ac12ab7d366c3406cfc59206b42b166875557d5 100644 (file)
@@ -1,37 +1,75 @@
-/* $Id$
-
-This file is part of libmspdatafile
-Copyright © 2006  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #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
+void Collection::add_future(const string &name)
 {
-       return items.count(n);
+       for(TypeList::const_iterator i=types.begin(); i!=types.end(); ++i)
+               if((*i)->match_name(name))
+               {
+                       insert_unique(items, name, (*i)->create_future());
+                       return;
+               }
+}
+
+void Collection::add_future_with_keyword(const string &name, const string &keyword)
+{
+       for(TypeList::const_iterator i=types.begin(); i!=types.end(); ++i)
+               if((*i)->get_keyword()==keyword)
+               {
+                       insert_unique(items, name, (*i)->create_future());
+                       return;
+               }
+
+       throw runtime_error("Collection::add_future_with_keyword");
 }
 
 
 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():
+       tag(0)
+{ }
+
+CollectionItemTypeBase::~CollectionItemTypeBase()
+{
+       delete tag;
+}
+
+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