]> git.tdb.fi Git - libs/datafile.git/commitdiff
Add support for fallback collections
authorMikko Rasa <tdb@tdb.fi>
Fri, 7 Dec 2012 10:28:15 +0000 (12:28 +0200)
committerMikko Rasa <tdb@tdb.fi>
Fri, 7 Dec 2012 10:28:15 +0000 (12:28 +0200)
source/collection.cpp
source/collection.h

index fbe894a8bb4b073c0baa227655bd2d3ecf3781e3..070991948d33d7315074ec6bb480cc06344d45cc 100644 (file)
@@ -5,6 +5,10 @@ using namespace std;
 namespace Msp {
 namespace DataFile {
 
+Collection::Collection():
+       fallback(0)
+{ }
+
 Collection::~Collection()
 {
        for(TypeList::iterator i = types.begin(); i!=types.end(); ++i)
@@ -30,6 +34,16 @@ const Variant &Collection::get_var(const string &name, const CollectionItemTypeB
                        (*j)->load(*this, *type, name);
                        loaded = items.count(name);
                }
+               if(!loaded && fallback)
+               {
+                       for(TypeList::const_iterator j=fallback->types.begin(); j!=fallback->types.end(); ++j)
+                               if((*j)->is_same_type(*type))
+                               {
+                                       if(fallback->get_status(name, **j))
+                                               return fallback->get_var(name, *j);
+                                       break;
+                               }
+               }
        }
 
        return get_item(items, name);
@@ -99,6 +113,11 @@ void Collection::load_items_from_sources(const CollectionItemTypeBase &type)
        }
 }
 
+void Collection::set_fallback(Collection *f)
+{
+       fallback = f;
+}
+
 
 Collection::Loader::Loader(Collection &c):
        coll(c)
index bbde9f904dfd3e8415ae0e0a8dc0ae8b2d9db641..ee7eb469cf53d5ee1ab8d9cd06a0b88688511b06 100644 (file)
@@ -45,6 +45,11 @@ method for details.
 
 Collections can have sources for loading objects on demand.  Automatic loading
 only works on a non-const Collection.  See class CollectionSource for details.
+
+A fallback collection can be designated as another way of loading items that
+are not present.  Items retrieted from the fallback collection are shared
+between the collections, and are only deleted when all collections in the chain
+have been destroyed.
 */
 class Collection
 {
@@ -86,11 +91,12 @@ private:
        TypeList types;
        ItemMap items;
        SourceList sources;
+       Collection *fallback;
 
        Collection(const Collection &);
        Collection &operator=(const Collection &);
 public:
-       Collection() { }
+       Collection();
        virtual ~Collection();
 
        /** Adds an object into the collection.  The name must not pre-exist.  The
@@ -262,6 +268,11 @@ private:
        void gather_names_from_sources(std::list<std::string> &, const CollectionItemTypeBase &) const;
 
        void load_items_from_sources(const CollectionItemTypeBase &);
+
+protected:
+       /** Sets a fallback collection, which will be consulted if an item is not
+       found. */
+       void set_fallback(Collection *);
 };
 
 template<typename T>
@@ -309,6 +320,7 @@ public:
        const std::string &get_keyword() const { return kwd; }
        void add_suffix(const std::string &);
        bool match_name(const std::string &) const;
+       virtual bool is_same_type(const CollectionItemTypeBase &) const = 0;
        virtual bool check_item_type(const Variant &) const = 0;
        virtual void add_to_loader(Collection::Loader &) const = 0;
        virtual bool can_create() const = 0;
@@ -423,6 +435,9 @@ public:
                return *this;
        }
 
+       virtual bool is_same_type(const CollectionItemTypeBase &other) const
+       { return dynamic_cast<const CollectionItemType<T> *>(&other); }
+
        virtual bool check_item_type(const Variant &var) const
        { return var.check_type<RefPtr<T> >(); }